Source code for mailsystem.utils.mail

import io
import smtplib
import uuid

from django.contrib.contenttypes.models import ContentType
from django.core.mail import EmailMessage
from django.db import models

from mailsystem.models import MailLogSession
from mailsystem.utils.streams import RedirectStdStreams


[docs]class MailMessage: def __init__(self, email_message=None, maillog_session=None): """Alternative EmailMessage OBject :param email_message: Orginal EmailMessage or EmailAlternativeMessage :param maillog_session: MailLogSession object """ self._email_message = email_message self._maillog_session = maillog_session
[docs] def send(self): """ Trigger send method of the orginal EmailMessage Object :return: """ data = io.StringIO() with RedirectStdStreams(stdout=data, stderr=data): self._email_message.send() self._maillog_session.logparse(data.getvalue())
def get_mail_session(self): return self._maillog_session
[docs]class MailLogger: def __init__(self, email_message=None, reference=None): assert isinstance(email_message, EmailMessage) self._reference = None if reference is not None: if isinstance(reference, models.Model): raise ValueError("Reference is not an Model") self._reference = reference self.orginal_debuglevel = smtplib.SMTP.debuglevel self._email_message = email_message def __enter__(self): # Change smtplib debuglevel smtplib.SMTP.debuglevel = 9 # Create an UUID for E-Mail Header self._email_message.extra_headers["mailsystem-reference-uuid"] = uuid.uuid4() # Create MailLogSession enry maillog_session = MailLogSession.objects.create(recipient_email=self._email_message.to[0], sender_email=self._email_message.from_email, email=self._email_message.body, uuid=self._email_message.extra_headers["mailsystem-reference-uuid"] ) # Resolve reference o content_type if exists if self._reference: contenttype = ContentType.objects.get_for_model(model=type(self._reference)) maillog_session.content_type = contenttype maillog_session.reference = self._reference.pk maillog_session.save() # Return a Represententing Object return MailMessage(email_message=self._email_message, maillog_session=maillog_session) def __exit__(self, type, value, traceback): # Reset smtplib debuglevel to orginal Level smtplib.SMTP.debuglevel = self.orginal_debuglevel