Django没有向管理员发送电子邮件

63 python django

根据文档,如果DEBUG设置为False并且在设置下提供了某些内容ADMINS,Django将在代码提出500状态代码时发送电子邮件.我已经正确填写了电子邮件设置(因为我可以使用send_mail)但每当我故意提出错误代码时,我都会获得500.html模板,但不会发送错误电子邮件.什么可能导致Django不这样做?

gee*_*ekQ 94

在我的情况下,原因是缺少SERVER_EMAIL设置.

默认SERVER_EMAILroot@localhost.但许多电子邮件服务器(包括我的电子邮件提供商)都不接受来自此类可疑地址的电子邮件 他们默默地放下电子邮件.

更改发件人电子邮件地址以django@my-domain.com解决问题.在settings.py:

SERVER_EMAIL = 'django@my-domain.com'
Run Code Online (Sandbox Code Playgroud)

  • 另一个提示,这可能是问题,如果您检查您的邮件日志并看到包含"发件人未送达通知"的条目. (2认同)

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以了解其他可能对您的特定情况有何影响非常有用.

  • 在Django 1.4下,这为我们修复了它. (3认同)

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终端窗口中.

  • 我看到了该消息,但是如果我将其设置回我的电子邮件设置则不起作用 (2认同)

小智 7

我的网络托管服务提供商 - Webfaction - 仅允许通过管理员面板中明确创建的电子邮件发送电子邮件.创建一个修复问题.


oli*_*eal 6

这里值得注意的另一件事是,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)