DEBUG
设置为False
并在ADMINS
选项下提供任何内容,则每当代码引发500状态代码时,Django都会发送电子邮件。我的电子邮件设置填写正确(因为我可以正常使用send_mail),但每当我故意放置错误的代码时,我会得到我的500.html模板,但没有发送错误电子邮件。什么原因会导致Django不执行此操作?在我的情况下,原因是缺少SERVER_EMAIL设置。
SERVER_EMAIL
的默认值为root@localhost
。但是,包括我的电子邮件提供商在内的许多电子邮件服务器不接受来自这样可疑地址的邮件。它们会悄悄地删除这些邮件。
将发件人电子邮件地址更改为django@my-domain.example
解决了问题。在settings.py
中:
SERVER_EMAIL = 'django@my-domain.example'
另一个可能导致错误的原因是您的ADMINS设置出了问题。以下设置会导致邮件发送给管理员失败但不会有任何提示:
另一种错误的可能性是您的ADMINS设置出现问题。以下设置会导致向管理员发送邮件时静默失败:
ADMINS = (
('your name', 'me@mydomain.example')
)
那有什么问题吗?ADMINS需要是一个元组的元组,因此上面的内容需要格式化为:
ADMINS = (
('your name', 'me@mydomain.example'),
)
注意末尾的逗号。如果没有这个逗号,电子邮件的“to”地址将被格式错误(然后可能会被您的SMTP服务器静默丢弃)。
我也遇到了同样的情况。我创建了一个新的项目和应用程序,它可以正常工作,所以我知道这是我的代码问题。我追踪到了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和向ADMINS发送电子邮件。
另外,LOGGING
配置默认会与DEFAULT_LOGGING
合并,因此有必要查看源代码django.utils.log.DEFAULT_LOGGING
,以了解其他可能对你特定情况产生影响的内容。
disable_existing_loggers': False
可以保留现有的日志记录,但实际上并没有。这修复了它。 - guidos'propagate': False
。 - Manel Clos确保你在settings.py中正确设置了EMAIL_HOST和EMAIL_PORT(这些是指你的SMTP服务器)。可能会假定你在本地主机上运行了一个SMTP服务器。
为了在本地测试,运行Python内置的测试SMTP服务器:
python -m smtpd -n -c DebuggingServer localhost:1025
然后在您的settings.py文件中设置这些值。
EMAIL_HOST='localhost'
EMAIL_PORT=1025
触发500错误,你应该能在Python smtpd终端窗口中看到电子邮件出现。
我的网络托管提供商Webfaction只允许从在管理员面板中明确创建的电子邮件发送电子邮件。 创建一个电子邮件解决了问题。
另外值得注意的一点是,设置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
如果我的解释过于简单,请原谅,但在我的情况下,邮件已经发送,但直接进入了垃圾邮件文件夹。在尝试更复杂的操作之前,请首先检查您的垃圾邮件文件夹。
如果因某种原因您将DEBUG_PROPAGATE_EXCEPTIONS设置为True(默认为False),则发送给管理员的电子邮件将无法正常工作。
我刚刚升级到Django 2.1后遇到了同样的问题,这似乎是因为settings.py
中的ADMINS
部分发生了变化。现在它需要一个元组列表,而不是旧的元组元组。这个方法对我有用。
##### old #####
ADMINS = (
("Your Name", "your_email@company.example")
)
##### new #####
ADMINS = [
("Your Name", "your_email@company.example")
]
关于:https://docs.djangoproject.com/en/2.1/ref/settings/#admins
试试这个
# ./manage shell
>>> from django.core.mail import send_mail
>>> send_mail('Subject here', 'Here is the message.', 'from@example.com',['to@example.com'], fail_silently=False)
使用实际可接收电子邮件的to@example.com
。