#!/usr/bin/env python
# -*- coding: utf-8 -*-
from typing import Iterable
from ..message import EmailMultiAlternatives
[docs]class BaseEmailBackend:
"""
Base class for email backend implementations.
Subclasses must at least overwrite :py:meth:`send_messages`
:py:meth:`open` and :py:meth:`close` can be called indirectly by using a
backend object as a context manager:
.. code-block:: python
with backend as connection:
# do something with connection
pass
"""
def __init__(self, fail_silently=False, **kwargs):
self.fail_silently = fail_silently
[docs] def open(self):
"""
Open a network connection.
This method can be overwritten by backend implementations to
open a network connection.
It's up to the backend implementation to track the status of
a network connection if it's needed by the backend.
This method can be called by applications to force a single network
connection to be used when sending mails. See the
:py:meth:`airmailer.backend.smtp.SMTPEmailBackend.send_messages` method
of the SMTP backend for a reference implementation.
The default implementation does nothing.
"""
pass
[docs] def close(self):
"""Close a network connection."""
pass
def __enter__(self):
try:
self.open()
except Exception:
self.close()
raise
return self
def __exit__(self, exc_type, exc_value, traceback):
self.close()
[docs] def send_messages(self, email_messages):
"""
Send one or more :py:class:`airmailer.message.EmailMessage` objects and
return the number of email messages sent.
"""
raise NotImplementedError('subclasses of BaseEmailBackend must override send_messages() method')
[docs] def send_mail(
self,
subject: str,
message,
from_email: str,
recipient_list: Iterable[str],
html_message: str = None
):
"""
Easy wrapper for sending a single message to a recipient list. All members
of the recipient list will see the other recipients in the 'To' field.
"""
mail = EmailMultiAlternatives(subject, message, from_email, recipient_list)
if html_message:
mail.attach_alternative(html_message, 'text/html')
with self as conn:
num_sent = conn.send_messages([mail])
return num_sent