在Django中使用SMTP发送邮件失败的问题求助
Django SMTP邮件发送失败排查方案
1. 先排除网络与SMTP服务器连通问题
直接用Python原生脚本测试SMTP连接,绕过Django,确认基础通信是否正常:
import smtplib from email.mime.text import MIMEText # 测试Gmail配置 try: server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login('你的Gmail邮箱地址', '你的应用专用密码') msg = MIMEText('这是一封测试邮件') msg['Subject'] = 'Django邮件测试' msg['From'] = '你的Gmail邮箱地址' msg['To'] = '收件人邮箱地址' server.sendmail('你的Gmail邮箱地址', ['收件人邮箱地址'], msg.as_string()) server.quit() print('Gmail测试发送成功') except Exception as e: print(f'Gmail测试失败: {str(e)}') # 测试Outlook配置 try: server = smtplib.SMTP('smtp-mail.outlook.com', 587) server.starttls() server.login('你的Outlook邮箱地址', '你的Outlook密码/应用密码') msg = MIMEText('这是一封测试邮件') msg['Subject'] = 'Django邮件测试' msg['From'] = '你的Outlook邮箱地址' msg['To'] = '收件人邮箱地址' server.sendmail('你的Outlook邮箱地址', ['收件人邮箱地址'], msg.as_string()) server.quit() print('Outlook测试发送成功') except Exception as e: print(f'Outlook测试失败: {str(e)}')
运行脚本后,根据报错信息定位核心问题:比如认证失败说明密码/应用密码错误,连接超时说明网络端口被屏蔽。
2. Django配置细节核查
- 确认
EMAIL_HOST_USER与DEFAULT_FROM_EMAIL完全一致,包括完整邮箱后缀(如xxx@gmail.com不能省略) - Outlook可尝试切换端口与加密方式:
EMAIL_PORT = 465 EMAIL_USE_SSL = True EMAIL_USE_TLS = False - 检查settings.py中是否有其他代码覆盖
EMAIL_BACKEND配置,确保未被第三方库或自定义代码修改 - 在Django Shell中测试发送,获取具体异常:
运行python manage.py shell,执行以下代码:from django.core.mail import send_mail send_mail( '测试主题', '测试内容', '你的发件邮箱', ['收件人邮箱'], fail_silently=False, # 设为False才能看到详细报错信息 )
3. 开发环境特殊问题排查
- 本地网络可能存在防火墙/代理拦截SMTP端口(587/465),尝试切换手机热点测试
- 用telnet验证端口连通性:
telnet smtp.gmail.com 587,如果返回220 smtp.gmail.com ESMTP说明端口可访问,否则是网络封锁问题
4. 邮箱账号额外设置
- Gmail:
- 确认应用密码是开启双因素认证后生成的,且选择了「邮件」类型的应用
- 关闭「不太安全的应用访问」选项(应用密码是该选项的替代方案,开启反而可能冲突)
- Outlook:
- 如果账号开启了「安全默认值」,需要生成应用密码替代原密码使用
- 检查收件人邮箱的黑名单设置,确认发件人未被拦截
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

