Django - 使用不同的电子邮件后端来处理管理错误电子邮件

问题描述 投票:0回答:2

我在 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
使用自定义电子邮件后端?

python django logging django-settings django-email
2个回答
7
投票

这是可能的,但在 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
类并将其用作自定义电子邮件处理程序。


0
投票

这是我使用 Django 3 实现的一致工作的解决方案。

  1. 在 settings.py 中添加自定义 ADMIN_EMAIL 配置:
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
  1. 覆盖 AdminEmailHandler 并使用之前的 ADMIN_EMAIL 配置:
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
        )
  1. 在 mail_admins 处理程序中使用 CustomAdminEmailHandler:
LOGGING = {
    # ...
    'handlers': {
        # ...
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'your.path.to.CustomAdminEmailHandler'

        },
        # ...
    },
    # ...
}

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.