【问题标题】:Tornado non-blocking SMTP clientTornado 非阻塞 SMTP 客户端
【发布时间】:2011-07-04 23:28:38
【问题描述】:

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

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

【问题讨论】:

    标签: python email smtp tornado


    【解决方案1】:

    仅供参考 - 我刚刚创建了一个基于 ioloop 的 smtp 客户端。虽然我不能说它已经过生产测试,但它会在不久的将来。

    https://gist.github.com/1358253

    【讨论】:

      【解决方案2】:

      https://github.com/equeny/tornadomail - 这是我将 django 邮件系统和 python smtplib 移植到 tornado ioloop 的尝试。 很高兴听到一些反馈。

      【讨论】:

        【解决方案3】:

        我一直在寻找解决工作中相同问题的方法。由于没有现成的解决方案,我将 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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 使用工作线程的解决方案看起来相当优雅,而没有异步解决方案。您是否与社区分享了您的代码?
          • 这是一个简单的解决方案。尚未用于生产:link
          【解决方案5】:

          我没有使用自己的 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')
          

          【讨论】:

            猜你喜欢
            • 2014-11-26
            • 1970-01-01
            • 2017-04-18
            • 2019-02-14
            • 2023-03-22
            • 2013-11-12
            • 2019-09-20
            • 2017-01-29
            • 2021-08-28
            相关资源
            最近更新 更多