Тайм-аут Amazon EC2/SES SMTP
У меня возникла проблема при попытке отправить электронную почту из моего экземпляра EC2 с использованием SMTP в SES. По какой-то причине у меня возникают спорадические проблемы тайм-аута, когда я больше не могу связаться с узлом SMTP. Важно отметить, что отправка через SES работает, вероятно, в 75% случаев.
Я начну с некоторых деталей. Моя учетная запись SES работает большую часть времени. Электронная почта отправителя была подтверждена, и мои лимиты были увеличены до 10 тыс. В день, 5 электронных писем в секунду. У меня сложилось впечатление, что я получу ошибку, связанную с определенным лимитом, если это будет связано с моими лимитами. Для конфигурации SMTP я использую posfix с TLS. Я опубликовал очень похожий пост на официальных форумах AWS SES, но пока не добился там успеха. Информация для этого поста находится внизу этого поста.
Вот пример отказа от этого утра. Все команды, которые я запускал ниже, были запущены из экземпляра EC2, с которого я пытаюсь отправить почту. Извините за пост размером с роман, я просто хочу убедиться, что я включил все.
Письмо, которое я отправил себе, не было доставлено:
Jun 25 06:16:36 intranet01 postfix/smtp18832: 9E00C230DA: to=<myemailaddress>, relay=none, delay=150, delays=0.02/0.01/150/0, dsn=4.4.1, status=deferred (connect to email-smtp.us-east-1.amazonaws.comhttp://107.22.187.122:25: Connection timed out)
И когда я увидел сбой, я попытался подключиться к хосту электронной почты через порт 25. Я не смог подключиться:
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.28.151...
^C
Через несколько минут мое отложенное письмо наконец прошло:
Jun 25 06:23:14 intranet01 postfix/smtp18861: 9E00C230DA: to=<myemailaddress>, relay=email-smtp.us-east-1.amazonaws.comhttp://184.73.218.23:25, delay=548, delays=548/0.02/0.21/0.36, dsn=2.0.0, status=sent (250 Ok 0000013823cf7441-83710873-e946-4c80-8a54-0dd72bae6f30-000000)
Jun 25 06:23:14 intranet01 postfix/qmgr3972: 9E00C230DA: removed
И теперь я могу подключиться к порту 25:
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.152.208...
Connected to email-smtp.us-east-1.amazonaws.com.
Escape character is '^]'.
220 email-smtp.amazonaws.com ESMTP SimpleEmailService-222567251
^]
Я решил посмотреть на конечную точку хоста SES. Оказывается, это просто имя ELB c записями A, которые указывают на интерфейсы в нескольких AZ.
root@intranet01 sbin# dig email-smtp.us-east-1.amazonaws.com
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.17.amzn1 <<>> email-smtp.us-east-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8592
;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;email-smtp.us-east-1.amazonaws.com. IN A
;; ANSWER SECTION:
email-smtp.us-east-1.amazonaws.com. 54 IN CNAME ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com.
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 174.129.200.82
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 184.73.219.75
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 107.20.152.208
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 107.20.160.81
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 107.20.203.50
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 107.22.229.233
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 174.129.6.189
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 174.129.28.151
Я попытался отправить другое сообщение, и это не удалось. На этот раз я перебрал все адреса записей A, которые вернуло имя SES. Я не мог подключиться ни к одному из них. В течение этого времени я также пытался подключиться с моего локального компьютера (не моего экземпляра EC2), и он работал просто отлично.
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.28.151...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.6.189...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.22.229.233...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.203.50...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.160.81...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.152.208...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 184.73.219.75...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.200.82...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.28.151...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.6.189...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.22.229.233...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.203.50...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.179.13...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.160.81...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 184.73.219.75...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.200.82...
^C
После ожидания около 30 секунд я попробовал еще раз, на этот раз это сработало.
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.28.151...
Connected to email-smtp.us-east-1.amazonaws.com.
Escape character is '^]'.
220 email-smtp.amazonaws.com ESMTP SimpleEmailService-222567251
^C^[
^]
telnet>
Как я уже говорил ранее, я разместил очень похожий пост на форуме AWS SES. Пост можно найти ниже.
https://forums.aws.amazon.com/thread.jspa?threadID=97736&tstart=0
Кроме того, похоже, что я не одинок, так как я нашел этот другой пост на форуме SES, похоже на ту же проблему.
https://forums.aws.amazon.com/thread.jspa?threadID=91260&tstart=0
Я подумал, что может быть какое-то ограничение SMTP в EC2, поэтому я заполнил форму запроса "отправка электронной почты из EC2", но это кажется мне глупым, так как я пользуюсь сервисом Amazon, а не сторонней организацией. До сих пор я не слышал ничего от Amazon после заполнения формы.
У кого-нибудь есть какие-либо идеи? Заранее спасибо.
3 ответа
Так что, видимо, у EC2 есть свои ограничения. Я предположил (неправильно), что наличие производственного доступа к SES также будет означать смягчение ограничений SMTP в EC2, но, поскольку они являются двумя совершенно разными продуктами, я полагаю, что это не так.
Но, как я уже говорил в последнем абзаце моего сообщения, вы можете запросить удаление ограничений на отправку электронной почты, чтобы повысить эти ограничения. Я сделал это, и проблема прекратилась (им потребовалось около 5 часов, чтобы снять ограничения).
Обновить
Регулирование EC2 задокументировано в разделе "Подключение к конечной точке SMTP Amazon SES" и фактически ограничено портом 25, поэтому альтернативным и немедленным решением является просто использование порта 587 (немного жаль, что несколько официальных примеров SES действительно используют порт 25):
Важный
Elastic Compute Cloud (EC2) по умолчанию регулирует трафик электронной почты через порт 25. Чтобы избежать тайм-аутов при отправке электронной почты через конечную точку SMTP из EC2, используйте другой порт (587 или 2587) или заполните запрос на удаление ограничений на отправку электронной почты для удаления газа.
Помните, что это также может быть немного устаревшим, поскольку Консоль управления AWS и раздел Amazon SES SMTP относятся к более распространенным альтернативным портам 465 и 587:
Вы отправляете в Amazon SES из экземпляра Amazon EC2 через порт 25 и не можете достичь своих лимитов отправки Amazon SES или получаете тайм-ауты - Amazon SES EC2 устанавливает ограничения по умолчанию для электронной почты, отправляемой через порт 25, и ограничивает исходящие соединения, если вы пытаетесь превысить эти пределы. Чтобы удалить эти ограничения, отправьте запрос на удаление ограничений на отправку электронной почты. Вы также можете подключиться к Amazon SES через порт 465 или 587, ни один из которых не регулируется.
Если вы используете приложение Django и подозреваете , что причиной может быть ответ Стеффена - вот краткий лакмусовый тест:
In [1]: from django.core.mail.backends.smtp import EmailBackend
In [2]: from django.core.mail import EmailMultiAlternatives
In [3]: message = EmailMultiAlternatives(
...: subject='testing the rate limit',
...: body='this is a test',
...: to=['your+email@example.com'],
...: from_email='from@example.com',
...: )
In [4]: backend_587 = EmailBackend(port=587)
In [5]: backend_25 = EmailBackend(port=25)
In [6]: backend_587.send_messages([message])
Out[6]: 1
In [7]: backend_25.send_messages([message]) # hangs for a long time. Might even timeout
Отправка письма с порта 25 должна зависнуть. Отправка электронной почты с 587 должна отправить быстро.
Это похоже на случай дросселирования порта 25 на EC2. По умолчанию AWS регулирует скорость порта 25, чтобы избежать отправки электронных писем злонамеренными пользователями / программами. Вы можете удалить этот лимит, следуя инструкциям здесь: https://aws.amazon.com/premiumsupport/knowledge-center/ec2-port-25-throttle/
Кроме того, вы можете изменить исходящий порт в вашем приложении, чтобы использовать 587, 2587 для поддержки STARTTLS или 465/2465 для TLS Wrapper.