]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/utils/mail.py
Adds an option to set a reply-to address on emails
[osqa.git] / forum / utils / mail.py
index 7a61292d6f61dd923168ae0b348f2cc5b77eb9d6..cecb5b4c240b1961ae119ec4e07e85c47e1e0996 100644 (file)
@@ -1,6 +1,7 @@
 import email
 import socket
 import os
+import logging
 
 try:
     from email.mime.multipart import MIMEMultipart
@@ -15,6 +16,7 @@ except:
 
 from django.core.mail import DNS_NAME
 from smtplib import SMTP
+from smtplib import SMTPRecipientsRefused
 from forum import settings
 from django.template import loader, Context, Template
 from forum.utils.html import sanitize_html
@@ -27,6 +29,21 @@ def send_template_email(recipients, template, context):
     context.update(dict(recipients=recipients, settings=settings))
     t.render(Context(context))
 
+def create_connection():
+    connection = SMTP(str(settings.EMAIL_HOST), str(settings.EMAIL_PORT),
+                          local_hostname=DNS_NAME.get_fqdn())
+
+    if (bool(settings.EMAIL_USE_TLS)):
+        connection.ehlo()
+        connection.starttls()
+        connection.ehlo()
+
+    if settings.EMAIL_HOST_USER and settings.EMAIL_HOST_PASSWORD:
+        connection.login(str(settings.EMAIL_HOST_USER), str(settings.EMAIL_HOST_PASSWORD))
+
+    return connection
+
+
 def create_and_send_mail_messages(messages):
     if not settings.EMAIL_HOST:
         return
@@ -35,22 +52,18 @@ def create_and_send_mail_messages(messages):
     sender.append('<%s>' % unicode(settings.DEFAULT_FROM_EMAIL))
     sender = u'%s <%s>' % (unicode(settings.APP_SHORT_NAME), unicode(settings.DEFAULT_FROM_EMAIL))
 
-    try:
-        connection = SMTP(str(settings.EMAIL_HOST), str(settings.EMAIL_PORT),
-                          local_hostname=DNS_NAME.get_fqdn())
-
-        if (bool(settings.EMAIL_USE_TLS)):
-            connection.ehlo()
-            connection.starttls()
-            connection.ehlo()
+    reply_to = unicode(settings.DEFAULT_REPLY_TO_EMAIL)
 
-        if settings.EMAIL_HOST_USER and settings.EMAIL_HOST_PASSWORD:
-            connection.login(str(settings.EMAIL_HOST_USER), str(settings.EMAIL_HOST_PASSWORD))
+    try:
+        connection = None
 
         if sender is None:
             sender = str(settings.DEFAULT_FROM_EMAIL)
 
         for recipient, subject, html, text, media in messages:
+            if connection is None:
+                connection = create_connection()
+
             msgRoot = MIMEMultipart('related')
 
             msgRoot['Subject'] = Header(subject, 'utf-8')
@@ -60,6 +73,9 @@ def create_and_send_mail_messages(messages):
             to.append('<%s>' % recipient.email)
             msgRoot['To'] = to
 
+            if reply_to:
+                msgRoot['Reply-To'] = reply_to
+
             msgRoot.preamble = 'This is a multi-part message from %s.' % unicode(settings.APP_SHORT_NAME).encode('utf8')
 
             msgAlternative = MIMEMultipart('alternative')
@@ -77,12 +93,22 @@ def create_and_send_mail_messages(messages):
 
             try:
                 connection.sendmail(sender, [recipient.email], msgRoot.as_string())
+            except SMTPRecipientsRefused, e:
+                logging.error("Email address not accepted.  Exception: %s" % e)
             except Exception, e:
-                pass
+                logging.error("Couldn't send mail using the sendmail method: %s" % e)
+                try:
+                    connection.quit()
+                except Exception, e:
+                    logging.error(e)
+                finally:
+                    connection = None
 
         try:
             connection.quit()
+        except AttributeError:
+            pass
         except socket.sslerror:
             connection.close()
     except Exception, e:
-        pass
+        logging.error('Email sending has failed: %s' % e)