Django项目无法发送注册确认邮件问题求助
Django邮箱确认邮件无法发送的排查与解决
一、代码层面的核心错误:收件人邮箱为空
你的views.py中存在致命问题:注册流程里用户还未登录,request.user是匿名用户,request.user.email的值为空,导致邮件没有正确的收件人地址,自然无法发送。
替换为刚创建的用户邮箱:
# 替换原有的to_email行 to_email = user.email # 或者用form.cleaned_data['email'],确保取到用户提交的邮箱
同时,发件人邮箱from_email要与settings.py中配置的EMAIL_HOST_USER保持一致,避免被邮件服务商拦截:
from django.conf import settings # 修改from_email from_email = settings.EMAIL_HOST_USER
二、Gmail SMTP授权配置问题
Gmail目前不允许直接使用账号密码通过SMTP服务发送邮件,必须做以下配置:
- 开启Google账号的两步验证
- 生成应用专用密码(App Password),将其替换
settings.py中的EMAIL_HOST_PASSWORD - 若未开启两步验证,需开启不太安全的应用访问(此选项已逐步停用,优先推荐应用专用密码)
修正后的settings.py配置示例:
DEBUG = True EMAIL_HOST = 'smtp.gmail.com' EMAIL_HOST_USER = 'your-gmail-address@gmail.com' EMAIL_HOST_PASSWORD = 'your-app-specific-password' # 这里填应用专用密码,不是普通密码 EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
三、调试与错误排查
1. 控制台验证邮件内容
临时切换到控制台邮件后端,验证邮件的收件人、主题、内容是否正确:
# 在settings.py中临时修改 EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
此时邮件不会实际发送,而是将内容打印到终端,你可以确认所有参数是否正确。
2. 捕获发送异常
添加异常捕获,查看具体错误信息:
try: email = EmailMessage(subject, message, from_email, [to_email]) send_status = email.send() print(f"邮件发送状态: {send_status}") # 1表示成功,0表示失败 except Exception as e: print(f"邮件发送失败原因: {str(e)}") messages.error(request, "邮件发送失败,请稍后重试")
四、其他排查点
- 检查收件人的垃圾邮件文件夹:邮件可能被判定为垃圾邮件
- 确认服务器网络可访问
smtp.gmail.com:587,无防火墙或代理拦截 - 验证用户模型中
email字段已正确保存,不为空值
内容的提问来源于stack exchange,提问作者Adryan Taborda
相关产品推荐
相关产品推荐

