通过gmail在django中发送电子邮件时出错

时间:2017-09-26 08:05:09

标签: python django email gmail starttls

我正在尝试通过gmail使用django发送邮件。

以下是我的settings.py代码:

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'me@mycompany.com'
EMAIL_HOST_PASSWORD = 'mypassword'
EMAIL_USE_TLS = True

view.py我正在使用方法send_mail():

send_mail(subject, contact_message, emailfrom, emailto)

当我执行代码&在我的联系表格中输入详细信息点击提交。 我收到以下错误:

smtplib.SMTPNotSupportedError: STARTTLS extension not supported by server.    

请建议!

1 个答案:

答案 0 :(得分:0)

我不了解Gmail,我也不了解Django,但我希望以下解释能为您提供帮助。

快速分析显示您的情况有点奇怪。有一种简单的方法可以测试SMTP服务器提供的功能/扩展:获取命令行telnet客户端,连接到相关服务器并查询其功能。以下显示了如何在Linux中完成此操作,但它与Windows基本相同:

root@spock:~# telnet smtp.gmail.com 587              <-- Type this on the command line
Trying 74.125.71.109...                              <-- This is output
Connected to gmail-smtp-msa.l.google.com.            <-- This is output
Escape character is '^]'.                            <-- This is output
220 smtp.gmail.com ESMTP s196sm2489285wmb.6 - gsmtp  <-- This is output
EHLO localhost.com                                   <-- **YOU** must type this
250-smtp.gmail.com at your service, [46.83.27.246]   <-- The following lines are output
250-SIZE 35882577
250-8BITMIME
250-STARTTLS                                         <-- NOTE THIS LINE
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8

这里的关键点是telnet命令的第二个命令行参数,它指定要使用的端口,以及您键入的EHLO命令(确保您确实键入EHLO而不是{{1这是另一个命令)。

从示例中可以看出,HELO肯定支持STARTTLS命令/扩展。我在正常环境中对此进行了测试;我的Linux机箱是NAT路由器的后面,这是私人家庭和小公司的常用设置。没有端口转发或其他特殊配置。

所以我建议的第一件事就是你在你的地方重复这个简单的测试。然后,

  • 如果你得到与我相同的结果,特别是如果你得到的输出也包含行smtp.gmail.com,除了Django本身的错误之外,绝对没有解释会发生什么。您使用的是最新版本吗?我无法帮助你,因为我从来没有使用它,我对此一无所知。

  • 如果您获得的输出中的行250-STARTTLS ,则必须继续使用一些非常奇怪的内容。正如我的示例所示,250-STARTTLS 至少为我所在地的客户提供支持,并且没有理由不为您所在地的客户提供支持。

  • 例外情况可能是中国或政府试图阻止使用加密的类似国家。所以我可以想象,当来自这样一个国家的客户端连接时,Google会根据地理阻止功能关闭STARTTLS扩展程序。但我真的不知道!鼓励那些做评论的人......

  • 也许您正在使用代理来干扰客户端(Django)与SMTP服务器之间的通信。

我仍然没有发现问题,你可以做以下事情:

  • 您可以尝试端口STARTTLS而不是端口25。我已验证587也支持端口smtp.gmail.com上的STARTTLS。对于大多数电子邮件客户端,使用端口25或端口25并不重要。您应该能够通过在配置文件中说587来使Django使用端口25

  • 您可以尝试使用隐式EMAIL_PORT = 25(通常称为TLS)而不是显式SSL。通常用于此的端口是STARTTLS。要实现此目的,请在配置文件中说465EMAIL_PORT = 465EMAIL_USE_TLS = False