Django未向管理员发送邮件

80 投票
22 回答
33469 浏览
提问于 2025-04-15 14:16

根据文档,如果把DEBUG设置为False,并且在ADMINS设置中提供了邮箱信息,那么每当代码出现500错误时,Django就会发送一封邮件。我已经正确填写了邮件设置(因为我可以正常使用send_mail),但是每当我故意写错代码时,我只看到500.html这个模板,却没有收到错误邮件。这可能是什么原因导致Django不发送邮件呢?

22 个回答

37

我之前也遇到过类似的情况。我创建了一个新项目和应用,结果一切正常,所以我知道问题出在我的代码上。我找到问题的根源是在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的源代码会很有帮助,这样你可以理解还有哪些因素可能影响到你当前的情况。

45

另一个可能出错的地方是你的 ADMINS 设置。如果这个设置不对,发送邮件给管理员的功能可能会悄悄失败:

ADMINS = (
  ('your name', 'me@mydomain.example')
)

这有什么问题呢?其实,ADMINS 需要是一个包含元组的元组,所以上面的格式需要改成:

ADMINS = (
  ('your name', 'me@mydomain.example'),
)

注意最后的逗号。如果没有这个逗号,邮件的 '收件人' 地址格式就会不正确(然后可能会被你的 SMTP 服务器悄悄丢弃)。

118

在我的情况下,问题是因为缺少了 SERVER_EMAIL 这个设置。

默认情况下,SERVER_EMAIL 的值是 root@localhost。但是很多邮件服务器,包括我的邮件提供商,都不接受这种看起来可疑的邮箱地址。他们会默默地把这些邮件丢掉。

把发件人的邮箱地址改成 django@my-domain.example 后,问题就解决了。在 settings.py 文件中:

SERVER_EMAIL = 'django@my-domain.example'

撰写回答