О том, как зарегистрировать аккаунт на Amazon Web Services и настроить Amazon SES (Simple Email Service) можно прочесть на habrahabr. В этой статье я поделюсь инструментом, написанным на PHP и позволяющим удобно осуществлять email-рассылки. Помимо этого, с помощью него Вы сможете получить подтверждение о прочтении письма.
Для нетерпеливых: ссылка на реализацию 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 и текстового варианта из соответствующих файлов;
- работа с файлом параметров;
- загрузка списка адресов и имен получателей из файла;
- подстановка имен получателей в тело письма по маске;
- получение уведомлений о прочтении сообщений
- вывод текущей информации в процессе работы класса в режиме «веб-консоли».
Для начала работы необходимо:
- Указать Access Key и Secret Key в import/credentials.csv
- Указать полное (краткое) имя отправителя в import/credentials.csv
- Указать заголовок письма в import/credentials.csv
- Указать ссылку полную ссылку на файл backbone.php вида
http://your-domain.ru/path/to/AmazonMail/backbone.php - Оформить тело письма в html-формате в import/message.html
- Оформить тело письма в plaintext-виде в import/message.txt
(для клиентов, которые не поддерживают html) - Отредактировать необходимые параметры в config.php
- Запустить рассылку вызовом sender.php
Как же происходит получение уведомления о получении письма?
Способ носит вероятностный характер и давно известен. В тело письма внедряется изображение с параметром src, значение которого соответствует ссылке на файл backbone.php из п.4, который, в свою очередь, генерирует изображение размером 1×1 px, при этом, логгируя факт прочтения письма.
Поскольку «изображение» находится на внешнем сервере — по умолчанию, оно может блокироваться при определённых настройках почтового клиента/сервера/фильтров. Тем не менее, практика показывает, что «процента срабатываний» более чем достаточно для репрезентативной выборки (буду рад, если кто-то проведёт детальный анализ статистики срабатываний этого метода). Более того, из данных логов можно подчерпнуть много интересной информации (предлагаю по-экспериментировать и понаблюдать читателю самому, логи будут располагаться в папке log в виде yyyy.mm.dd.txt файлов).
Однако, выявилась и «ложка дёгтя». Оказалось, что время, которое тратится на формирование одного запроса к Amazon SES и получение ответа — неприемлемо велико. В моём случае — это порядка 1 секунды на запрос, что в 14 раз меньше моей текущей пропускной способности по отправке писем сервиса Amazon (что, тем не менее, позволит отправлять порядка 68 400 писем в день).
В любом случае, — хочется большего. Поэтому, на текущий момент я обдумываю варианты:
- использование параллельных вызовов perl-скрипта, предоставляемого Amazon
- использование AngryCurl/RollingCurl для написания своей альтернативы SES PHP класса, с поддержкой многопоточности, в соответствии с http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/QueryInterface.Examples.html
В планах:
- многопоточность;
- интерфейс создания email рассылок писем;
- управление рассылками;
- графическое отображение статистики на основе логов;
- расширение возможностей работы с письмами.
Так или иначе, «навешивать функционал» можно до бесконечности, поэтому, на текущем этапе данный набор скриптов нужен был для решения вполне конкретных задач. Если Вы считаете, что какая-то функциональность — просто необходима — обязательно пишите в комментарии.
Здравствуйте.
А как дела обстоят с абузой на письма?
Вот допустим я отправил 10 000 писем и кто то по глупости отправил абузу.
Как амазон решает такие проблемы и какое наказение за это последует?
Как определяется уровень доверия? (Про доверие это к фразе «планомерно повышать доверие к себе «)
Спасибо за ответ 🙂
Добрый день.
Точных цифр я Вам сказать не смогу, хотя Гугл поможет Вам найти примеры, где люди описывали, при каких значениях с ними связывалась техподдержка 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 обычно адекватно общается с клиентами и пытается помочь/вникнуть в проблему. Поэтому, думаю, что любую ситуацию можно разрешить.
Пользуюсь Amazon SES API уже несколько месяцев. С тех пор как этот сервис интегрировали вNewsletter Plus Software . С их программой я рассылаю письма с нескольких SMTP на свой выбор, в том числе через Amazon SES API. API работает намного быстрее, чем SMTP подключение. В целом меня данный сервис вполне устраивает, т.к. спамом я не занимаюсь 🙂
Спасибо за статью! А на некоторых сервисах есть функция статистики отправленных/полученных сообщений! Очень удобно!
Ну да… А правда?
День добрый.
Спасибо за ресурс.
y zA2N3Qc4s9wyCF9L0ELy O2ji