Django 不发送错误电子邮件 - 我该如何调试?

Posted

技术标签:

【中文标题】Django 不发送错误电子邮件 - 我该如何调试?【英文标题】:Django not sending error emails - how can I debug? 【发布时间】:2015-11-06 09:10:10 【问题描述】:

我正在使用 Django 1.8。这是我的基本设置文件:

LOGGING = 
    'version': 1,
    'disable_existing_loggers': False,
    'filters': 
        'require_debug_false': 
            '()': 'django.utils.log.RequireDebugFalse'
        
    ,
    'handlers': 
        'mail_admins': 
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        
    ,
    'loggers': 
        'django.request': 
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        ,
    

ADMINS = (
   ('ME', 'me@gmail.com'),
)
MANAGERS = ADMINS

这些是我的生产设置:

########## EMAIL CONFIGURATION
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'my.error.account@gmail.com'
EMAIL_HOST_PASSWORD = utils.get_env_setting('GMAIL_PASS')
EMAIL_SUBJECT_PREFIX = '[%s] ' % SITE_NAME
SERVER_EMAIL = EMAIL_HOST_USER
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
########## END EMAIL CONFIGURATION

它曾经在生产中发送错误电子邮件,但已停止。我已经设置了一个返回 500 个错误的页面,以便我可以进一步测试 - 加载它时不会发送电子邮件。

我已经尝试调试明显的东西:

我仍然可以登录my.error.account@gmail.com,而且它似乎没有被阻止。 我检查了我的垃圾邮件过滤器。 我确定DEBUG 设置为假。 我相信GMAIL_PASS 环境变量可供Django 用户使用。

如何进一步调试?

【问题讨论】:

首先,检查邮件是否正在发送。将HOST 设置为localhost,将PORT 设置为1025,禁用TLS 并使用以下命令运行一个虚拟的SMTP 服务器:python -m smtpd -n -c DebuggingServer localhost:1025 如果它对任何人有帮助,我花了一段时间才弄清楚,您不仅需要在 handlers 键下指定 mail_admins,而且您必须在loggers 键下启用该处理程序 【参考方案1】:

对于问题的调试部分

@zopieux 评论:

首先,检查邮件是否正在发送。设置:

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
EMAIL_USE_TLS = False
EMAIL_USE_SSL = False

然后运行一个虚拟的 SMTP 服务器:

python -m smtpd -n -c DebuggingServer localhost:1025

如果可行,您可以恢复更改并按照relevant question 中的说明手动发送电子邮件:

from django.core.mail import EmailMessage
email = EmailMessage('Hello', 'World', to=['user@gmail.com'])
email.send()

关于使用谷歌作为 SMTP 服务器的特性:

The most popular -and updated- 问题的答案表明 Google 不再支持此功能 (2016),您应该尝试寻找另一个 SMTP 服务器。

我已经发布了我的工作logging configuration 以供参考。

【讨论】:

以上是关于Django 不发送错误电子邮件 - 我该如何调试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django中将pdf作为电子邮件附件发送

使用自定义 send_email 报告 Django 错误

React.js - 在网站上授权时,如果数据不正确,我该如何获得文本错误的响应?

如何限制 Django 错误邮件

调试,测量django中的时间图像上传

如何配置 apache 以在每个 HTTP 错误 500 上发送电子邮件