我在 Django 应用程序中使用自定义电子邮件后端(本例中为 CeleryEmailBackend):
EMAIL_BACKEND = 'djcelery_email.backends.CeleryEmailBackend'
我的日志配置:
LOGGING = {
# ...
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
},
# ...
}
管理员错误电子邮件也由同一电子邮件后端发送。
因此,如果电子邮件后端出现问题(例如 Celery 未运行)。这样我就不会收到服务器错误电子邮件了。
有没有办法让
AdminEmailHandler
使用自定义电子邮件后端?
这是可能的,但在 django 1.6 中,引用来自 documentation:
通过设置 AdminEmailHandler 的 email_backend 参数,电子邮件 处理程序正在使用的后端可以被覆盖,例如 这个:
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'email_backend': 'django.core.mail.backends.filebased.EmailBackend',
}
},
如果您不想升级(例如,因为 1.6 不稳定),请考虑基于 AdminEmailHandler 制作自定义电子邮件处理程序。应该不难,因为这个新功能的实际实现非常简单明了(参见pull-request)。
或者,您实际上可以从 django 1.6 中提取整个
AdminEmailHandler
类并将其用作自定义电子邮件处理程序。
这是我使用 Django 3 实现的一致工作的解决方案。
ADMIN_EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
ADMIN_EMAIL_HOST = 'smtp.gmail.com' # gmail example, put here your smtp server if another
ADMIN_EMAIL_PORT = 465
ADMIN_EMAIL_HOST_USER = 'your_mail_user'
ADMIN_EMAIL_HOST_PASSWORD = 'your_mail_password'
ADMIN_EMAIL_USE_TLS = False
class CustomAdminEmailHandler(AdminEmailHandler):
def connection(self):
return get_connection(
backend=settings.ADMIN_EMAIL_BACKEND,
host=settings.ADMIN_EMAIL_HOST,
port=settings.ADMIN_EMAIL_PORT,
username=settings.ADMIN_EMAIL_HOST_USER,
password=settings.ADMIN_EMAIL_HOST_PASSWORD,
use_tls=settings.ADMIN_EMAIL_USE_TLS,
fail_silently=True
)
LOGGING = {
# ...
'handlers': {
# ...
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'your.path.to.CustomAdminEmailHandler'
},
# ...
},
# ...
}
希望这有帮助!