Django 发送电子邮件:SMTPServerDisconnected:连接意外关闭

Posted

技术标签:

【中文标题】Django 发送电子邮件:SMTPServerDisconnected:连接意外关闭【英文标题】:Django Sending Email : SMTPServerDisconnected: Connection unexpectedly closed 【发布时间】:2015-05-12 21:07:36 【问题描述】:

你好,我想发送电子邮件激活使用 django 注册 redux。

这是我的设置.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

ACCOUNT_ACTIVATION_DAYS = 3
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'blahblah@gmail.com'
EMAIL_HOST_PASSWORD = 'blahpassword'
EMAIL_PORT = 465
EMAIL_USE_SSL = True

LOGIN_REDIRECT_URL = '/'

当我尝试使用时

python manage.py shell

从 django.core.mail 导入发送邮件

send_mail('测试', '这是一个测试', 'youremail@gmail.com', ['toemail@gmail.com'])

我收到这样的错误:

    Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/apsijogja/djangogirls/myvenv/local/lib/python2.7/site-packages/django/core/mail/__init__.py", line 62, in send_mail
    return mail.send()
  File "/home/apsijogja/djangogirls/myvenv/local/lib/python2.7/site-packages/django/core/mail/message.py", line 286, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "/home/apsijogja/djangogirls/myvenv/local/lib/python2.7/site-packages/django/core/mail/backends/smtp.py", line 92, in send_messages
    new_conn_created = self.open()
  File "/home/apsijogja/djangogirls/myvenv/local/lib/python2.7/site-packages/django/core/mail/backends/smtp.py", line 50, in open
    self.connection = connection_class(self.host, self.port, **connection_params)
  File "/usr/lib/python2.7/smtplib.py", line 249, in __init__
    (code, msg) = self.connect(host, port)
  File "/usr/lib/python2.7/smtplib.py", line 310, in connect
    (code, msg) = self.getreply()
  File "/usr/lib/python2.7/smtplib.py", line 361, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
SMTPServerDisconnected: Connection unexpectedly closed

你能帮我解决这个问题吗?

【问题讨论】:

那绝对是错误的端口...另外,更改您的 Gmail 密码,并避免在公共 Stack Overflow 帖子中发布实际凭据... 尝试将电子邮件端口更改为 587 "[Errno 101] Network is unreachable" when trying to send email using Django 的可能重复项 我已经用端口 587 更改但仍然错误 @rnevius 在那个链接中我不了解蓝色主机。 【参考方案1】:

这通常是因为错误的 SENDGRID 凭据而引发的 在这里你必须使用

EMAIL_HOST_USER = 'apikey'

【讨论】:

与 Laenka-Oss 的答案相同,但内容较少。【参考方案2】:

要使用 465 端口,您需要调用 smtplib.SMTP_SSL()。 目前,它调用 smtplib.SMTP() .. 所以,把你的 PORT 从 465 改成 587

如果你想使用 465 端口,

你的EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'

EMAIL_PORT=465

你需要安装django_smtp_ssl

否则你可以保留,

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

EMAIL_PORT=465

【讨论】:

更新:Django >=1.7 包括对带有 SSL/TLS 的 SMTP 的支持;因此 django-smtp-ssl 已过时。 github.com/bancek/django-smtp-ssl【参考方案3】:

我正在使用 AWS SES 并且遇到了同样的问题。

使用端口 587 对我有用。设置与@User0511 几乎相同

【讨论】:

【参考方案4】:

像我一样,如果您部署的 django 应用程序在 heroku 上并且使用 https 意味着您需要端口 465,您不应该忘记在下面将这些相同的值添加到您的 heroku Config Vars。它抛出了“连接意外关闭”错误,直到我不得不添加它。

# settings.py

EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_HOST_USER = 'apikey'
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD')                   
                     # replace here with the long SendGrid API secret code 
                     # xyxyxyxyzzzyz on heroku's Config Vars
EMAIL_PORT =  465 
EMAIL_USE_SSL = True

否则,在 localhost 或开发服务器上调试将正常工作(在 http 下使用端口 587),但在使用 https 的端口 465 下进行部署时无法使用

【讨论】:

【参考方案5】:

对于python3.0+

我找到了解决方法,或者这就是解决方案,django 电子邮件包中存在一些问题。

1)pip install sendgrid-django

2) 在 settings.py 中添加这些以及其他电子邮件配置

  EMAIL_BACKEND = 'sgbackend.SendGridBackend'
  SENDGRID_API_KEY = "YOUR SENDGRID API KEY"
  EMAIL_PORT = 465

3)发送邮件的代码示例(您的可能不同):

from django.core.mail import EmailMessage
send_email = EmailMessage(
    subject=subject,
    body=body,
    from_email=from_email,
    to=to_email,
    reply_to=reply_to,
    headers=headers,

)
send_email.send(fail_silently=fail_silently)

您必须对代码进行更改,因为我只是展示了一个示例。

仅用于调试目的-sendgrid mail send using telnet

【讨论】:

【参考方案6】:

在我的情况下使用smtplib.SMTP_SSL() 解决了这个问题。你可以试试这个。

【讨论】:

【参考方案7】:

请查看此链接:https://code.djangoproject.com/ticket/9575 并尝试通过 shell 发送,它应该可以工作

【讨论】:

以上是关于Django 发送电子邮件:SMTPServerDisconnected:连接意外关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何在django中设置发送邮件

django 使用 django-registration 以 html 格式发送电子邮件

Django 发送电子邮件

使用 django 发送邮件黑猩猩设计的电子邮件

Django 发送电子邮件:SMTPServerDisconnected:连接意外关闭

如何使用 django-mailer 定时发送电子邮件