From 7a84ad93e69faf7a14342ebb4da1f6be265f1fe0 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Thu, 3 May 2007 13:35:02 +0000 Subject: [PATCH] Fixed #2897 -- Added support for TLS connections to email handling. This means servers like Google's SMTP server can now be used for admin emails. git-svn-id: http://code.djangoproject.com/svn/django/trunk@5144 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/conf/global_settings.py | 1 + django/core/mail.py | 23 ++++++++++++++--------- docs/email.txt | 4 +++- docs/settings.txt | 7 +++++++ 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py index 521caedbd0..61751db8cd 100644 --- a/django/conf/global_settings.py +++ b/django/conf/global_settings.py @@ -119,6 +119,7 @@ EMAIL_PORT = 25 # Optional SMTP authentication information for EMAIL_HOST. EMAIL_HOST_USER = '' EMAIL_HOST_PASSWORD = '' +EMAIL_USE_TLS = False # List of strings representing installed apps. INSTALLED_APPS = () diff --git a/django/core/mail.py b/django/core/mail.py index 8fcf26fe03..4c40acda8c 100644 --- a/django/core/mail.py +++ b/django/core/mail.py @@ -70,15 +70,12 @@ class SMTPConnection(object): """ def __init__(self, host=None, port=None, username=None, password=None, - fail_silently=False): - if host is None: - self.host = settings.EMAIL_HOST - if port is None: - self.port = settings.EMAIL_PORT - if username is None: - self.username = settings.EMAIL_HOST_USER - if password is None: - self.password = settings.EMAIL_HOST_PASSWORD + use_tls=None, fail_silently=False): + self.host = host or settings.EMAIL_HOST + self.port = (port is not None) and port or settings.EMAIL_PORT + self.username = username or settings.EMAIL_HOST_USER + self.password = password or settings.EMAIL_HOST_PASSWORD + self.use_tls = (use_tls is not None) and use_tls or settings.EMAIL_USE_TLS self.fail_silently = fail_silently self.connection = None @@ -92,6 +89,10 @@ class SMTPConnection(object): return False try: self.connection = smtplib.SMTP(self.host, self.port) + if self.use_tls: + self.connection.ehlo() + self.connection.starttls() + self.connection.ehlo() if self.username and self.password: self.connection.login(self.username, self.password) return True @@ -104,6 +105,10 @@ class SMTPConnection(object): try: try: self.connection.quit() + except socket.sslerror: + # This happens when calling quit() on a TLS connection + # sometimes. + self.connection.close() except: if self.fail_silently: return diff --git a/docs/email.txt b/docs/email.txt index 74127526dd..56a552bdb7 100644 --- a/docs/email.txt +++ b/docs/email.txt @@ -22,7 +22,8 @@ In two lines:: Mail will be sent using the SMTP host and port specified in the `EMAIL_HOST`_ and `EMAIL_PORT`_ settings. The `EMAIL_HOST_USER`_ and `EMAIL_HOST_PASSWORD`_ -settings, if set, will be used to authenticate to the SMTP server. +settings, if set, will be used to authenticate to the SMTP server and the +`EMAIL_USE_TLS`_ settings will control whether a secure connection is used. .. note:: @@ -34,6 +35,7 @@ settings, if set, will be used to authenticate to the SMTP server. .. _EMAIL_PORT: ../settings/#email-port .. _EMAIL_HOST_USER: ../settings/#email-host-user .. _EMAIL_HOST_PASSWORD: ../settings/#email-host-password +.. _EMAIL_USE_TLS: ../settings/#email-use-tls send_mail() diff --git a/docs/settings.txt b/docs/settings.txt index 042347ccdb..58d590f7c2 100644 --- a/docs/settings.txt +++ b/docs/settings.txt @@ -428,6 +428,13 @@ Subject-line prefix for e-mail messages sent with ``django.core.mail.mail_admins or ``django.core.mail.mail_managers``. You'll probably want to include the trailing space. +EMAIL_USE_TLS +------------- + +Default: ``False`` + +Whether to use a TLS (secure) connection when talking to the SMTP server. + FIXTURE_DIRS -------------