2011-07-04 81 views
3

我正在寻找python异步SMTP客户端来连接它与Torando IoLoop。我发现只有简单的implmementation(http://tornadogists.org/907491/),但它是一个阻塞解决方案,所以它可能会带来性能问题。Tornado非阻塞SMTP客户端

有没有人遇到过非阻塞的Tornado SMTP客户端?一些代码片段也会非常有用。

回答

2

我写了基于线程和队列的解决方案。每个龙卷风过程一个线程。该线程是一名工作人员,从队列中获取电子邮件,然后通过SMTP发送。您通过将其添加到队列中来发送来自龙卷风应用程序的电子邮件。简单而简单。

这里是在GitHub上的示例代码:link

+0

带有工作线程的解决方案似乎非常优雅,而没有异步解决方案。你有没有与社区分享你的代码? – berni

+0

这是一个简单的解决方案。尚未用于生产:[链接](https://github.com/marcinc81/quemail) –

2

我不会用我自己的SMTP服务器,但想通这将是有用的人:

我刚刚加入电子邮件发送到我的应用程序。大多数用于Web电子邮件服务的示例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": "[email protected]", 
       "from_name": "Hello Team", 
       "to":[{"email": "[email protected]"}] 
      } 
     } 

     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') 
3

我正在寻找工作中同样问题的解决方案。由于没有现成的解决方案,我将Python smtplib移植到基于龙卷风非阻塞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