Django - отправка большого количества писем - разрыв соединения SMTP - PullRequest
1 голос
/ 23 января 2012

У меня есть приложение, которое отправляет более 1000 писем клиентам. Каждое письмо настраивается под клиента. У меня есть приложение Django, использующее мою учетную запись Gmail Business (оплачивается за приложение Google) для отправки писем.

Проблема, с которой я столкнулся, заключается в том, что после успешной отправки примерно 80-100 писем SMTP-соединение с Gmail прерывается. Мне нужно подождать около 10-15 минут, прежде чем я смогу начать отправку снова. Но, опять же, после 70-100 писем, отправленных должным образом, соединение разрывается.

Я использую Django-Mailer-2 для отправки почты. Вот ошибка, которую выдает мое приложение Django:

Traceback (most recent call last):
  File "manage.py", line 11, in <module>
    execute_manager(settings)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 351, in handle
    return self.handle_noargs(**options)
  File "/usr/local/lib/python2.6/dist-packages/django_mailer/management/commands/send_mail.py", line 47, in handle_noargs
    send_all(block_size, backend=settings.USE_BACKEND)
  File "/usr/local/lib/python2.6/dist-packages/django_mailer/engine.py", line 91, in send_all
    blacklist=blacklist)
  File "/usr/local/lib/python2.6/dist-packages/django_mailer/engine.py", line 179, in     send_queued_message
    [message.to_address], smart_str(message.encoded_message))
  File "/usr/lib/python2.6/smtplib.py", line 697, in sendmail
    self.rset()
  File "/usr/lib/python2.6/smtplib.py", line 438, in rset
    return self.docmd("rset")
  File "/usr/lib/python2.6/smtplib.py", line 363, in docmd
    return self.getreply()
  File "/usr/lib/python2.6/smtplib.py", line 340, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed

Эти две последние строки заставляют меня думать, что Gmail закрывает соединение. Я связался с Gmail, и они утверждают, что проблема связана с моим программным обеспечением, а не с ними.

Что ты думаешь?

Ответы [ 4 ]

3 голосов
/ 12 мая 2012

Я столкнулся с той же проблемой.Я принял ваше решение, но вместо того, чтобы спать после каждого письма, я отправляю 10 писем и жду 70 секунд.Таким образом, я смог успешно отправить более 200 писем.Когда я пытался спать каждые 50 писем, у меня все еще была проблема, и только 100 писем были отправлены до того, как было разорвано соединение.

2 голосов
/ 25 января 2012

ОК - я решил эту ситуацию. На самом деле, это скорее работа вокруг. Я считаю, что Gmail останавливает мои электронные письма, потому что они думают, что это спам. Отправка сотен электронных писем одна за другой спровоцировала что-то с их стороны и закрыла мое соединение. Это моя теория в любом случае.

Моя работа заключается в добавлении строки кода в файл engine.py. После того, как письмо успешно отправлено, я добавил строку time.sleep(70). Это заставляет почтовую программу просто ждать 70 секунд, прежде чем продолжить. Я добавил этот код и попытался отправить все мои электронные письма. Примерно через 7 часов более 400 сообщений были успешно отправлены. Я бы сказал, что это работает. Это не должно быть быстрым, это просто должно работать. Мне было бы все равно, если бы это заняло несколько дней - до тех пор, пока они отправлены.

Спасибо за помощь.

0 голосов
/ 23 января 2012

Очевидно, что на стороне Google есть ограничение скорости.Я нашел эту ветку электронной почты, обсуждая проблему: http://blogoscoped.com/forum/112956.html

0 голосов
/ 23 января 2012

В этом случае вы, скорее всего, можете выполнить только некоторую отладку: "/usr/lib/python2.6/smtplib.py", строка 697 выглядит примерно так:похоже, что сервер обрабатывает команду RSET, отменяя соединение.Вы можете попробовать, если это так.Обрабатывая соединение вручную и вводя команду rset ().

Также этот код вызывается до вызова исключения SMTPSenderRefused, так что это конкретное письмо не будет отправлено в любом случае.fix может быть обезьяньим патчем, чтобы отключить команду RSET:

import smtplib
smtplib.SMTP.rset = lambda self: 0
...