web-dev-qa-db-fra.com

Délai d'expiration SMTP Amazon EC2 / SES

J'ai un problème lorsque j'essaie d'envoyer des e-mails depuis mon instance EC2 à l'aide de SMTP vers SES. Pour une raison quelconque, je reçois des problèmes de dépassement de délai sporadiques, où je ne peux plus contacter l'hôte SMTP. Il est important de noter que l'envoi via SES fonctionne probablement dans 75% des cas.

Je vais commencer par quelques détails. Mon compte SES fonctionne la plupart du temps. L'email de l'expéditeur a été vérifié, et mes limites ont été augmentées à 10k/jour, 5 emails/seconde. J'ai l'impression que j'obtiendrais une erreur spécifique à la limite si cela était lié à mes limites. Pour ma configuration SMTP, j'utilise posfix w/TLS. J'ai publié un article très similaire sur les forums AWS SES officiels, mais je n'y ai pas encore réussi. Les informations pour ce poste sont au bas de ce post.

Voici un exemple d'échec de ce matin. Toutes les commandes que j'ai exécutées ci-dessous ont été exécutées à partir de l'instance EC2 à partir de laquelle j'essaie d'envoyer du courrier. Désolé pour le message de la taille d'un roman, je veux juste m'assurer que j'inclus tout.

Un e-mail que je me suis envoyé ne m'a pas été envoyé:

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)

Et quand j'ai vu l'échec, j'ai essayé de me connecter à l'hôte de messagerie via le port 25. Je n'ai pas pu me connecter:

root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25  
Trying 174.129.28.151...  
^C

Quelques minutes plus tard, mon e-mail différé est finalement passé:

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

Et maintenant je peux me connecter au port 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  
^]

Pour les coups de pied, j'ai décidé de regarder le point de terminaison de l'hôte SES. Il s'avère que ce n'est qu'un nom ELB, avec des enregistrements A qui pointent vers des interfaces dans plusieurs 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

J'ai essayé d'envoyer un autre message et cela a échoué. Cette fois, j'ai parcouru chacune des adresses d'enregistrement A renvoyées par le nom de domaine SES. Je n'ai pu me connecter à aucun d'entre eux. Pendant ce temps, j'ai également essayé de me connecter depuis ma machine locale (pas mon instance EC2), et cela a très bien fonctionné.

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

Après avoir attendu environ 30 secondes, j'ai essayé à nouveau, cette fois, cela a fonctionné.

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>

Comme je l'ai dit plus tôt, j'ai publié un article très similaire sur le forum AWS SES. Le message peut être trouvé ci-dessous.

https://forums.aws.Amazon.com/thread.jspa?threadID=97736&tstart=

De plus, il semble que je ne suis pas seul, car j'ai trouvé cet autre article sur le forum SES, il ressemble au même problème.

https://forums.aws.Amazon.com/thread.jspa?threadID=91260&tstart=

Je pensais qu'il pourrait y avoir une sorte de limitation SMTP EC2, j'ai donc rempli le formulaire de demande "Envoi d'e-mail depuis EC2", mais cela me semble idiot puisque j'utilise le service d'Amazon, par opposition à un tiers. Jusqu'à présent, je n'ai rien entendu d'Amazon après avoir rempli le formulaire.

Quelqu'un a-t-il une idée? Merci d'avance.

33
fattastic

Apparemment, EC2 a ses propres limites. J'ai supposé (à tort) que l'accès à la production à SES signifierait également des limitations SMTP assouplies d'EC2, mais comme il s'agit de deux produits complètement distincts, je suppose que ce n'est pas le cas.

Mais comme je l'ai indiqué dans le dernier paragraphe de mon article, vous pouvez Request to Remove Email Sending Limitations pour faire augmenter ces limites. Je l'ai fait et le problème s'est arrêté (il leur a fallu environ 5 heures pour que mes limites soient supprimées).


Mettre à jour

L'étranglement EC2 est documenté dans Connexion au point de terminaison SMTP Amazon SES et effectivement limité au port 25, donc une solution alternative et immédiate utilise simplement le port 587 à la place (il est un peu regrettable que plusieurs exemples SES officiels soient en utilisant le port 25 en effet):

Important

Elastic Compute Cloud (EC2) limite le trafic de messagerie sur le port 25 par défaut. Pour éviter les délais d'expiration lors de l'envoi d'e-mails via le point de terminaison SMTP à partir d'EC2, utilisez un port différent (587 ou 2587) ou remplissez Demande de suppression des limitations d'envoi d'e-mails pour supprimer l'accélérateur.

Sachez que cela peut également être légèrement obsolète, dans la mesure où AWS Management Console et la section Problèmes SMTP d'Amazon SES font référence aux ports alternatifs plus courants 465 et 587 uniquement:

Vous envoyez à Amazon SES à partir d'une instance Amazon EC2 via le port 25 et vous ne pouvez pas atteindre vos limites d'envoi Amazon SES ou vous recevez des délais d'attente - Amazon SES EC2 impose des limites d'envoi par défaut aux e-mails envoyés via le port 25 et limite les connexions sortantes si vous essayez de dépasser ces limites. Pour supprimer ces limites, envoyez un Demande de suppression des limitations d'envoi d'e-mails . Vous pouvez également vous connecter à Amazon SES via le port 465 ou le port 587, aucun des deux n'étant limité.

48
fattastic

Si vous utilisez une application Django et suspecte réponse de Steffen pourrait être la cause - voici un test décisif rapide:

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=['[email protected]'],
   ...:     from_email='[email protected]',
   ...: )
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

L'envoi de l'e-mail à partir du port 25 devrait se bloquer. L'envoi de l'e-mail à partir de 587 devrait envoyer rapidement.

1
rikAtee

Cela ressemble à un cas de limitation du port 25 sur EC2. AWS par défaut limite le port 25 pour éviter que des e-mails en masse ne soient envoyés par des utilisateurs/logiciels malveillants. Vous pouvez supprimer cette limite en suivant les instructions ici: https://aws.Amazon.com/premiumsupport/knowledge-center/ec2-port-25-throttle/

Vous pouvez également modifier le port sortant de votre application pour utiliser 587, 2587 pour la prise en charge STARTTLS ou utiliser 465/2465 pour TLS Wrapper.

0
Ranjan Dhar