Django - 发送大量电子邮件 - SMTP连接丢失

时间:2012-01-22 20:33:31

标签: django gmail sendmail

我有一个应用程序可以向客户发送超过1,000封电子邮件。每封电子邮件都是根据客户定制的。我的Django应用程序使用我的Gmail Business帐户(付费用于Google App)来发送电子邮件。

我遇到的问题是,在成功发送大约80-100封电子邮件后,与Gmail的SMTP连接中断。我必须等待大约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 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。我已经采取了你的解决方案,但不是在每封电子邮件后睡觉,而是发送10封电子邮件,然后等待70秒。我能够通过这种方式成功发送200多封电子邮件。当我每50封电子邮件尝试睡觉时,我仍然遇到了问题,在连接断开之前只发送了100封电子邮件。

答案 1 :(得分:2)

好的 - 我解决了这个问题。真的,这更像是一种解决方案。我相信Gmail会阻止我的电子邮件,因为他们认为这是垃圾邮件。一个接一个地发送数百封电子邮件,触发了一些事情并关闭了我的连接。无论如何,那是我的理论。

我的工作是在engine.py文件中添加一行代码。成功发送电子邮件后,我添加了行time.sleep(70)。这导致邮件程序在继续之前等待70秒。我添加了此代码并尝试发送所有电子邮件。大约7个小时后,成功发送了400多封电子邮件。我会说它有效。它不必很快,它只需要工作。我不在乎是否需要几天 - 只要他们被送去。

感谢您的帮助。

答案 2 :(得分:0)

在这种情况下,您很可能只能进行一些调试: “/usr/lib/python2.6/smtplib.py”,第697行左右看起来像这样:

    (code,resp) = self.mail(from_addr, esmtp_opts)
    if code != 250:
        self.rset()
        raise SMTPSenderRefused(code, resp, from_addr)

对我来说,看起来服务器通过取消连接来处理RSET命令。你可以尝试,如果是这样的话。通过手动处理连接并发出rset()命令。

此代码似乎在提升SMTPSenderRefused异常之前被调用,因此无论如何都不会发送此特定邮件。

快速修复可能是猴子补丁,以禁用RSET命令:

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

答案 3 :(得分:0)

显然,谷歌方面有一些速率限制。我找到了这个电子邮件主题,讨论了这个问题:http://blogoscoped.com/forum/112956.html