2011-09-26 68 views

回答

8

我写了一个自定义电子邮件后端,它将日志记录到模型中。

这里是我的后端:

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) 
+1

这将不记录失败OK =假。该模型未保存。 –

1

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

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' 
相关问题