Django本地测试遇SMTPRecipientsRefused错误:原因及解决方法
嘿,这个SMTP拒绝的问题我之前帮朋友排查过,咱们一步步来理清楚:
为什么会报错?
你看到的错误提示SMTPRecipientsRefused: {u'my.personal@gmail.com': (553, '5.7.1 <admin@mydomain.com>: Sender address rejected: not owned by user support@mydomain.com')}其实已经把原因说透了:
Namecheap的Private Email服务有个硬性要求——发件人地址必须和你登录SMTP服务器的邮箱账号完全一致。
看你的配置就明白冲突点了:
- 你用
support@mydomain.com作为SMTP登录账号(EMAIL_HOST_USER) - 但你把系统默认发件人(
DEFAULT_FROM_EMAIL)和服务器告警邮件发件人(SERVER_EMAIL)都设成了admin@mydomain.com
Namecheap的SMTP服务器不认这个发件地址,因为admin@mydomain.com并不是你当前登录的邮箱用户(你登的是support账号),所以直接把你的邮件请求打回来了。
两种解决办法任你选
办法1:统一发件人地址(最简单快速)
直接把DEFAULT_FROM_EMAIL和SERVER_EMAIL改成和EMAIL_HOST_USER一致就行:
######################## # OTHER EMAIL SETTINGS # ######################## ADMIN_EMAIL = "admin@mydomain.com" SUPPORT_EMAIL = "support@mydomain.com" DEFAULT_FROM_EMAIL = SUPPORT_EMAIL # 改成support账号 SERVER_EMAIL = SUPPORT_EMAIL # 同步修改
这样发件人地址和登录账号完全匹配,Namecheap就不会再拒绝你的请求了。
办法2:给support账号添加发件别名(适合需要用admin邮箱发件的场景)
如果你确实想用admin@mydomain.com作为对外的发件地址,可以登录Namecheap的Private Email后台,给support@mydomain.com账号添加admin@mydomain.com作为发件别名。操作步骤大概是:
- 登录Namecheap的Private Email管理面板
- 找到
support@mydomain.com这个账号,进入它的设置页面 - 找到“发件人别名”或者类似的选项(不同版本界面可能叫法略有不同)
- 添加
admin@mydomain.com作为别名并保存 - 回到Django配置,保持现有
DEFAULT_FROM_EMAIL和SERVER_EMAIL不变就行
测试小技巧
修改完配置后,别急着测密码重置页面,先在本地shell里快速测试邮件发送是否正常:
python manage.py shell
然后在shell里执行这段代码:
from django.core.mail import send_mail send_mail('测试邮件', '这是测试内容', 'support@mydomain.com', ['my.personal@gmail.com'], fail_silently=False)
如果能成功收到测试邮件,说明配置没问题,再去测试密码重置功能就稳了~
内容的提问来源于stack exchange,提问作者Username

