11

我正在尝试从基于 django 的网站发送电子邮件,但遇到了一些问题 - SMTPServerDisconnected 连接意外关闭我的 setting.py:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.zoho.com'
EMAIL_PORT = 465
EMAIL_HOST_USER = 'me@mydomain.com'
EMAIL_HOST_PASSWORD = 'XXXXXX'

我正在使用 django 1.5.1,python 2.7.3。任何人都可以解决这个问题?

谢谢你的帮助

4

10 回答 10

27

我在连接超时方面遇到了同样的问题。在我看来,默认 Django SMTP 库中的 SSL 套接字存在一些问题。在 Django 的开发版本中,有一个选项可以设置EMAIL_USE_SSL = True,它允许使用隐式TLS 连接(与由 指定的显式EMAIL_USE_TLS = True相反)。通常前者(隐式)使用端口 465,而后者(显式)使用端口 587。请参阅Django 文档——将开发版本与 1.5 版本进行比较。请注意,该选项EMAIL_USE_SSL在 1.5 中不存在。

因此,问题在于Zoho 的默认 SMTP 服务器使用端口 465 并且需要 SSL,但该EMAIL_USE_TLS选项不满足此要求。(旁注:也许尝试将此选项设置为False?我没有尝试过。)无论如何,我最好的猜测是这是一个特定于 Django 的问题,可能要到 1.7 才能解决。

至于您的问题的解决方案:您绝对可以使用 Python (2.7.1) 访问 Zoho 的 SMTP 服务器smtplib(参见下面的脚本)。所以,如果你想要一个稍微不优雅的修复,你可以走那条路。我已经在 Django 1.5.1 中测试过它,它就像一个魅力。

这是独立的 Python 脚本(可以改编为在 Django 项目中使用):

import smtplib
from email.mime.text import MIMEText

# Define to/from
sender = 'sender@example.com'
recipient = 'recipient@example.com'

# Create message
msg = MIMEText("Message text")
msg['Subject'] = "Sent from python"
msg['From'] = sender
msg['To'] = recipient

# Create server object with SSL option
server = smtplib.SMTP_SSL('smtp.zoho.com', 465)

# Perform operations via server
server.login('sender@example.com', 'password')
server.sendmail(sender, [recipient], msg.as_string())
server.quit()

在将上述脚本插入您的 Web 项目之前,请尝试检查上述脚本是否使用您的 Zoho 凭据运行。祝你好运!

于 2013-08-22T09:10:05.233 回答
13

就我而言,我收到的是:

SMTPServerDisconnected: Connection unexpectedly closed

使用这些设置:

EMAIL_PORT = 465
EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'
EMAIL_USE_SSL = True
EMAIL_HOST = 'smtp.zoho.com'
EMAIL_HOST_USER = 'dio@streetbarz.com'
EMAIL_HOST_PASSWORD = 'password'

设置 server.set_debuglevel(1) 后,我发现我的 DEFAULT_FROM_EMAIL 与 EMAIL_HOST_USER 不同

DEFAULT_FROM_EMAIL = "dio@streetbarz.com"

添加解决了问题。

于 2015-04-29T14:47:34.763 回答
4

如果您想通过电子邮件获取错误报告,B.Welsh 的回答并不能解决问题。

所以对于任何需要它的人:

Zoho 的 TLS 端口为 587,如其SMTP 服务器配置页面中所定义。该页面还指出,您不能使用与您正在使用的电子邮件不同的“发件人”,否则将无法通过。

您需要settings.py通过电子邮件获取错误报告的代码:

DEBUG = False
TEMPLATE_DEBUG = DEBUG
ADMINS = (('Yourname', 'youremail@yourdomain.com'),)
SERVER_EMAIL = constants.SENDER_EMAIL

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.zoho.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = constants.SENDER_EMAIL
EMAIL_HOST_PASSWORD = constants.EMAIL_PASSWORD
于 2014-10-16T20:15:38.907 回答
1

我有一种使用 django 1.6.8 发送的方法。首先,您必须安装 GitHub 中提供的 django-smtp-ssl。运行代码:

pip install django-smtp-ssl

并将以下内容添加到您的 settings.py 中:

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'   
EMAIL_HOST = 'mail.example.com'   
EMAIL_PORT = 465

查看链接https://github.com/bancek/django-smtp-ssl

于 2014-12-30T16:31:52.783 回答
1

我发现 Zoho 不喜欢标准的 django.core.mail.send_mail 方法。该问题似乎与内容类型有关。有多种方法可以解决这个问题,我的方法是切换到 EmailMessage,它具有更丰富的界面并允许您在标头中传递 Content-type。

从此切换:

from django.core import mail
mail.send_mail(subject='Hello',
               message='Body goes here',
               from_email='user@example.com',
               recipient_list=['user@example.com'])

对此:

from django.core.mail import EmailMessage
email = EmailMessage(
    subject='Hello',
    body='Body goes here',
    from_email='user@example.com',
    to=['user@example.com'],
    reply_to=['user@example.com'],
    headers={'Content-Type': 'text/plain'},
)
email.send()

其他 Zoho 邮件设置:

EMAIL_HOST = 'smtp.zoho.com'
EMAIL_HOST_USER = 'user@example.com'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_USE_SSL = False

这解决了我的 Zoho 邮件发送问题,并且与 django-yubin 等其他队列插件兼容。

于 2016-10-22T18:06:19.450 回答
1

与问题有点无关,但请注意,Zoho Mail的免费计划不再提供 IMAP/POP 支持。希望我可以通过这篇文章节省一些调试时间。

```
FREE PLAN
Up to 25 Users
5GB* /User, 25MB Attachment Limit
Webmail access only+. Single domain hosting.
```

+IMAP/POP 支持仅适用于付费计划。

https://www.zoho.com/workplace/pricing.html?src=zmail

旧的免费计划(2018 年之前注册???)似乎仍然提供 IMAP/POP 支持

来源:https ://help.zoho.com/portal/community/topic/zoho-free-tier-pop-imap-activesync-no-longer-free

于 2018-05-30T21:57:13.950 回答
1

根据此链接上的讨论,我们还需要检查正确的 smtp url。就我而言,我使用的是 smtp.zoho.com,但正确的选择是 smtp.zoho.in。希望有帮助。您可以在登录 zoho 并检查域 url 后发现。

于 2021-03-15T10:27:48.910 回答
0

您的 stmp 电子邮件后端类可能很旧。去

python/site-packages/django/core/mail/stmp.py

文件并确保您有 USE_SSL 作为选项。如果没有,只需将整个文件替换为一个文件即可。干得好。在 ZOHO 为我工作。

stmp.py 文件

请原谅这个回复的格式不好,这是我对 SO 的第一个贡献......

于 2013-11-10T16:49:55.347 回答
0

尝试 1 而不是 True:

EMAIL_USE_TLS = 1
EMAIL_PORT = 465
EMAIL_HOST = 'smtp.zoho.com'
EMAIL_HOST_USER = 'me@mydomain.com'
EMAIL_HOST_PASSWORD = 'XXXXXX'

或者尝试备用端口:

EMAIL_USE_TLS = 1
EMAIL_PORT = 587
EMAIL_HOST = 'smtp.zoho.com'
EMAIL_HOST_USER = 'me@mydomain.com'
EMAIL_HOST_PASSWORD = 'XXXXXX'
于 2013-08-20T14:52:54.153 回答
0

Zoho Mail 的 SMTP 配置设置 - TLS 使用端口 587 和 ssl 465。EMAIL_PORT = 587如果您使用 EMAIL_USE_TLS = True,请使用

于 2016-10-10T10:27:48.630 回答