【发布时间】:2011-07-04 23:28:38
【问题描述】:
我正在寻找 python 异步 SMTP 客户端以将其与 Torando IoLoop 连接。我发现只有简单的实现 (http://tornadogists.org/907491/),但它是一种阻塞解决方案,因此可能会带来性能问题。
有没有人遇到过 Tornado 的非阻塞 SMTP 客户端?一些代码 sn-p 也会非常有用。
【问题讨论】:
我正在寻找 python 异步 SMTP 客户端以将其与 Torando IoLoop 连接。我发现只有简单的实现 (http://tornadogists.org/907491/),但它是一种阻塞解决方案,因此可能会带来性能问题。
有没有人遇到过 Tornado 的非阻塞 SMTP 客户端?一些代码 sn-p 也会非常有用。
【问题讨论】:
仅供参考 - 我刚刚创建了一个基于 ioloop 的 smtp 客户端。虽然我不能说它已经过生产测试,但它会在不久的将来。
【讨论】:
https://github.com/equeny/tornadomail - 这是我将 django 邮件系统和 python smtplib 移植到 tornado ioloop 的尝试。 很高兴听到一些反馈。
【讨论】:
我一直在寻找解决工作中相同问题的方法。由于没有现成的解决方案,我将 Python smtplib 移植到基于 tornado 非阻塞 IOStream 的实现。语法尽可能接近 smtplib。
# create SMTP client
s = SMTPAsync()
yield s.connect('your.email.host',587)
yield s.starttls()
yield s.login('username', 'password')
yield s.sendmail('from_addr', 'to_addr', 'msg')
目前仅支持 Python 3.3 及以上版本。这是github repo
【讨论】:
我没有使用自己的 SMTP 服务器,但我认为这对某人有用:
我只需要将电子邮件发送添加到我的应用程序。大多数用于网络电子邮件服务的示例 Python 代码都使用了阻塞设计,所以我不想使用它。
Mailchimp 的 Mandrill 使用 HTTP POST 请求,因此它可以以适合 Tornado 设计的异步方式工作。
class EmailMeHandler(BaseHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
http_client = AsyncHTTPClient()
mail_url = self.settings["mandrill_url"] + "/messages/send.json"
mail_data = {
"key": self.settings["mandrill_key"],
"message": {
"html": "html email from tornado sample app <b>bold</b>",
"text": "plain text email from tornado sample app",
"subject": "from tornado sample app",
"from_email": "hello@example.com",
"from_name": "Hello Team",
"to":[{"email": "sample@example.com"}]
}
}
body = tornado.escape.json_encode(mail_data)
response = yield tornado.gen.Task(http_client.fetch, mail_url, method='POST', body=body)
logging.info(response)
logging.info(response.body)
if response.code == 200:
self.redirect('/?notification=sent')
else:
self.redirect('/?notification=FAIL')
【讨论】: