python Django发送邮件:SMTP服务器已断开连接:连接意外关闭

s2j5cfk0  于 2023-01-04  发布在  Python
关注(0)|答案(9)|浏览(487)

你好,我想发送电子邮件激活使用django注册redux。
this is my setting.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导入发送邮件
发送邮件('测试','这是一个测试','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

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

8hhllhi2

8hhllhi21#

要使用端口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
rwqw0loc

rwqw0loc2#

对于python3.0+
我找到了一个变通方法,或者这可能是解决方案,在django的电子邮件包中有一些问题。
1)pip安装发送网格-Django
2)在www.example.com中添加这些配置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

bwleehnv

bwleehnv3#

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

k7fdbhmy

k7fdbhmy4#

在我的例子中,使用smtplib.SMTP_SSL()可以解决这个问题。

ivqmmu1c

ivqmmu1c5#

像我一样,如果你的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

如果不这样做,在本地主机或开发服务器上进行调试将正常工作(使用http下的端口587),但在使用https的端口465下进行部署时将无法正常工作

ezykj2lf

ezykj2lf6#

我正在使用AWS SES,遇到了同样的问题。
使用端口587对我很有效。设置与@User0511几乎相同

lztngnrs

lztngnrs7#

在我的例子中,问题是我使用了我的API作为EMAIL_HOST_PASSWORD,然后我通过https://app.mailgun.com/app/sending/domains/找到了我的SMPT密码,单击我的域名,然后在SMPT上选择

yrdbyhpb

yrdbyhpb8#

通常会引发此问题,因为您必须在此处使用错误的SENDGRID凭据
电子邮件主机用户= 'apikey'

h79rfbju

h79rfbju9#

我当时正在localhost上用Gmail SMTP服务器进行开发和测试,遇到了这个错误。我想通了这是因为我在EMAIL_USE_TLS = True配置上使用了EMAIL_PORT = 465
EMAIL_PORT = 465是SSL端口配置,应该与EMAIL_USE_SSL = True配置一起使用,而不是在EMAIL_USE_TLS = True配置上使用。
因此,任何人,将遇到这个问题,在未来与同样的错误,我应该改变,一切都应该工作正常。下面是什么完整的SMTP配置看起来像我:

# Email server configuration
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'your_gmail_account@gmail.com'
EMAIL_HOST_PASSWORD = 'xxxxxxxxxxxxxxxx'
EMAIL_PORT = 465
EMAIL_USE_SSL = True

还要注意的是,在Gmail上使用EMAIL_PORT = 587EMAIL_USE_TLS = True的TLS对我来说不起作用,所以我不得不改用SSL,它起作用了。

相关问题