私はTorando IoLoopと接続するためにpython async SMTPクライアントを探しています。私は単純なimplement(http://tornadogists.org/907491/)が見つかりましたが、それはパフォーマンスの問題をもたらすかもしれないので、ブロッキングソリューションです。Tornado non-blocking SMTPクライアント
誰もがTornadoのSMTPクライアントをブロックしていませんか?コードスニペットも非常に便利です。
私はTorando IoLoopと接続するためにpython async SMTPクライアントを探しています。私は単純なimplement(http://tornadogists.org/907491/)が見つかりましたが、それはパフォーマンスの問題をもたらすかもしれないので、ブロッキングソリューションです。Tornado non-blocking SMTPクライアント
誰もがTornadoのSMTPクライアントをブロックしていませんか?コードスニペットも非常に便利です。
私はスレッドとキューに基づいて解決策を書いています。竜巻のプロセスごとに1つのスレッド。このスレッドはワーカーであり、キューから電子メールを取得し、SMTP経由で送信します。それをキューに追加することで、竜巻アプリケーションから電子メールを送信します。シンプルで簡単。私はちょうどioloopベースのSMTPクライアントを手早く - ちょうどFYI link
https://github.com/equeny/tornadomail - ここではioloop竜巻するポートDjangoのメールシステムとのpythonたりするsmtplibに私attempです。 フィードバックをお寄せいただきありがとうございます。
私は私自身のSMTPサーバーを使用しますが、これは誰かに有用であろう考え出していないよ:
私はちょうど私のアプリに送信する電子メールを追加しなければなりませんでした。ウェブの電子メールサービスのサンプルPythonコードのほとんどはブロッキングデザインを使用していますので、使用したくありません。
MailchimpのMandrillはHTTP POSTリクエストを使用しているため、TornadoのデザインでAsyncファッションに適合します。
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')
私は職場で同じ問題の解決策を探していました。容易に利用できる解決策がなかったので、私は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
ワーカースレッドのソリューションは、非同期の解決策がないうちに非常にエレガントなようです。コードをコミュニティと共有しましたか? – berni
これは簡単な解決方法です。本番環境では未使用:[link] –