Skip to content

Instantly share code, notes, and snippets.

@xfenix
Created July 30, 2012 13:10
Show Gist options
  • Save xfenix/3206768 to your computer and use it in GitHub Desktop.
Save xfenix/3206768 to your computer and use it in GitHub Desktop.

Revisions

  1. xfenix created this gist Jul 30, 2012.
    53 changes: 53 additions & 0 deletions gistfile1.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,53 @@
    """sendmail email backend class."""

    import threading

    from django.conf import settings
    from django.core.mail.backends.base import BaseEmailBackend
    from subprocess import Popen,PIPE

    class EmailBackend(BaseEmailBackend):
    def __init__(self, fail_silently=False, **kwargs):
    super(EmailBackend, self).__init__(fail_silently=fail_silently)
    self._lock = threading.RLock()

    def open(self):
    return True

    def close(self):
    pass

    def send_messages(self, email_messages):
    """
    Sends one or more EmailMessage objects and returns the number of email
    messages sent.
    """
    if not email_messages:
    return
    self._lock.acquire()
    try:
    num_sent = 0
    for message in email_messages:
    sent = self._send(message)
    if sent:
    num_sent += 1
    finally:
    self._lock.release()
    return num_sent

    def _send(self, email_message):
    """A helper method that does the actual sending."""
    if not email_message.recipients():
    return False
    try:
    ps = Popen(["sendmail"]+list(email_message.recipients()), \
    stdin=PIPE)
    ps.stdin.write(email_message.message().as_string())
    ps.stdin.flush()
    ps.stdin.close()
    return not ps.wait()
    except:
    if not self.fail_silently:
    raise
    return False
    return True