通过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 = 465
、EMAIL_USE_TLS = False
和 EMAIL_USE_SSL = True
。
我正在尝试通过 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 = 465
、EMAIL_USE_TLS = False
和EMAIL_USE_SSL = True
。