2011-09-26 10 views
10

La mia applicazione Django invia un bel po 'di e-mail e ho provato a testarlo a fondo. Tuttavia, per i primi mesi, vorrei registrare tutte le e-mail in uscita per garantire che tutto funzioni senza problemi. C'è un modulo Django che mi permette di fare questo e rende le email in uscita visibili attraverso il pannello di amministrazioneCome posso registrare tutte le e-mail in uscita in Django?

Grazie.

risposta

8

Ho scritto un back-end e-mail personalizzato che registra le cose su un modello.

Ecco il mio back-end:

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 

Ecco il modello:

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, 
    ) 

Ecco il mio modello:

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

Questo non registrerà ok = False in caso di fallimento. Il modello non è stato salvato. –

1

Non so se esiste un modulo che funziona in questo modo, ma la scrittura di uno personalizzato è un pezzo di torta. Basta creare un modello separato e ogni volta che si invia un'e-mail, creare una nuova istanza (utilizzare un metodo personalizzato per l'invio di e-mail). Quindi collega questo modello con l'admin e il bingo.

2

Dal momento che l'OP ha chiesto sulla registrazione e non sul salvataggio a DB, ecco un middleware che lo fa:

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) 

e poi nel vostro settings.py:

EMAIL_BACKEND = 'whereiputit.LoggingBackend' 
Problemi correlati