]> git.openstreetmap.org Git - osqa.git/commitdiff
Resolves OSQA-704, try to recreate the SMTP connection after exception has occurred.
authorjordan <jordan@0cfe37f9-358a-4d5e-be75-b63607b5c754>
Tue, 23 Aug 2011 16:48:57 +0000 (16:48 +0000)
committerjordan <jordan@0cfe37f9-358a-4d5e-be75-b63607b5c754>
Tue, 23 Aug 2011 16:48:57 +0000 (16:48 +0000)
git-svn-id: http://svn.osqa.net/svnroot/osqa/trunk@1165 0cfe37f9-358a-4d5e-be75-b63607b5c754

forum/utils/mail.py
forum/views/admin.py

index 88b5f1881ca3ee1297f433f3cb541fcdf78bfdc8..5f93b055338931dcd30f8f0b5bb4f76d128e6e12 100644 (file)
@@ -16,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
@@ -28,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
@@ -37,21 +53,15 @@ def create_and_send_mail_messages(messages):
     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()
-
-        if settings.EMAIL_HOST_USER and settings.EMAIL_HOST_PASSWORD:
-            connection.login(str(settings.EMAIL_HOST_USER), str(settings.EMAIL_HOST_PASSWORD))
+        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')
@@ -78,8 +88,15 @@ 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:
                 logging.error("Couldn't send mail using the sendmail method: %s" % e)
+               try:
+                   connection.quit()
+                   connection = None
+               except Exception:
+                   connection = None
 
         try:
             connection.quit()
index 67047ba9c36f301131712b2c7cefc53f1a4e10c8..4823920c1099b6c3f6267a637684ce1bee53fd10 100644 (file)
@@ -1,6 +1,7 @@
 from datetime import datetime, timedelta
 import time
 
+from django.views.decorators.csrf import csrf_exempt
 from django.shortcuts import render_to_response, get_object_or_404
 from django.core.urlresolvers import reverse
 from django.http import HttpResponseRedirect, HttpResponse, Http404
@@ -574,6 +575,7 @@ def node_management(request):
     'hide_menu': True
     }))
 
+@csrf_exempt
 @super_user_required
 def test_email_settings(request):
     user = request.user