【问题标题】:How can I log all outgoing email in Django?如何在 Django 中记录所有外发电子邮件?
【发布时间】:2011-11-25 00:30:51
【问题描述】:

我的 Django 应用程序发送了很多电子邮件,我已经尝试过彻底测试它。但是,在最初的几个月里,我想记录所有传出的电子邮件,以确保一切顺利。是否有一个 Django 模块允许我这样做并通过管理面板使外发电子邮件可见

谢谢。

【问题讨论】:

    标签: python django logging django-email


    【解决方案1】:

    我编写了一个自定义电子邮件后端,将内容记录到模型中。

    这是我的后端:

    from django.core.mail.backends.smtp import *
    from django.db import transaction
    
    from modules.common.models import *
    
    class LoggingEmailBackend(EmailBackend):
        """
        A wrapper around the SMTP backend that logs all emails to the DB.
        """
        def send_messages(self, email_messages):
        """
        A helper method that does the actual logging
        """
        with transaction.commit_on_success():
    
            for email_message in email_messages:
    
                email_record = Email.objects.create(
                    to='; '.join(email_message.recipients()),
                    subject=email_message.subject, body=email_message.body,
                )
    
                try:
                    return super(LoggingEmailBackend, self)._send(
                        email_message
                    )
                except:
                    email_record.ok = False
                    return False
                finally:
                    email_record.ok = True
                    return True
    

    这是模型:

    class Email(models.Model):
        """
        Model to store all the outgoing emails.
        """
        when = models.DateTimeField(
            null=False, auto_now_add=True
        )
        to = models.EmailField(
            null=False, blank=False,
        )
        subject = models.CharField(
             null=False, max_length=128,
        )
        body = models.TextField(
            null=False, max_length=1024,
        )
        ok = models.BooleanField(
            null=False, default=True,
        )
    

    这是我的模型:

    from django.contrib import admin
    
    from modules.common.models import *
    
    class EmailAdmin(admin.ModelAdmin):
        """
        Admin part for managing the the Email model
        """
        list_display = ['to', 'subject', 'ok',]
        list_filter = ['ok']
        readonly_fields = ['when', 'to', 'subject', 'body', 'ok']
        search_fields = ['subject', 'body', 'to']
    
        def has_delete_permission(self, request, obj=None):
            return False
    
        def has_add_permission(self, request):
            return False
    
    
    admin.site.register(Email, EmailAdmin)
    

    【讨论】:

    • 这不会记录 ok = False 失败。模型未保存。
    【解决方案2】:

    由于 OP 询问的是日志记录而不是保存到数据库,这里有一个中间件可以做到这一点:

    import django.core.mail.backends.smtp
    import logging
    
    logger = logging.getLogger(__name__)  # or you could enter a specific logger name
    
    class LoggingBackend(django.core.mail.backends.smtp.EmailBackend):
    
      def send_messages(self, email_messages):
        try:
            for msg in email_messages:
                logger.info(u"Sending message '%s' to recipients: %s", msg.subject, msg.to)
        except:
            logger.exception("Problem logging recipients, ignoring")
    
        return super(LoggingBackend, self).send_messages(email_messages)
    

    然后在你的 settings.py 中:

    EMAIL_BACKEND = 'whereiputit.LoggingBackend'
    

    【讨论】:

      【解决方案3】:

      我不知道是否存在以这种方式工作的模块,但编写自定义模块是小菜一碟。只需创建一个单独的模型,每次发送电子邮件时,创建一个新实例(使用自定义方法发送电子邮件)。然后,将此模型与管理员和宾果游戏链接..

      【讨论】:

        【解决方案4】:

        Django 提供自定义电子邮件后端,you can write one on your own

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-30
          • 2014-05-26
          • 2011-09-20
          • 2020-05-03
          • 2018-07-24
          • 2011-04-29
          • 2021-08-13
          • 2014-08-11
          相关资源
          最近更新 更多