2017-06-22 75 views
0

我使用Twisted实现了python SMTP服务器和客户端。当我在本地测试它们时,即使用本地主机,一切都很完美。但是,我想在分布式环境中检查它。因此,我运行一个亚马逊EC2实例上,我开始了我的SMTP服务器作为应用程序,如显示出低于如何使用python&twisted将邮件发送到EC2实例

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

其中StdoutSMTPFactory是我实施的厂房内,我的SMTP服务器。 我的SMTP客户端查找如下:

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,当然,我的EC2实例的一个有效的主机名,只是模糊的职位。 当我尝试发送邮件到我的例子中,我得到如下:

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

有没有错误,既不在服务器或客户端。看起来客户端似乎无法连接到服务器。有人可以建议我做错了什么吗?

回答

0

你在你的代码:

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

这是同步Python代码的递延相当于:

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

如果你想看到的错误,做一些与传递给说法你延期的错误。

from twisted.logger import Logger 
logger = Logger() 

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

或许可以考虑使用react

from twisted.internet.task import react 

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

react(main, []) 

,并会为您报告错误。

相关问题