根据文档,如果DEBUG设置为False并且在设置下提供了某些内容ADMINS,Django将在代码提出500状态代码时发送电子邮件.我已经正确填写了电子邮件设置(因为我可以使用send_mail)但每当我故意提出错误代码时,我都会获得500.html模板,但不会发送错误电子邮件.什么可能导致Django不这样做?
gee*_*ekQ 94
在我的情况下,原因是缺少SERVER_EMAIL设置.
默认SERVER_EMAIL是root@localhost.但许多电子邮件服务器(包括我的电子邮件提供商)都不接受来自此类可疑地址的电子邮件 他们默默地放下电子邮件.
更改发件人电子邮件地址以django@my-domain.com解决问题.在settings.py:
SERVER_EMAIL = 'django@my-domain.com'
Run Code Online (Sandbox Code Playgroud)
wxg*_*rge 37
出现错误的另一种可能性是您的ADMINS设置出现问题.以下设置将导致向管理员发送邮件安静地失败:
ADMINS = (
('your name', 'me@mydomain.com')
)
Run Code Online (Sandbox Code Playgroud)
这有什么问题?ADMINS需要成为一个元组元组,所以上面需要格式化为
ADMINS = (
('your name', 'me@mydomain.com'),
)
Run Code Online (Sandbox Code Playgroud)
请注意尾随逗号.如果没有失败的逗号,电子邮件中的"到"地址将被错误地格式化(然后可能由SMTP服务器静默丢弃).
Fur*_*tor 33
我有同样的情况.我创建了一个新的项目和应用程序,它工作,所以我知道这是我的代码.我将它跟踪到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,
},
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我慢慢地做了一些改变,并让它与Sentry合作,并通过电子邮件发送ADMINS.
此外,LOGGING配置DEFAULT_LOGGING默认情况下会合并,因此查看源代码django.utils.log.DEFAULT_LOGGING以了解其他可能对您的特定情况有何影响非常有用.
Cat*_*hal 16
确保您在settings.py中设置了EMAIL_HOST和EMAIL_PORT(这些是指您的SMTP服务器).可能假设您在localhost上运行了SMTP服务器.
要在本地测试,请运行Python的内置测试SMTP服务器:
python -m smtpd -n -c DebuggingServer localhost:1025
Run Code Online (Sandbox Code Playgroud)
然后在settings.py中设置这些值
EMAIL_HOST='localhost'
EMAIL_PORT=1025
Run Code Online (Sandbox Code Playgroud)
触发500错误,您应该看到电子邮件出现在python smtpd终端窗口中.
这里值得注意的另一件事是,handler500如果来自视图的响应没有 500 的状态代码,则设置可能会绕过在 500 上发送错误的机制。如果您有一个handler500设置,则在该视图中以类似这样的方式进行响应。
t = loader.get_template('500.html')
response = HttpResponseServerError(
t.render(RequestContext(request, {'custom_context_var':
'IT BROKE OMG FIRE EVERYONE'})))
response.status_code = 500
return response
Run Code Online (Sandbox Code Playgroud)