2017-06-22 3 views
0

Ich habe einen Python-SMTP-Server und -Client mit Twisted implementiert. Wenn ich beide lokal teste, d. H. Mit localhost funktioniert alles perfekt. Ich möchte es jedoch in einer verteilten Umgebung überprüfen. So betreibe ich eine Amazon EC2-Instanz, auf dem ich meine SMTP-Server als Anwendung gestartet wird, wie untenSo senden Sie eine E-Mail an EC2-Instanzen mit Python & verdreht

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

wo StdoutSMTPFactory meine Implementierung einer Fabrik baut mein SMTP-Server. Mein SMTP-Client sieht wie folgt:

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() 

wo ec2-X-X-X-X.eu-west-1.compute.amazonaws.com ist natürlich ein gültiger Hostname meiner EC2-Instanz, nur für den Posten verdeckt. Wenn ich versuche, eine E-Mail an meine Instanz senden ich erhalten die folgende:

[-] 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. 

Es gibt keine Fehler, weder auf dem Server oder Client-Seite. Es scheint nur, dass der Client keine Verbindung zum Server herstellen kann. Kann jemand vorschlagen, was ich falsch mache?

Antwort

0

Sie in Ihrem Code haben:

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

Dies ist die latente Äquivalent des synchronen Python-Code:

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

Wenn Sie möchten, um den Fehler zu sehen, etwas zu tun mit dem Argument übergeben der Fehler auf Ihrem Aufschub.

from twisted.logger import Logger 
logger = Logger() 

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

Oder vielleicht prüfen, mit react

from twisted.internet.task import react 

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

react(main, []) 

, die den Fehler für Sie berichten tun wird.

Verwandte Themen