Amazon SES, Postfix и WordPress

Недавно столкнулся с копеечной на первый взгляд проблемой – из блога на WordPress не отправлялись письма, но потратил не её решение некоторое время. Может быть мой опыт пригодиться кому-нибудь.

Интерес еще и в том что сервер отправляет письма через Amazon SES (Simple Email Service)

Итак, нужно настроить отправку писем с сервера в облаке Amazon.
Одним из хороших вариантов в данном случае будет использование сервиса доставки писем от Amazon.
Называется он Amazon SES http://aws.amazon.com/ses/.

Сервис позволяет отправлять до 2000 тысяч писем в сутки (более детально об ограничениях смотри на вышеприведенном линке)

Настраивается его использование довольно просто:

  1. Идем в Amazon AWS консоли к сервису SES
  2. Верифицируем свой почтовый адрес посылая на него письмо. Можно верифицировать несколько адресов
  3. В SMTP настройках сервиса создаем пользователя для SMTP сервера и пароль для него. Там же смотрим адреса и порты для работы с SMTP сервером.
    Начиная с этого момента сервис можно пользовать в так называемом тестовом режиме (отправлять письма с полем «from» с почтовым адресом который верифицирован в пункте №2 на этот же почтовый адрес и с некоторыми другими ограничениями)

  4. Переводим сервис в «production access» режим с помощью заполнения формочки по адресу http://aws.amazon.com/ses/fullaccessrequest

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

Этот SMTP сервер можно использовать как в почтовых клиентах, так и на Ваших серверах.

Вот тут описано как это сделать для postfix: http://docs.aws.amazon.com/ses/latest/DeveloperGuide/postfix.html

Коротко что нужно сделать (делалось на Ubuntu Server 12.04):

1. Добавляем в /etc/postfix/main.cf (проверьте, совпадают ли параметры с Вашими)
#Amazon SES config
relayhost = email-smtp.us-east-1.amazonaws.com:25
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_use_tls = yes
smtp_tls_security_level = encrypt
smtp_tls_note_starttls_offer = yes
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
2. Добавляем в файл /etc/postfix/sasl_passwd (проверьте имя сервера, подставьте Ваши имя пользователя и пароль):
email-smtp.us-east-1.amazonaws.com:25 USERNAME:PASSWORD
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com:25 USERNAME:PASSWORD
3. Делаем хеш файла с паролями: postmap hash:/etc/postfix/sasl_passwd
После этого можно удалить оригинальный файл
4. Рестартуем postfix:
/etc/init.d/postfix restart

Проверяем как уходят письма:

Если ваш Amazon SES все еще в тестовом режиме, то нужно добавить поле «from» с верифицированным адресом:
echo “test email body via Amazon SES” | mail yourAmazonSESVerified@email.com -s “test subject via Amazon SES” –append=”FROM: yourAmazonSESVerified@email.com”
а если уже в «production access» то можно отправлять на любой адрес:
echo “test email body via Amazon SES” | mail anyAddress@email.com -s “test subject via Amazon SES”

Чтобы отловить возможные ошибки можно сразу смотреть лог в другой консоли командой: tail -f /var/log/mail.log

И вот уже счастье есть, письма летают с сервера куда надо.
Но ставим на сервер WordPress, а из него письма не уходят.
При этом в логах почты приходит отлуп такого типа от амазоновского smtp сервера: “554 Message rejected: Email address is not verified

WordPress умный однако, он при отсылке письма добавляет свое поле “from” в письмо, типа такого From: WordPress <wordpress@10.11.12.13>, где IP адрес обычно совпадает с внутренним IP адресом амазоновского сервера

Как точно проверить что пишет WordPress в поле “from”?
Можно включить дебаг в postfix или добавить логирование при отсылке писем в
php.ini (mail.log = /var/log/php.mail.log). Кому что больше нравиться.

Как решить проблему с отсылкой писем из WordPress?
Вот варианты:

1. Изменить код WordPress, но минус в том что скорее всего придётся это менять каждый раз при обновлении WordPress
2. Решить эту проблему с помощью того же postfix сервера

Мне больше нравиться второй вариант. На помощь, в этом случае придет старая фича с изменением заголовков письма.
Итак для этого:

1. Делаем файлик с описанием замен
vi /etc/postfix/header_checks
/From: WordPress <wordpress@10\.11\.12\.13>/ REPLACE From: wordpress <yourAmazonSESVerified@email.com>
2. Проверяем как наша замена будет работать:
postmap -q “From: WordPress <wordpress@10.11.12.13>” regexp:/etc/postfix/header_checks
REPLACE From: wordpress <yourAmazonSESVerified@email.com>
3. Добавляем конфигурацию замен в  /etc/postfix/main.cf
header_checks = regexp:/etc/postfix/header_checks
4. Рестартуем postfix: /etc/init.d/postfix restart

Пробуем отправить письмо с WordPress. Например, делаем нового пользователя.
И, конечно, смотрим логи:
tail -f /var/log/mail.log
replace: header From: WordPress <wordpress@10.11.12.13> from local; from=<www-data@10.11.12.13>: From: wordpress <yourAmazonSESVerified@email.com>
postfix/smtp[14621]: A8B1C412D4: to=<yourAmazonSESVerified@email.com>, relay=email-smtp.us-east-1.amazonaws.com[107.21.238.216]:25, delay=1.5, delays=0.03/0.07/0.81/0.58, dsn=2.0.0, status=sent (250 Ok 0000013c72419310-8ddb39cf-7c9a-4326-a3b6-8d189b3f2622-000000)

Вот теперь уходят письма и от WordPress.

This entry was posted in Amazon AWS, Amazon simple email service and tagged , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *