根据文档,如果DEBUG
设置为,False
并且在设置下提供了某些内容ADMINS
,则只要代码引发500状态代码,Django就会发送一封电子邮件。我已经正确填写了电子邮件设置(可以很好地使用send_mail),但是每当有意输入错误代码时,我都会得到500.html模板,但不会发送错误电子邮件。是什么导致Django无法做到这一点?
根据文档,如果DEBUG
设置为,False
并且在设置下提供了某些内容ADMINS
,则只要代码引发500状态代码,Django就会发送一封电子邮件。我已经正确填写了电子邮件设置(可以很好地使用send_mail),但是每当有意输入错误代码时,我都会得到500.html模板,但不会发送错误电子邮件。是什么导致Django无法做到这一点?
Answers:
就我而言,原因是缺少SERVER_EMAIL设置。
的默认SERVER_EMAIL
值为root@localhost
。但是,包括我的电子邮件提供商在内的许多电子邮件服务器都不接受来自此类可疑地址的电子邮件。他们默默地删除了电子邮件。
更改发件人电子邮件地址即可django@my-domain.com
解决问题。在settings.py
:
SERVER_EMAIL = 'django@my-domain.com'
错误的另一种可能性是您的ADMINS设置有问题。以下设置将导致向管理员发送邮件悄无声息地失败:
ADMINS = (
('your name', 'me@mydomain.com')
)
怎么了 那么ADMINS必须是一个元组的元组,因此以上代码需要格式化为
ADMINS = (
('your name', 'me@mydomain.com'),
)
请注意尾随逗号。如果没有失败的逗号,则电子邮件上的“收件人”地址将被错误地设置格式(然后可能被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
可以保留现有的日志记录,但事实并非如此。这样就解决了。
'propagate': False
确保在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 handler500
,则设置可能会绕过在500上发送错误的机制。
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 1.11升级到Django 2.1后出现了同样的问题。显然,其中的ADMINS
各节settings.py
有所变化。现在需要一个元组列表,而不是旧的元组列表。这对我来说是固定的。
##### old #####
ADMINS = (
("Your Name", "your_email@company.com")
)
##### new #####
ADMINS = [
("Your Name", "your_email@company.com")
]
回复:https://docs.djangoproject.com/en/2.1/ref/settings/#admins
这个问题使我很烦恼,以至于无法激励他。我在这里提供解决这个问题的步骤(简而言之):
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'errors_file': {
'level': 'ERROR',
'class': 'logging.FileHandler',
'filename': 'logs/debug.log',
},
},
'loggers': {
'django': {
'handlers': ['errors_file'],
'level': 'ERROR',
'propagate': True,
},
},
}
就我而言,导航到测试页面并没有在项目根目录的logs目录下的debug.log文件中生成输出。这表明记录器无法达到错误“级别”。
SERVER_EMAIL
为我解决的问题,但在官方文档中未提及……
尽管已经有一段时间了,但这是我的回应,以便将来其他人可以从中受益。
就我而言,发生错误时阻止电子邮件发送到ADMINS列表的是应用程序特定的设置。我使用的是django-piston,它提供设置属性PISTON_EMAIL_ERRORS和PISTON_DISPLAY_ERRORS。相应地进行设置,使应用程序服务器可以在活塞崩溃时通过邮件通知我。
虽然可能不太理想,但我发现将Gmail用作SMTP主机也可以。nathanostgard.com上有有用的指南。
如果您想要额外的眼睛来检查拼写错误,请随时发布相关的settings.py部分(包括EMAIL _ *,SERVER_EMAIL,ADMINS(只需取出您的真实电子邮件),MANAGERS和DEBUG)!
以下信息在https://docs.djangoproject.com/zh-CN/2.1/howto/error-reporting/#email-reports中给出
EMAIL_HOST = "email host"
EMAIL_HOST_USER = "Email username"
EMAIL_HOST_PASSWORD = "Email Password"
DEBUG = False
ADMINS = (
("Your Name", "your_email@company.com")
)
为了发送电子邮件,Django需要一些设置来告诉它如何连接到您的邮件服务器。至少,您需要指定EMAIL_HOST,可能还需要指定EMAIL_HOST_USER和EMAIL_HOST_PASSWORD,尽管根据邮件服务器的配置,可能还需要其他设置。有关与电子邮件相关的设置的完整列表,请参阅Django设置文档。
sender non-delivery notification
。