Django项目使用SMTP协议发送邮件时出现TimeoutError问题求助
解决Django使用Gmail SMTP发送邮件时的TimeoutError问题
我来帮你排查这个SMTP连接超时的问题,结合你用Gmail的场景,大概率是以下几个原因导致的,咱们逐个解决:
1. 替换为Gmail应用专用密码(最常见原因)
Gmail现在已经默认禁止使用普通密码登录第三方应用了,你必须先开启两步验证,然后生成一个应用专用密码来替代EMAIL_HOST_PASSWORD里的普通密码:
- 登录你的Google账号,进入「安全」设置页面
- 确认「两步验证」已经开启(如果没开,先按照提示完成开启)
- 在「应用专用密码」板块,生成一个针对Django的专用密码(可以随便命名,比如“Django邮件”)
- 把这个生成的16位密码复制到settings.py的
EMAIL_HOST_PASSWORD中
注意:“不太安全的应用访问”选项现在Google已经逐步停用了,不要再依赖这个方案。
2. 排查网络与防火墙拦截
错误WinError 10060本质是连接超时,很可能是你的网络环境(比如公司内网、校园网)或者本地防火墙/杀毒软件拦截了SMTP请求:
- 先在命令行测试端口连通性:执行
telnet smtp.gmail.com 587,如果提示无法连接,那就是网络端口被屏蔽了,需要联系网络管理员开放587端口,或者暂时关闭本地防火墙试试
3. 核对SMTP配置细节
再仔细检查一遍settings.py里的配置,确保没有拼写错误:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = '你的完整邮箱地址(比如xxx@gmail.com)' EMAIL_HOST_PASSWORD = '生成的应用专用密码'
- 特别注意:
EMAIL_HOST_USER必须是完整的邮箱地址,不能只写用户名部分
4. 尝试切换到SSL端口
如果587端口的TLS连接还是不行,可以试试改用465端口的SSL连接,修改配置如下:
EMAIL_PORT = 465 EMAIL_USE_SSL = True EMAIL_USE_TLS = False
修改后记得重启Django服务器再测试发送邮件。
测试建议
你可以在Django shell里快速测试邮件发送,避免每次都运行整个项目:
- 打开命令行,进入项目根目录,执行
python manage.py shell - 输入以下代码测试:
from django.core.mail import send_mail send_mail( '测试邮件', '这是一封测试邮件', '你的邮箱地址', ['收件人邮箱地址'], fail_silently=False, )
如果还有错误,新的报错信息会帮你更精准地定位问题。
内容的提问来源于stack exchange,提问作者Shahrear Abedin
相关产品推荐
相关产品推荐

