通过Zoho SMTP发送电子邮件

13
我正在尝试从基于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,有人可以解决这个问题吗?

谢谢你的帮助

10个回答

28

我也遇到了连接超时的问题。在默认的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)的smtplib访问Zoho的SMTP服务器(请参见下面的脚本)。因此,如果您想要一个稍微不太优雅的解决方法,可以采用这种方式。我已在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()

在将上述脚本嵌入您的网络项目之前,请确保使用您的Zoho凭据运行它。祝您好运!


1
这个方法对我有效 :) 我该如何在消息中发送HTML内容? - madhu131313
1
运行得非常好。另外:如果你想发送邮件给多个人,只需更改两行代码: msg['To'] = 'u1@ex.com;u2@ex.com'server.sendmail(sender, ['u1@ex.com', 'u2@ex.com'], msg.as_string()) - Rushi Agrawal
@ZenOut 你需要使用多部分电子邮件..请参见 https://docs.python.org/2/library/email-examples.html#id5 - Coderaemon

14
在我的情况下,我收到了这样的信息:
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"

加上那个修正后问题就解决了。


2
@diofeher 谢了,兄弟!这个解决了我的问题!你真值得一拥抱、一杯咖啡、或者其他什么东西! - jfunez
这对我有用,只要确保发件人地址相同,它就可以工作,无论我多么努力... - AlejandroVK

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

1
我发现Zoho不支持标准的django.core.mail.send_mail方法。问题似乎与Content-type有关。你可以采用多种方法来解决这个问题,我的方法是切换到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)兼容。

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


1

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


1
根据链接上的讨论,我们还需要检查正确的smtp网址。在我的情况下,我使用的是smtp.zoho.com,然而正确的选择是smtp.zoho.in。希望这能有所帮助。您可以在登录zoho并检查域名url后找到它。

1

与问题略有关联,但请注意Zoho Mail的免费计划不再提供IMAP/POP支持。希望这篇文章能够为您节省一些调试时间。

```
FREE PLAN
Up to 25 Users
5GB* /User, 25MB Attachment Limit
Webmail access only+. Single domain hosting.
```
< p >< em >+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


0

你的SMTP邮件后端类可能过时了。请前往

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

请检查文件并确保将USE_SSL作为选项。如果没有,请用一个包含该选项的文件替换整个文件。这是文件。我在ZOHO上使用它成功了。

stmp.py文件

对不起,我的回答格式不太好,这是我在SO上的第一次贡献...


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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接