Торнадо неблокирующий SMTP клиент - PullRequest
4 голосов
/ 05 июля 2011

Я ищу асинхронный SMTP-клиент Python для подключения к Torando IoLoop.Я нашел только простую имплементацию (http://tornadogists.org/907491/), но это блокирующее решение, поэтому оно может вызвать проблемы с производительностью.

Кто-нибудь сталкивался с неблокирующим SMTP-клиентом для Tornado? Некоторый фрагмент кода также был бы очень полезен.

Ответы [ 5 ]

3 голосов
/ 28 июля 2014

Я искал решение той же проблемы на работе. Поскольку не было готового решения, я перенес 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 репо

3 голосов
/ 11 ноября 2011

Просто к вашему сведению - я только что запустил SMTP-клиент на базе ioloop.Хотя я не могу сказать, что это производственные испытания, это будет в ближайшем будущем.

https://gist.github.com/1358253

3 голосов
/ 18 ноября 2011

https://github.com/equeny/tornadomail - вот моя попытка портировать почтовую систему django и python smtplib на торнадо ioloop.Будем рады услышать некоторые отзывы.

2 голосов
/ 28 августа 2012

Я не использую свой собственный SMTP-сервер, но подумал, что это будет кому-то полезно:

Мне просто нужно добавить отправку электронной почты в мое приложение. Большая часть примера кода Python для веб-служб электронной почты использует дизайн блокировки, поэтому я не хочу его использовать.

Mailchimp's 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')
2 голосов
/ 07 июля 2011

Я написал решение на основе потоков и очереди.Одна нить на процесс торнадо.Этот поток является рабочим, получает электронную почту из очереди и затем отправляет ее по SMTP.Вы отправляете электронные письма из приложения торнадо, добавляя его в очередь.Просто и легко.

Вот пример кода на GitHub: ссылка

...