Django生产环境联系表单邮件发送失败,错误邮件可正常发送
排查Django生产环境联系表单邮件无法发送的问题
这种情况我之前也碰到过好几次,结合你的描述来看,管理员错误邮件能正常发送,说明生产环境的基础邮件配置(比如EMAIL_HOST、EMAIL_PORT这类核心参数)是没问题的,问题大概率出在联系表单的邮件逻辑细节或者特定配置上,咱们一步步来排查:
1. 先检查联系表单的发送代码细节
- 先确认你有没有在联系表单视图里硬编码了开发环境的邮件后端?比如开发时为了测试写了
backend='django.core.mail.backends.console.EmailBackend',上线后没删掉?如果是这样,生产环境的邮件只会输出到控制台,不会实际发送,而且不会抛出任何报错。 - 检查邮件的发件人格式:很多邮件服务商禁止用用户输入的邮箱作为发件人(防止代发垃圾邮件),你可以把发件人固定为你的系统邮箱,把用户的邮箱放在
reply_to字段里,同时把fail_silently设为False——这样一旦有错误会直接抛出异常,方便在日志里看到具体问题:send_mail( subject=用户提交的标题, message=用户提交的内容, from_email='你的系统邮箱 <your-system-email@example.com>', recipient_list=['管理员邮箱@example.com'], reply_to=[用户输入的邮箱], # 用户邮箱放在这里,方便回复 fail_silently=False, # 关键:不要静默失败,有问题直接抛错 )
2. 开启Django邮件的详细日志
默认日志可能只记录请求,你可以在生产环境的settings.py里添加邮件相关的日志配置,捕捉发送过程的细节:
LOGGING = { # 保留你原有的其他配置... 'handlers': { 'mail_debug': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': '/var/log/django/mail-debug.log', # 换成你服务器上的有效路径 }, }, 'loggers': { 'django.core.mail': { 'handlers': ['mail_debug'], 'level': 'DEBUG', 'propagate': False, }, }, }
之后再提交表单,查看这个日志文件,就能看到邮件是连接失败、被服务器拒绝,还是已经成功发送了。
3. 检查生产环境的邮件服务器限制
- 有些云服务商(比如AWS、阿里云)会默认封禁25端口的出站流量,如果你用的是25端口,试试换成465(SSL)或者587(TLS)端口,同时对应开启
EMAIL_USE_SSL或EMAIL_USE_TLS:EMAIL_USE_TLS = True EMAIL_PORT = 587 # 或者 EMAIL_USE_SSL = True EMAIL_PORT = 465 - 去邮件服务商的后台看看有没有拦截记录:比如你的系统邮箱是不是触发了发送频率限制,或者邮件内容被判定为垃圾邮件了。另外也检查下管理员邮箱的垃圾箱,有时候邮件其实发成功了,只是被归类到垃圾邮件里了。
4. 手动在生产服务器测试邮件发送
SSH到生产服务器,进入Django的shell手动发一封测试邮件,验证基础配置是否正常:
python manage.py shell
然后执行:
from django.core.mail import send_mail send_mail( '测试联系表单邮件', '这是测试内容', '你的系统邮箱 <your-system-email@example.com>', ['管理员邮箱@example.com'], fail_silently=False )
如果这一步成功,说明邮件配置没问题,问题肯定出在你的联系表单视图代码里;如果失败,会直接抛出异常,根据异常信息就能快速定位(比如认证失败、连接超时等)。
内容的提问来源于stack exchange,提问作者Yunti
相关产品推荐
相关产品推荐

