From 2058efeef13c648867d0810a98da1f7aea8f64ba Mon Sep 17 00:00:00 2001 From: jordan Date: Tue, 23 Aug 2011 16:48:57 +0000 Subject: [PATCH] Resolves OSQA-704, try to recreate the SMTP connection after exception has occurred. git-svn-id: http://svn.osqa.net/svnroot/osqa/trunk@1165 0cfe37f9-358a-4d5e-be75-b63607b5c754 --- forum/utils/mail.py | 37 +++++++++++++++++++++++++++---------- forum/views/admin.py | 2 ++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/forum/utils/mail.py b/forum/utils/mail.py index 88b5f18..5f93b05 100644 --- a/forum/utils/mail.py +++ b/forum/utils/mail.py @@ -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() diff --git a/forum/views/admin.py b/forum/views/admin.py index 67047ba..4823920 100644 --- a/forum/views/admin.py +++ b/forum/views/admin.py @@ -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 -- 2.45.1