web-dev-qa-db-fra.com

Python Envoyer le courrier à l'intérieur du conteneur Docker avec le serveur SMTP local

Je veux envoyer un courrier avec smtp lib sur python. Je comprends qu'il utilise le service SMTP local sur le numéro de port 25. J'ai des codes ci-dessous. Ces codes exécutés sur mon local sans problème et courrier envoie avec succès. Mais lorsque je les déplace vers le conteneur Docker, le courrier n'est pas envoyé et cela ne donne aucune erreur.

Mes codes:

from_mail = '[email protected]'
to_mail = '[email protected]'

s = smtplib.SMTP('localhost')
subject = 'Test Subject'
content = 'content test'

message = f"""\
      Subject: {subject}
      To: {to_mail}
      From: {from_mail}
      {content}"""
result = s.sendmail(from_mail, to_mail, message)
s.quit()

Après avoir exécuté ces codes, je reçois un dict vide ({}) comme result valeur. Dans la description de la méthode Sendmail, a ceci:

... Le message a été accepté pour la livraison à trois des quatre adresses, et on a été rejeté, avec le code d'erreur 550. Si toutes les adresses sont acceptées, la méthode renvoie un dictionnaire vide.

Est-ce la configuration réseau? Devrais-je configurer des paramètres réseau?

6
kamilyrb

Si cela fonctionne sur la machine hôte, essayez d'utiliser l'IP hôte au lieu de localhost.

s = smtplib.SMTP(Host_IP)

Ou comme ARTHUR suggéré, vous pouvez exécuter le conteneur dans le réseau hôte avec --net=Host Et puis continuer à utiliser localhost.

0
Shashank V

Par défaut, les conteneurs DOCKER fonctionnent dans une pile de réseau distincte, alors localhost _ ne signifie pas la même chose dans un conteneur Docker tel qu'il le fait lorsque votre code s'exécute directement sur votre ordinateur.

Selon la manière dont votre serveur SMTP est configuré, il peut également être configuré pour refuser l'envoi de n'importe quel e-mail, mais ceux qui arrivent directement à partir de votre ordinateur, et un conteneur Docker peut être traité comme un étranger qui ne doit pas envoyer de courrier électronique à celui-ci.

Je suppose que la solution la plus simple serait de gérer votre conteneur Docker avec --net=Host. Avec cela, la pile de réseau du conteneur Docker sera identique à la pile de votre ordinateur et tout devrait fonctionner comme si le code s'effectue directement à l'extérieur de Docker.

0
Arthur