Email рассылка писем с уведомлением о прочтении

О том, как зарегистрировать аккаунт на Amazon Web Services и настроить Amazon SES (Simple Email Service) можно прочесть на habrahabr. В этой статье я поделюсь инструментом, написанным на PHP и позволяющим удобно осуществлять email-рассылки. Помимо этого, с помощью него Вы сможете получить подтверждение о прочтении письма.

AWS SES email рассылки

Панель управления Amazon SES


Для нетерпеливых: ссылка на реализацию AmazonMail на PHP

Итак, для старта нам понадобятся:

  • аккаунт Amazon SES;
  • Access Key Id;
  • Secret Access Key;
  • домен на хостинге (можно обойтись выделенным ip адресом) — необходимо для получения уведомлений о прочтении писем.

Изначально Amazon позволяет рассылать письма со скоростью 5 штук в секунду и не более 10 000 сообщений в день, однако лимиты можно увеличить на порядки двумя способами:

  • обратиться в техподдержку Amazon с просьбой об увеличении лимита;
  • планомерно повышать доверие к себе и рассылаемые объёмы — SES расширит возможности автоматически.

Поскольку у меня не было необходимости рассылать email сообщения чаще и больше, я выбрал второй вариант. Тем не менее, совсем скоро, спустя ~10 000 отправленных писем, Amazon SES позволил отправлять письма с частотой 14 штук в секунду и не более 50 000 в день, — что вполне достаточно для начала.

За основу был взять класс Dan Myers’ & Donovan Schonknecht’s Amazon SimpleEmailService PHP class. Для того, чтобы адаптировать его под задачу массовой рассылки сообщений — он был дополнен следующими возможностями:

  • загрузка тела письма для html и текстового варианта из соответствующих файлов;
  • работа с файлом параметров;
  • загрузка списка адресов и имен получателей из файла;
  • подстановка имен получателей в тело письма по маске;
  • получение уведомлений о прочтении сообщений
  • вывод текущей информации в процессе работы класса в режиме «веб-консоли».

Для начала работы необходимо:

  1. Указать Access Key и Secret Key в import/credentials.csv
  2. Указать полное (краткое) имя отправителя в import/credentials.csv
  3. Указать заголовок письма в import/credentials.csv
  4. Указать ссылку полную ссылку на файл backbone.php вида
    http://your-domain.ru/path/to/AmazonMail/backbone.php
  5. Оформить тело письма в html-формате в import/message.html
  6. Оформить тело письма в plaintext-виде в import/message.txt
    (для клиентов, которые не поддерживают html)
  7. Отредактировать необходимые параметры в config.php
  8. Запустить рассылку вызовом sender.php

Как же происходит получение уведомления о получении письма?
Способ носит вероятностный характер и давно известен. В тело письма внедряется изображение с параметром src, значение которого соответствует ссылке на файл backbone.php из п.4, который, в свою очередь, генерирует изображение размером 1×1 px, при этом, логгируя факт прочтения письма.
Поскольку «изображение» находится на внешнем сервере — по умолчанию, оно может блокироваться при определённых настройках почтового клиента/сервера/фильтров. Тем не менее, практика показывает, что «процента срабатываний» более чем достаточно для репрезентативной выборки (буду рад, если кто-то проведёт детальный анализ статистики срабатываний этого метода). Более того, из данных логов можно подчерпнуть много интересной информации (предлагаю по-экспериментировать и понаблюдать читателю самому, логи будут располагаться в папке log в виде yyyy.mm.dd.txt файлов).

Однако, выявилась и «ложка дёгтя». Оказалось, что время, которое тратится на формирование одного запроса к Amazon SES и получение ответа — неприемлемо велико. В моём случае — это порядка 1 секунды на запрос, что в 14 раз меньше моей текущей пропускной способности по отправке писем сервиса Amazon (что, тем не менее, позволит отправлять порядка 68 400 писем в день).
В любом случае, — хочется большего. Поэтому, на текущий момент я обдумываю варианты:

В планах:

  • многопоточность;
  • интерфейс создания email рассылок писем;
  • управление рассылками;
  • графическое отображение статистики на основе логов;
  • расширение возможностей работы с письмами.
  • Так или иначе, «навешивать функционал» можно до бесконечности, поэтому, на текущем этапе данный набор скриптов нужен был для решения вполне конкретных задач. Если Вы считаете, что какая-то функциональность — просто необходима — обязательно пишите в комментарии.

Email рассылка писем с уведомлением о прочтении: 5 комментариев

  1. Здравствуйте.

    А как дела обстоят с абузой на письма?

    Вот допустим я отправил 10 000 писем и кто то по глупости отправил абузу.

    Как амазон решает такие проблемы и какое наказение за это последует?

    Как определяется уровень доверия? (Про доверие это к фразе «планомерно повышать доверие к себе «)

    Спасибо за ответ :)

    1. Добрый день.

      Точных цифр я Вам сказать не смогу, хотя Гугл поможет Вам найти примеры, где люди описывали, при каких значениях с ними связывалась техподдержка Amazon или робот предупреждал о «некачественной рассылке» и намекал на то, что при рецидиве — доступ к сервису может быть ограничен.
      Пример такой заметки — http://arm1.ru/blog/opyt-rassilok-cherez-amazon-ses.
      Здесь описан пример с Complaints: https://forums.aws.amazon.com/message.jspa?messageID=267770
      Best Practices от Amazon, затрагивающие эту проблему:
      http://media.amazonwebservices.com/AWS_Amazon_SES_Best_Practices.pdf
      https://sesblog.amazon.com/post/Tx2RZGAFPY2UE4F/What-if-you-get-an-SES-probation-notice-for-bounces

      — всё это позволяет сделать вывод о том, что примерные значения таковы:
      для Bounces — 5%-10%;
      для Complaints — 0.1%-0.5%.

      Однако, что можно сказать, так это следующее:
      1. У Amazon есть некие, довольно лояльные пороговые значения Bounces и Complaints (см. графики), по достижении которых робот пришлёт Вам уведомление о том, что Вы находитесь на «испытательном сроке» и у Вас N писем для того, чтобы доказать, что Вы рассылаете действительно качественный контент, в противном случае — доступ к SES могут заблокировать.
      2. Техподдержка Amazon обычно адекватно общается с клиентами и пытается помочь/вникнуть в проблему. Поэтому, думаю, что любую ситуацию можно разрешить.

  2. Пользуюсь Amazon SES API уже несколько месяцев. С тех пор как этот сервис интегрировали в Newsletter Plus Software. С их программой я рассылаю письма с нескольких SMTP на свой выбор, в том числе через Amazon SES API. API работает намного быстрее, чем SMTP подключение. В целом меня данный сервис вполне устраивает, т.к. спамом я не занимаюсь :)

  3. Спасибо за статью! А на некоторых сервисах есть функция статистики отправленных/полученных сообщений! Очень удобно!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>