From 4e317fc1452cf405caca42c9d16896fc4abda276 Mon Sep 17 00:00:00 2001 From: Corentin Chary Date: Sat, 28 Jul 2012 10:15:03 +0200 Subject: [PATCH] djeuscan: add sendmail email backend Signed-off-by: Corentin Chary --- euscanwww/euscanwww/sendmail.py | 53 +++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 euscanwww/euscanwww/sendmail.py diff --git a/euscanwww/euscanwww/sendmail.py b/euscanwww/euscanwww/sendmail.py new file mode 100644 index 0000000..f23b5f3 --- /dev/null +++ b/euscanwww/euscanwww/sendmail.py @@ -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