首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -发送大量电子邮件-- SMTP连接断开

Django -发送大量电子邮件-- SMTP连接断开
EN

Stack Overflow用户
提问于 2012-01-23 04:33:31
回答 4查看 2.1K关注 0票数 1

我有一个应用程序,发送超过1,000封电子邮件给客户。每封电子邮件都是根据客户定制的。我有我的Django应用程序使用我的Gmail商业帐户(付费的谷歌应用程序)来发送电子邮件。

我遇到的问题是,在大约80-100封电子邮件成功发送后,与Gmail的SMTP连接就会中断。我必须等待大约10-15分钟,然后才能重新开始发送。但是,在大约70-100封电子邮件正常发送后,连接再次中断。

我使用Django-Mailer-2发送邮件。下面是我的Django应用程序产生的错误:

代码语言:javascript
复制
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,他们声称是我的软件导致了问题,而不是他们。

你认为如何?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-25 06:02:46

好了--我解决了这个问题。真的,这更像是一种变通的工作。我相信Gmail正在阻止我的电子邮件,因为他们认为这是垃圾邮件。一个接一个地发送数百封电子邮件,已经在他们那端触发了一些东西,并关闭了我的连接。不管怎么说,这是我的理论。

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

谢谢你的帮助。

票数 2
EN

Stack Overflow用户

发布于 2012-05-12 04:15:05

我遇到了同样的问题。我采用了你的解决方案,但我不是在每封邮件后都打瞌睡,而是发送10封邮件,然后等待70秒。我通过这种方式成功地发送了200多封电子邮件。当我尝试每50封电子邮件休眠一次时,我仍然有这个问题,在连接断开之前只发送了100封电子邮件。

票数 3
EN

Stack Overflow用户

发布于 2012-01-23 05:07:55

在这种情况下,您很可能只能进行一些调试:"/usr/lib/python2.6/smtplib.py",697行的内容如下所示:

代码语言:javascript
复制
    (code,resp) = self.mail(from_addr, esmtp_opts)
    if code != 250:
        self.rset()
        raise SMTPSenderRefused(code, resp, from_addr)

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

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

一个快速的解决方法可能是一个猴子补丁,以禁用RSET命令:

代码语言:javascript
复制
import smtplib
smtplib.SMTP.rset = lambda self: 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8964448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档