2017-06-22 5 views
0

J'ai implémenté un serveur et un client SMTP python, en utilisant Twisted. Lorsque je les teste tous les deux localement, c'est-à-dire que j'utilise localhost, tout fonctionne parfaitement. Cependant, je veux le vérifier dans un environnement distribué. Ainsi, je lance une instance EC2 d'Amazon, sur lequel j'ai commencé mon serveur SMTP comme une application, comme le montre ci-dessousComment envoyer un email à des instances EC2 en utilisant python & twisted

factory = StdoutSMTPFactory("./tmp/mail") 
tcp_server = internet.TCPServer(2500, factory) 
application = service.Application("SMTPServer") 
tcp_server.setServiceParent(application) 

StdoutSMTPFactory est ma mise en œuvre d'une usine de construction de mon serveur SMTP. Mon client SMTP se présente comme ci-dessous:

import sys 
from email.mime.text import MIMEText 
from twisted.internet import reactor 
from twisted.mail.smtp import sendmail 
from twisted.python import log 

log.startLogging(sys.stdout) 

host = "ec2-X-X-X-X.eu-west-1.compute.amazonaws.com" 
sender = "[email protected]" 
recipients = ["[email protected]"] 

msg = MIMEText("""Test message 
from SenderX 
""") 
msg["Subject"] = "Title" 
msg["From"] = '"Secret Sender" <%s>' % (sender,) 
msg["To"] = ", ".join(recipients) 

deferred = sendmail(host, sender, recipients, msg.as_string(), port=2500) 
deferred.addBoth(lambda result: reactor.stop()) 

reactor.run() 

ec2-X-X-X-X.eu-west-1.compute.amazonaws.com est, bien sûr, un nom d'hôte valide de mon instance EC2, juste obscurci pour le poste. Lorsque je tente d'envoyer un e-mail à mon exemple, j'obtenir:

[-] Log opened. 
[-] Starting factory <twisted.mail.smtp.ESMTPSenderFactory instance at 0x10815d638> 
[Uninitialized] SMTP Client retrying server. Retry: 5 
[Uninitialized] SMTP Client retrying server. Retry: 4 
[Uninitialized] SMTP Client retrying server. Retry: 3 
[Uninitialized] SMTP Client retrying server. Retry: 2 
[Uninitialized] SMTP Client retrying server. Retry: 1 
[-] Stopping factory <twisted.mail.smtp.ESMTPSenderFactory instance at 0x10815d638> 
[-] Main loop terminated. 

Il n'y a pas d'erreur, ni du côté serveur ou client. Juste il semble que le client ne peut pas se connecter au serveur. Quelqu'un peut-il suggérer ce que je fais mal?

Répondre

0

Vous avez dans votre code:

deferred.addBoth(lambda result: reactor.stop()) 

Ceci est l'équivalent différé du code Python synchrone:

try: 
    ... 
except: 
    pass 
reactor.stop() 

Si vous voulez voir l'erreur, faire quelque chose avec l'argument passé à le ratback sur votre différé.

from twisted.logger import Logger 
logger = Logger() 

deferred.addErrback(partial(logger.failure, "sending mail")) 
deferred.addCallback(lambda ignored: reactor.stop()) 

Ou peut-être envisager d'utiliser react

from twisted.internet.task import react 

def main(reactor): 
    ... 
    return sendmail(host, sender, recipients, msg.as_string(), port=2500) 

react(main, []) 

qui fera l'erreur de déclaration pour vous.