Верстка писем без боли

но это не точно

Дратути, я Исмаил

Frontend в GreatSimple

Твитур: @Di_Ed_Seagull

Телега:  @caspianseagull

О чем расскажу

Почему никто не любит их верстать

Кто виноват и что делать

Обезбаливающее

Зачем нужны html-письма

Второе пришествие PUG

Тестирование

Жизнь после редактора

Email.html

Email.html  что, как и зачем?

Email marketing

Transactional emails

Продвижение и конверсия

Реакции и сценарии

Email.html  Кому оно надо?

E-commerce

Онлайн-издания

Электронные документы

Блоги, рассылки

Кто угодно

Боль и страдания

Боль и страдания   приложения

Веб-клиенты

Смартфоны

Десктоп

Браузеры и сервисы

Веб-клиенты + android, iOS, Windows Phone (Outlook)

Windows, Linux, Mac OS

Боль и страдания  препроцессинг

POP, IMAP

Exchange, Domino

Preprocessor

pure html

Email client / service

RENDER ENGINE

processed html

FRONTEND

Email server

Local

Web-based

Боль и страдания  рендер

Trident (IE, Outlook)

Gecko (Firefox, thunderbird)

WebKit (Apple Mail, Web-based)

NotesRichText

Microsoft Word (Outlook 2007)

Боль и страдания  что читать?

CampaignMonitor

MailChimp

Google

Microsoft

Как верстать?

Как верстать?  Основные правила

Ширина 600 px.

Таблицы в таблицах в таблицах в таблицах...

Инлайновый CSS и атрибуты

!important

Шрифт от 14px

Как верстать?  Что нельзя

Javascript низя

Анимации низя

Шрифты низя

<link href="style.css" /> низя

SVG низя

льзя

Как верстать?  Что можно

Адаптив

Сетки

Видео

Как верстать?   PE & GD

Progressive

enhancement

Graceful

degradation

Как верстать?   Условные комментарии

<!--[if gte mso 9]>

  <style>
    #outlook a {padding: 0; }
  </style>

<![endif]-->

Как верстать  outlook specific css

mso-line-height-rule: exactly;

Сдвиг относительно базовой линии

-ms-interpolation-mode: bicubic;

Отключает обнуление line-height

Фикс ресайза изображений

mso-table-lspace: 0px;

Как верстать  client specific css

.ExternalClass

Фиксирует минимальный размер шрифта в iOS

#outlook a

Приписывается к каждому стилю в Outlook

Определяет стили ссылки "посмотреть в браузере" (2007 / 10 / 13)

-webkit-text-size-adjust: 100%;

Аккуратный ресайз изображений

-ms-interpolation-mode: bicubic;

Как верстать  сетки и адаптив

TD

TD

TD

Table

TR

table td.col-3 { width: 200px;  /* 600 / 3 */ }

Есть два вьюпорта

Десктоп и мобильники

Как верстать  сетки и адаптив

TD

Table

TR

TD

@media (max-width: 480px) {

 

    table td.col-3 {

        ...

        display: block !important;

        width: 100% !important;

        ...

    }

 

}

Email.html  Отступы

Padding вместо margin

Блочная модель у TD

&nbsp; и line-height

Изображения

Cellpadding

Автоматизируем

Автоматизируем  зачем?

БЛЭД ЭМЭЙЛЫ

Автоматизируем  Фреймворки

ZURB Emails

MJML

React-html-email

Cerberus

Antwort

Автоматизируем  Фреймворки

Главная задача

Разделение контента и контекста

Автоматизируем  Фреймворки

Черные ящики

XML-разметка (вкусовщина)

Диктуют стили

Привирают

:)

Автоматизируем  NPM

Gulp (сборка и автоматизация)

Gulp-css-inline (инлайновые стили)

Browser-sync (тестирование)

Cheerio (jQuery для Node.js)

PUG (шаблонизатор)

PUG

2

Pug 2  почему

Нет XML-разметки

Mixins, extends, includes

JS-friendly

Полноценный шаблонизатор

Filters

Pug 2  mixins

mixin section(options)
  .section&attributes(attributes)
    h1= options.title

    each item in options.items
      +section__item(item)


mixin section__item(item)
  .section__item
    h2= item.title
    ...
mixin section(options)
  .section&attributes(attributes)
    h1= options.title

    each item in options.items
      +section__item(item)


mixin section__item(item)
  .section__item
    h2= item.title
    ...
mixin section(options)
  .section&attributes(attributes, {...})
    h1= options.title

    each item in options.items
      +section__item(item)


mixin section__item(item)
  .section__item
    h2= item.title
    ...
mixin section(options)
  .section&attributes(attributes)
    h1= options.title

    each item in options.items
      +section__item(item)


mixin section__item(item)
  .section__item
    h2= item.title
    ...

Pug 2  mixins

mixin section(arg1, ...args)
  .section&attributes(attributes)
    h1= options.title

    if block
      block


+section(arg1, arg2, arg3)
  article
    h1 Extendable Mixins

Pug 2  includes

html
  head
    ...

  body
    include modules/header
    include modules/promo
    include modules/cart
    include modules/review
    include modules/footer
[.pug]

Pug 2  includes

html
  head
    style
      include styles/main.css
      
  body
    script 
      include module1.js
    
    include images/logo.svg

Pug 2  js-friendly

mixin user(user)
  - let getAge = () => `${user.age} y.o.`
  
  .greeting= `Hello ${user.name}`
  
  .age= getAge()

  ul.parents
    each parent in user.parents
      li.name= parent.name
      ...

Pug 2  filters

html
  head
    style
      include:stylus styles/main.styl
      
  body
    script 
      include:babel js/module1.js
    
    article
      include:markdown data/article.md

Pug 2  Filters

JSTRANSFORMERS

Тестирование

Тестирование

Nodemailer и др. библиотеки

Litmus (дорого, неделя триала)

Онлайн-сервисы

Pixel-perfect

Большое плавание

Большое плавание  Сервисы рассылок

MailChimp

SendGrid

CampaignMonitor

Mailgun

Amazon SES

Большое плавание  E-Commerce

Shopify

WooCommerce

Magento

Prestashop

Big cartel

Большое плавание  Интеграция

Синхронизация базы покупателей

Webhook на действия покупателей

Описание сценариев в EDS

Рассылка маркетинговых писем по базе

Транзакции покупателя в магазине

Настройка групп подписок

A / B тестирование

Большое плавание  Автоматизация

Template language

API

Теги

Аналитика

Что почитать

Обзор css свойств в клиентах: MailChimp, CampaignMonitor

Итоги

Верстать письма не страшно

Но все равно неприятно

Автоматизация спасает

Проблемы изучены и зафиксированы

Маркетинг важнее визуала

Идеально не получится

Пасиб

Верстка писем без боли

By Исмаил

Верстка писем без боли

О верстке писем ходят легенды. Верстальщиков, столкнувшихся с этим злом, жалеют, их родным соболезнуют, а ночью не могут сомкнуть глаза от ужаса, с которым столкнулись их несчастные коллеги. К такому раскладу событий я готовился, когда узнал, что мне предстоит работать над коммерческим набором шаблонов писем для интернет-магазинов. Но оказалось, что не так страшен черт, как его малюют. Верстальщику приходят на помощь его друзья: системы сборки, препроцессоры и прямые руки. Я расскажу, как избавиться от боли во время верстки писем, как можно облегчить и ускорить свою работу, каких подводных камней стоит опасаться, и что происходит с письмом после верстки.

  • 1,551