martinrusev
2/4/2015 - 10:48 AM

gistfile1.py

"""
Django's SMTP EmailBackend doesn't support an SMTP_SSL connection necessary to interact with Amazon SES's newly announced SMTP server. We need to write a custom EmailBackend overriding the default EMailBackend's open(). Thanks to https://github.com/bancek/django-smtp-ssl for the example.
"""

--- settings.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'email-smtp.us-east-1.amazonaws.com'
EMAIL_PORT = 465
EMAIL_HOST_USER = 'username'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_USE_TLS = False # NOTE: this is for using START_TLS: no need if using smtp over ssl 

--- shell

>>> from django.core.mail import send_mail
>>> send_mail('subject', 'message', 'from@example.com', ['to@example.com'])
SMTPServerDisconnected: Connection unexpectedly closed

--- settings.py

EMAIL_BACKEND = 'backends.smtp.SSLEmailBackend'
# Adding another EMAIL OPTION:
EMAIL_USE_SSL = True #custom setting to make this backend usable for both SMTP and SMTP over SSL
EMAIL_SMTP_TIMEOUT_SECONDS = 10 #custom setting to make playing with timeouts a bit  easier

--- backends/smtp.py

import smtplib

from django.conf import settings
from django.core.mail.utils import DNS_NAME
from django.core.mail.backends.smtp import EmailBackend

class SSLEmailBackend(EmailBackend):
    def open(self):
        if self.connection:
            return False
        try:
            if settings.EMAIL_USE_SSL:
                self.connection = smtplib.SMTP_SSL(host=self.host, port=self.port,
                                           local_hostname=local_hostname, timeout=settings.EMAIL_SMTP_TIMEOUT_SECONDS)
            else:
                self.connection = smtplib.SMTP(host=self.host, port=self.port,
                                           local_hostname=DNS_NAME.get_fqdn(),timeout=settings.EMAIL_SMTP_TIMEOUT_SECONDS)
                # Note: you don't want to use START_TLS in case over SSL
                if self.use_tls:
                    self.connection.ehlo()
                    self.connection.starttls()
                    self.connection.ehlo()    
            self.connection = smtplib.SMTP_SSL(self.host, self.port,
                                           local_hostname=DNS_NAME.get_fqdn())
            if self.username and self.password:
                self.connection.login(self.username, self.password)
            return True
        except:
            if not self.fail_silently:
                raise

--- shell

>>> from django.core.mail import send_mail
>>> send_mail('subject', 'message', 'from@example.com', ['to@example.com'])
1