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

Error sending email in django through gmail

我正在尝试通过 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.    

求推荐!

我不懂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 而不是 HELO 这是另一个命令)。

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

所以我首先建议您在自己的位置重复这个简单的测试。那么,

  • 如果你得到和我一样的结果,特别是如果你得到的输出也包含行 250-STARTTLS,除了 Django 本身的错误之外,绝对没有解释这里发生了什么。您使用的是最新版本吗?在这里我帮不了你,因为我从来没有使用过它,我对此一无所知。

  • 如果在您得到的输出中 250-STARTTLS 不是 ,则必须继续进行一些完全奇怪的事情。正如我的示例所示,STARTTLS 至少在我这里的客户中得到支持,并且没有理由不在你那里的客户中得到支持。

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

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

如果你还没有发现问题,你可以进行以下操作:

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

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