Django未向管理员发送邮件
根据文档,如果把DEBUG
设置为False
,并且在ADMINS
设置中提供了邮箱信息,那么每当代码出现500错误时,Django就会发送一封邮件。我已经正确填写了邮件设置(因为我可以正常使用send_mail),但是每当我故意写错代码时,我只看到500.html这个模板,却没有收到错误邮件。这可能是什么原因导致Django不发送邮件呢?
22 个回答
我之前也遇到过类似的情况。我创建了一个新项目和应用,结果一切正常,所以我知道问题出在我的代码上。我找到问题的根源是在settings.py里的LOGGING字典。几周前我为了和Sentry一起使用做了一些修改,但不知道为什么,错误今天才开始出现。我把它改回原来的设置,结果就能正常工作了:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
然后,我慢慢地做了一些修改,最终让它和Sentry一起工作,并且还可以给管理员发送邮件。
另外,LOGGING
的配置默认会和DEFAULT_LOGGING
合并,所以查看一下django.utils.log.DEFAULT_LOGGING的源代码会很有帮助,这样你可以理解还有哪些因素可能影响到你当前的情况。
另一个可能出错的地方是你的 ADMINS 设置。如果这个设置不对,发送邮件给管理员的功能可能会悄悄失败:
ADMINS = (
('your name', 'me@mydomain.example')
)
这有什么问题呢?其实,ADMINS 需要是一个包含元组的元组,所以上面的格式需要改成:
ADMINS = (
('your name', 'me@mydomain.example'),
)
注意最后的逗号。如果没有这个逗号,邮件的 '收件人' 地址格式就会不正确(然后可能会被你的 SMTP 服务器悄悄丢弃)。
在我的情况下,问题是因为缺少了 SERVER_EMAIL 这个设置。
默认情况下,SERVER_EMAIL
的值是 root@localhost
。但是很多邮件服务器,包括我的邮件提供商,都不接受这种看起来可疑的邮箱地址。他们会默默地把这些邮件丢掉。
把发件人的邮箱地址改成 django@my-domain.example
后,问题就解决了。在 settings.py
文件中:
SERVER_EMAIL = 'django@my-domain.example'