我正在尝试通过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.
请建议!
答案 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
。要实现此目的,请在配置文件中说465
,EMAIL_PORT = 465
和EMAIL_USE_TLS = False
。