Skip to content

Instantly share code, notes, and snippets.

@iamit
Forked from jsummerfield/gist:1486891
Last active June 2, 2017 09:30
Show Gist options
  • Save iamit/5415771 to your computer and use it in GitHub Desktop.
Save iamit/5415771 to your computer and use it in GitHub Desktop.
"""
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
@iamit
Copy link
Author

iamit commented Apr 18, 2013

I Added this to make the backend comaptable both for SMTP over SSL as SMTP

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment