Как сделать персонализированную email рассылку

Обновлено: 06.07.2024


У разработчика, который впервые столкнулся с генерированием электронных писем, практически нет шансов написать приложение, которое будет делать это корректно. Около 40 % писем, генерируемых корпоративными приложениями, имеют те или иные нарушения стандартов, и, как следствие, проблемы с доставкой и отображением. На это есть причины: электронная почта технически гораздо сложнее, чем веб, работа почты регулируется несколькими сотнями стандартов и несчетным количеством общепринятых (и не очень) практик, а почтовые клиенты отличаются разнообразием и непредсказуемостью. Тестирование может заметно улучшить ситуацию, но материалов, посвященных тестированию почты, практически нет.

Какие бывают электронные письма

Приложение может генерировать различные виды писем. Их можно классифицировать по нескольким категориям. По способу выбора получателей: триггерные — выборочные — групповые. По назначению: транзакционные — маркетинговые — служебные. К разным типам писем можно предъявлять разные требования и применять разные сценарии тестирования.

Триггерные письма генерируются в ответ на какие-либо события, например, действия пользователя или изменения статуса каких-либо системных объектов. Они генерируются приложением, а потому наиболее интересны в плане тестирования. Триггерные письма могут быть как транзакционными, так и маркетинговыми.

Выборочные письма отправляются в динамическую выборку пользователей, соответствующих каким-либо критериям.

Групповые письма отправляются известной группе получателей, например, всем пользователям или партнерам. Выборочные и групповые письма чаще всего являются маркетинговыми, отправка таких писем инициируется вручную или по расписанию.

Транзакционные письма генерируются в процессе совершения пользователем какого-либо действия. К таким письмам относятся, например, счета, билеты или уведомления о статусе доставки, письма с кодом восстановления доступа и т.д. Транзакционные письма всегда являются триггерными. Для них важна максимальная совместимость, значит, они должны быть максимально просты, а тестировать их необходимо на большом количестве клиентов.

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

Кроме того, могут быть служебные письма, генерируемые для сотрудников, для автоматических или автоматизированных систем CRM, журналирования, аудита или DWH. Такие письма являются триггерными, а это значит, что они также являются частью приложения и должны проходить тестирование.

Кто участвует в процессе тестирования и контроля

Структура почты похожа на огромный айсберг, и в ней есть два уровня. Существует более сотни различных стандартов, регулирующих почту, но практически все они относятся к одному из этих двух уровней:

Надводная часть айсберга — это само письмо. Базовая структура письма определяется стандартом RFC 5322. Письмо состоит из служебных заголовков и одной или нескольких частей с данными. В данных может быть текст письма в формате plain text и/или HTML, инлайновые изображения или вложения практически любого типа.

Интерфейс почтовой инфраструктуры и границы тестируемого приложения

Определение тестируемых параметров

При тестировании каждого приложения важно выделить все используемые им почтовые инфраструктуры (их может быть несколько), и для каждой инфраструктуры выделить используемые интерфейсы (их тоже может быть несколько для каждой инфраструктуры). Для каждого интерфейса как можно точнее определяется состав и формат передаваемых в него данных, например: текст письма в TEXT/HTML, текст письма в TEXT/PLAIN, тема письма, имя получателя, адрес получателя, имя отправителя, адрес отправителя письма (RFC5321.From), адрес отправителя SMTP-конвера (RFC5322.mailfrom). Далее разрабатывается набор требований для каждого параметра (представления, кодировки, граничные значения и т.д.), определяются методы контроля каждого из параметров (каким способом можно сравнить фактический результат с ожидаемым).

Типичная структура генерирующего приложения

За генерирование письма и данных в нем, как правило, отвечает тот самый продукт, который мы тестируем. Обычно это серверное (но иногда клиентское) приложение. Оно определяет структуру письма, часть служебных заголовков, форматы инкапсуляции данных, представления строк и кодировки текста. Простым примером такого приложения может послужить скрипт, который формирует письмо и вызывает функцию mail() .

Основные элементы приложения, которые необходимо контролировать:

  • код, отвечающий за генерирование заголовков и/или структуры письма, если структура письма генерируется динамически, и/или статический шаблон письма, описывающий его структуру;
  • верстку HTML-части письма (в идеале, это отдельная сущность или часть шаблона/макета письма, но может быть зашита в код приложения);
  • подстановку данных приложения в письмо (или в шаблон письма);
  • интеграцию приложения с инфраструктурой доставки письма, корректность параметров, передаваемых в интерфейс инфраструктуры.

Что и когда тестировать

Хотим мы этого или нет, но айсберг надо тестировать весь. Можно выделить несколько основных компонентов, требующих тестирования:

1. Инфраструктура доставки

Упор в тестировании следует делать на: доставляемость письма; корректность DNS-записей, включая PTR/FCrDNS, MX- и A-записи; параметры SMTP-протокола (HELO, использование TLS); авторизацию письма (SPF/DKIM/DMARC); адреса SMTP-конверта (если они не управляются приложением); корректность обработки входных параметров интерфейса инфраструктуры; отслеживание, учет и обработку не доставленных писем.

Надо тестировать инфраструктуру при начальном внедрении и каждый раз, когда вносятся изменения в саму инфраструктуру (меняется конфигурация MTA, DNS или сети) или интерфейс отправки письма; используется новый домен, сеть или API; существенно меняются характеристики отправляемых писем, такие как их язык, размер или количество. По опыту, инфраструктура имеет склонность меняться без объявления войны, поэтому базовые тесты следует проводить периодически, даже если нет информации о каких-либо изменениях.

К составлению плана и чек-листов тестирования инфраструктуры можно и нужно привлекать сетевого инженера и deliverability-специалиста.

2. Генерирующее приложение

Следует контролировать адреса SMTP-конверта (если они управляются приложением, т.е. передаются в интерфейс — envelope-from, envelope-to), значения служебных заголовков письма (Date, Message-ID, List-Unsubscribe, Auto-Submitted и т.п.), авторизацию письма (DKIM/DMARC), MIME-кодировки (base64, quoted-printable), общую правильность формата письма, например отсутствие не-ASCII символов в заголовках, состав подставляемых данных, корректность срабатывания триггеров, механизмы отписки, механизмы трекинга письма и сбора статистики (postmaster-заголовки, например, Feedback-ID или X-Mailru-Msgtype, а также трекинговые пиксели).

Тестировать приложение нужно при его разработке, при изменении всех его связанных компонентов, отвечающих за генерирование и хранение данных, при существенных изменениях шаблонов писем, при изменении используемой инфраструктуры или интерфейса к ней, а также в рамках общих регрессов.

3. Структурный и вёрсточный шаблоны письма (могут быть частью генерирующего приложения или разрабатываются отдельно)

Проверяется структура письма (Content-Type, Content-Disposition, вложенность Multipart-частей письма, кодировки текста, строковые параметры), значение целевых и отображаемых заголовков (From, To, Reply-to, Subject), отображение письма в списке писем и при чтении в различных интерфейсах, микроформаты (например, что событие календаря распознается как событие календаря, или авиабилет как авиабилет), брендирование.

Шаблоны писем следует тестировать каждый раз при внесении хотя бы малейших изменений, а также отдельно, например, в ситуации, когда письма попадают в приложение до того, как готова серверная часть.

К составлению чек-листа по тестированию шаблона письма рекомендуется привлечь email-маркетолога и deliverability-специалиста.

Базовые требования при проверке инфраструктуры


На формирование некоторых параметров, например, авторизацию, доставляемость и попадание в спам интегрально влияют все компоненты, однако для их контроля обычно есть отдельные оперативные инструменты — DMARC и FBL-отчеты, API сервисов postmaster, инструменты трекинга писем, статистика доставки. Тестирование должно учитывать уровень внедрения инструментария оперативного мониторинга в компании — например, при отсутствии оперативного контроля DMARC-отчетов следует регулярно тестировать авторизацию писем, при отсутствии оперативного контроля доставляемости — регулярно проверять, как и куда попадают письма, даже если никакой разработки, связанной с отправкой писем, не ведется.


Требования к авторизации

Проверить прохождение SPF, DKIM, DMARC обычно можно по заголовку Authentication-Results на сервере получателя.

Проверьте прохождение DMARC на основных почтовых службах. Проверьте получение DMARC-отчетов, идентифицируйте и устраните проблемы с прохождением SPF и DKIM для всех IP-адресов вашей инфраструктуры.

Проверка генерирующего приложения

Требования к почтовым адресам

Адреса конверта
Проверку генерирующего приложения начнем с адресов в SMTP-конверте.

Адреса конверта — это адреса уровня почтовой инфраструктуры. Они не видны пользователю, но важны для доставки, потому что в какой ящик попадёт письмо, определяется именно адресом конверта.

Адрес получателя в конверте (envelope-to, он же RCPT TO:) — это адрес, на который будет реально доставлено письмо.

Эти адреса либо непосредственно видны пользователю, либо используются при ответе на письмо.

Адрес отправителя (заголовок From:) — это адрес и имя отправителя, отображаемые в списке писем и при чтении письма. Проверяем, что:

  • Должен содержать e-mail получателя (иначе это пугает получателя письма и настораживает антиспам).
  • В идеале, должен содержать имя получателя. Но если имя неизвестно или сомнительно (например, адрес еще не подтвержден), лучше его не указывать (кто-то может ввести чужой адрес с плохим именем, а получатель может на вас обидеться).

Требования к заголовкам писем

Реальная кодировка текста должна совпадать с указанной в заголовке. Желательно использовать одну кодировку во всех заголовках и частях письма. Рекомендуется использовать UTF-8 как широко поддерживаемую. Кодировка указывается в заголовках Content-Type и в теге HTML-части.

Заголовки From:, Message-ID: и Date: должны формироваться непосредственно в скрипте отправки письма (а по стандартам — вместе с текстом письма) и обязательно в правильном формате. В случае их отсутствия или некорректности формирования, эти заголовки может добавить один из транзитных серверов, что приводит к нарушению целостности DKIM-сигнатуры.


Требования к структуре письма

Для HTML-части письма желательно формировать альтернативную — текстовую (plain) часть. Также необходимо проверять соответствие и читаемость plain text-части письма (при её наличии) и общую структуру письма.

multipart/alternative
— text/plain
— text/html

Порядок частей важен, text/plain должен идти ДО text/html или multipart/related. Это нужно для того, чтобы по умолчанию показывалась HTML-часть, и только если её отображение по каким-то причинам недоступно — отображалась plain-часть.

При наличии в письме инлайн-картинок его структура должна выглядеть следующим образом:

multipart/alternative
— text/plain
— multipart/related
—— text/html
—— image/… (инлайн-картинка)
—— image/… (инлайн-картинка)

Инлайн-картинки должны иметь Content-Disposition: inline и находиться строго внутри multipart/related-части.

В самом сложном случае, когда имеются и инлайновые изображения, и вложенные файлы, письмо имеет следующую структуру:

multipart/mixed
— multipart/alternative
—— text/plain
—— multipart/related
——— text/html
——— image/png
——— image/png

— application/octet-string (content-disposition: attachment)
— application/octet-string (content-disposition: attachment)

(multipart/related- и multipart/alternative-части должны быть закрыты до аттачей, аттачи относятся к внешней multipart/mixed-части)



Требования к URI


Требования к верстке письма

Почему верстать письма так сложно?

Почтовые клиенты так или иначе показывают пользовательский контент в рамках своего интерфейса. Потенциально это может приводить к различным проблемам безопасности — межсайтовому скриптингу (XSS, Crossite scripting), подмене интерфейса (interface spoofing), DOM clobbering, деанонимизации пользователя / утечке информации (например, IP-адреса пользователя или куки через внешние запросы) и т.д., поэтому любой почтовый сервис и почтовое приложение имеет ту или иную степень защиты от каждого класса атак. К сожалению, нет единого подхода к организации этой защиты. Она может быть организована через:

  • изолированные ограниченные фреймы,
  • фильтрацию тегов и/или атрибутов,
  • ограничения на абсолютное позиционирование,
  • запрет или ограничение на использование блочных стилей (что критично для адаптивной верстки),
  • запрет на внешние элементы по умолчанию (т.е. загрузка внешних изображений требует разрешения пользователя) или использование прокси для доступа к ним,
  • конвертацию HTML-писем в другой промежуточный формат (например Microsoft Exchange / Outlook используют RTF, из-за чего добиться адекватного отображения элементов в Outlook обычными методами может быть чрезвычайно сложно),
  • запрет или ограничение на использование форм или их отдельных элементов.

Даже корректно сформированное письмо может по-разному отображаться в разных интерфейсах из-за особенностей их реализации и фильтрации содержимого письма.

При наличии ошибок в формате письма поведение становится полностью непредсказуемым. Например, в почтовых клиентах может быть разное поведение при неправильных URI, по-разному обрабатывается некорректное форматирование заголовков, по-разному работает автоопределение кодировки, если она не указана или указана неверно. Поэтому письмо надо обязательно посмотреть в разных интерфейсах: корректное отображение письма в одном интерфейсе не говорит о том, что оно составлено правильно (на самом деле, даже корректное отображение письма во всех интерфейсах не гарантирует отсутствие проблем с отображением в будущем).

Необходимо обратить внимание на следующие моменты:


Проведение сплит-тестов

Маркетинговые исследования выходят за рамки этой статьи, но следует упомянуть несколько основных моментов, существенно влияющих на качество писем.

Рассылка имеет цель, поэтому она должна брать качеством, а не количеством (как это делают спамеры). Рассылка в обязательном порядке должна быть сегментирована. При проведении рекламной кампании нужно точно знать, кто попадает в сегментную выборку, зачем ему предлагаемый продукт и что хочется донести.

Выражаю огромную благодарность за помощь в подготовке статьи Владимиру Дубровину z3apa3a и Алене Лихачевой s4ever. В статье также использовались материалы Эдуарда Тянтова EdT и Александра Пуртова 4Alexander.

Читайте также: