我有一个应用程序可以向客户发送超过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,他们声称这是我的软件导致问题,而不是他们。
您怎么看?
答案 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