AWS: SES – Simple Email Service и WorkMail: настройка аккаунта и отправка почты

By | 05/18/2018
 

AWS SES позволяет выполнять отправку и приём почты без необходимости настраивать свой полноценный почтовый сервис в виде Exim/Dovecot etc.

Документация – тут>>>, а в этом посте рассмотрим настройку и использование сервиса на примере.

Ограничения SES sandbox

Как и все сервисы AWS – SES имеет свои ограничения, а для SES ещё и применяются особые правила: при создании нового аккаунта SES он создаётся “в песочнице”, и к нему применяются серёзные ограничения.

Основные из них:

  • 200 писем за 24 часа (может быть увеличен до макс. 1 письмо в секунду)
  • максимальный размер письма – 10 мб (в base64)
  • отправка почты возможно только на подтверждённые адреса

Больше см. на странице Limits in Amazon SES.

Как “выйти” из песочницы – см. дальше в посте.

Добавление домена

Переходим в консоль SES, добавляем домен:

Получаем две записи – для верификации домена, и для получения почты (MX-запись):

Получение сейчас не интересно, на NS домена добавляем только подверждение:

Буквально через минуту после добавления TXT – домен уже в статусе verified:

Добавление ящика

Теперь надо добавить ящик, который будет использоваться как FROM в SES.

Для того, что бы им пользоваться – его надо верифицировать, и тут возникает вопрос – как?

Для верификации ящика – AWS отправляет на этот ящик письмо со ссылкой, так что ящик уже должен существовать и принимать письма.

Если же почтового сервера и ящика нет – то, как вариант, можно использовать AWS WorkMail.

Создание аккаунта в AWS WorkMail

Документация по WorkMail доступна тут>>>.

Переходим в консоль, добавляем организацию:

Создание занимает до 2-х минут.

Ждём статус Active, переходим в организацию > Domains, добавляем домен:

Тут верификация домена не потребуется, т.к. TXT мы уже доабвили в начале настройки SES:

Переходим к NS домена, обновляем MX запись на указанную в списке:

Record type Hostname Value
MX setevoy.org.ua. 10 inbound-smtp.eu-west-1.amazonaws.com.

Переходим в Users, создаём пользователя:

Создаём ему ящик:

Верификация ящика в SES

Возвращаемся к SES, добавляем ящик:

SES отправит письмо со ссылкой для подтверждения ящика на указанный ящик:

Возвращаемся к WorkMail, в Organization settings открываем ссылку на веб-интерфейс почты:

Логинимся в ящик:

Получаем наше письмо:

Кликаем по ссылке – готово:

Тестовое письмо

Т.к. наш SES ещё “в песочнице” – то отправка почты возможна только на потдвержённые домены/ящики/

Жмём Send a Test Email, указываем ящик в другом домене:

Как вариант для тестовой отправки – можно верифицировать этот домен аналогично тому, как сделали с org.ua.

Отправляем письмо, получаем его – всё работает:

Выход SES из песочницы

Следующим шагом – требуется создать тикет в AWS Support, что бы аккаунт сделали “полноценным”.

Документация – тут>>>.

Переходим на страницу https://aws.amazon.com/ses/extendedaccessrequest/, создаём запрос:

Отправляем, и ждём ответа тех. поддержки:

Allow one business day for us to review your request.

UPD Запрос я отправил 18 May 2018 в 12:30, ответ получил в воскресенье, в 4.30 (даже в не-бизнес день):

Hello,

We reviewed your case and have increased your sending quota to 50,000 messages per day. Your maximum send rate has increased to 14 messages per second. This is effective in AWS Region EU (Ireland). Your account has also moved out of the sandbox, so you no longer need to verify recipient addresses.

Настройка SES SMTP

Далее, что бы отправлять почту через SMTP, переходим в SMTP Settings, и создаём SMTP credentials:

Данные будут доступны только один раз, поэтому сохраняем их:

Настройка Thunderbird

Документация тут>>>.

Пробуем настроить клиент – переходим в offline режим:

Жём Later.

Переходим в настройки – SMTP servers, добавляем новый, URL сервера есть на странице Using SMTP to Send Email with Amazon SES:

Добавляем сервер с логином из файла, который скачали ранее:

Переходим к созданию аккаунта (всё ещё в Offline mode) – добавляем новый, поле Пароль оставляем пустым, жмём Advanced config:

Указываем для SMTP созданный ранее сервер:

Жмём ОК, сохарянем настройки, отключаем Offline mode, и пробуем отправить письмо:

Указываем пароль:

Пришло:

Python скрипт отправки

И последнее – небольшой скрипт для отправки письма, слегка переделанная версия из примеров:

#!/usr/bin/env python

import sys
import smtplib
import email.utils
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def makeemail(from_name, from_user, to_user):

    # The subject line of the email.
    subject = 'Amazon SES Test (Python smtplib)'

    # The email body for recipients with non-HTML email clients.
    body_text = ("Amazon SES Test\r\n"
                 "This email was sent through the Amazon SES SMTP "
                 "Interface using the Python smtplib package."
                )

    # The HTML body of the email.
    body_html = """<html>
    <head></head>
    <body>
      <h1>Amazon SES SMTP Email Test</h1>
      <p>This email was sent with Amazon SES using the
        <a href='https://www.python.org/'>Python</a>
        <a href='https://docs.python.org/3/library/smtplib.html'>
        smtplib</a> library.</p>
    </body>
    </html>
                """

    # Create message container - the correct MIME type is multipart/alternative.
    msg = MIMEMultipart('alternative')
    msg['Subject'] = subject
    msg['From'] = email.utils.formataddr((from_name, from_user))
    msg['To'] = to_user

    # Record the MIME types of both parts - text/plain and text/html.
    part1 = MIMEText(body_text, 'plain')
    part2 = MIMEText(body_html, 'html')

    # Attach parts into message container.
    # According to RFC 2046, the last part of a multipart message, in this case
    # the HTML message, is best and preferred.
    msg.attach(part1)
    msg.attach(part2)

    return msg


def send_email(host, port, smtp_user, smtp_pass, from_user, to_user, message):

    # Try to send the message.
    try:
        server = smtplib.SMTP(host, port)
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(smtp_user, smtp_pass)
        server.sendmail(from_user, to_user, message.as_string())
        server.close()
    except Exception as e:
        print ("Error: ", e)
    else:
        print ("Email sent!")


if __name__ == "__main__":

    # Replace smtp_username with your Amazon SES SMTP user name.
    smtp_user = sys.argv[1]

    # Replace smtp_password with your Amazon SES SMTP password.
    smtp_pass = sys.argv[2]

    # If you're using Amazon SES in an AWS Region other than US West (Oregon),
    # replace email-smtp.us-west-2.amazonaws.com with the Amazon SES SMTP
    # endpoint in the appropriate region.
    host = "email-smtp.eu-west-1.amazonaws.com"
    port = 587

    # Replace sender@example.com with your "From" address.
    # This address must be verified.
    from_user = 'noreply@setevoy.org.ua'
    from_name = 'Arseny'

    # Replace recipient@example.com with a "To" address. If your account
    # is still in the sandbox, this address must be verified.
    to_user = 'noreply@setevoy.org.ua'

    message = makeemail(from_name, from_user, to_user)

    send_email(host, port, smtp_user, smtp_pass, from_user, to_user, message)

Отправляем, передаём пользователя и пароль аргументами:

./ses_sendmail.py AKI***DBA AlI***kR5
Email sent!

Проверяем в WorkMail:

Готово.