[Django]-Amazon SES SMTP with Django

32👍

I found a much simpler solution that would allow me to use Django’s built-in mail classes so I can still get my admin error email reports etc.

Thanks to this little beauty I was able to use SES SMTP without any problems:

https://github.com/bancek/django-smtp-ssl

Download and install (python setup.py install)

Then just change your settings to use this new email backend:

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'

The rest of the settings are as per normal:

EMAIL_HOST = 'email-smtp.us-east-1.amazonaws.com'
EMAIL_PORT = 465
EMAIL_HOST_USER = 'my_smtp_username'
EMAIL_HOST_PASSWORD = 'my_smtp_password'
EMAIL_USE_TLS = True
👤GivP

15👍

Aug, 2022 Update with Django-3.2.4:

No libraries needed such as django-ses or django-amazon-ses !!

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'email-smtp.ap-northeast-1.amazonaws.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'my_smtp_username'      # Must create SMTP Credentials
EMAIL_HOST_PASSWORD = 'my_smtp_password'  # Must create SMTP Credentials
DEFAULT_FROM_EMAIL = 'myses@sender.com' # If don't need, comment out!!

I added DEFAULT_FROM_EMAIL.

DEFAULT_FROM_EMAIL = 'myses@sender.com'

If you don’t need it, comment it out!!

# DEFAULT_FROM_EMAIL = 'myses@sender.com'

Moreover, for DEFAULT_FROM_EMAIL, put one verified domain or email address whether or not your account is in the sandbox.

So for the verified domain sender.com below,

enter image description here


Three of them below are valid: (Use only one of three)

DEFAULT_FROM_EMAIL = 'abc@sender.com' # OR
DEFAULT_FROM_EMAIL = 'test@sender.com' # OR
DEFAULT_FROM_EMAIL = 'myses@sender.com'

But these two below are not valid: (These give you error)

*The format must be something@sender.com !!

DEFAULT_FROM_EMAIL = 'sender.com' 
DEFAULT_FROM_EMAIL = '@sender.com'

Then, for the verified 2 email addresses below,

enter image description here


Just use only one of two below:

DEFAULT_FROM_EMAIL = 'hello@gmail.com' # OR
DEFAULT_FROM_EMAIL = 'world@outlook.com'

Finally, for EMAIL_HOST_USER and EMAIL_HOST_PASSWORD, you must create SMTP Credentials.

Choose SMTP Settings:

enter image description here


Press Create My SMTP Credentials Button:

enter image description here


Given SMTP Credentials:

enter image description here

Then, put the SMTP Credentials as below:

EMAIL_HOST_USER = 'AKIAWP3TMGZN4OZH5H37'
EMAIL_HOST_PASSWORD = 'BB6dufiw96jJHUTrowXI8R4gcyOI+t1+Skbi51cdHYhV'

*(I’ve already deleted these SMTP Credentials)


13👍

2019 Update: Django 2.2.1

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

EMAIL_HOST = 'email-smtp.us-east-1.amazonaws.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'my_smtp_username'
EMAIL_HOST_PASSWORD = 'my_smtp_password'
EMAIL_USE_TLS = True

No library needed.

Credits : https://stackoverflow.com/a/32476190/5647272

Reference : https://docs.djangoproject.com/en/2.2/topics/email/

11👍

Since Django 1.7, you can send email with SSL natively without third party library.

EMAIL_USE_SSL = True

Docs

5👍

After long long searching and trying I found:

Instead using:

 s = smtplib.SMTP(host, port)
 s.starttls()
 s.login(user, password)

For AmazonSES SMTP must be:

 s = smtplib.SMTP_SSL(host, port)
 s.login(user, password)

So, I think, for django you can either fix django code, or write you own simple email backend [based on default django email backend].

UPD:

I found another solution (but not tested it by myself): use SSLEmailBackend from link below

// settings.py
EMAIL_BACKEND = 'backends.smtp.SSLEmailBackend'

(From here: Mysterious issue with Django + uWSGI + send email )

UPD2:

AmazonSES supports STARTTLS from now 🙂

Amazon SES supports expanded attachment types, VERP, and STARTTLS for SMTP

(from Amazon Newsletter)

1👍

http://aws.amazon.com/articles/2405502737055650

core python functionality sample

1👍

I took like 3 hrs breaking my head over it. Your solution about the smtplib with s.starttls() and then s.login() is good with a python program with all the email credentials in the same file. But I don’t think it is a clean way to do it in Django. So I finally figured it out. Irrespective of whether your machine is a 32 or a 64 bit. Just do the following steps:

  1. Install boto

    pip install –upgrade boto

  2. Install django-ses

    pip install django-ses

  3. In your djando settings.py file update the following info.

    EMAIL_BACKEND = ‘django_ses.SESBackend’
    AWS_ACCESS_KEY_ID = ‘your_username’
    AWS_SECRET_ACCESS_KEY = ‘your_password’

  4. In your django file where you want to send an email

    from django.core.mail import send_mail
    send_mail(‘Test subject’, ‘This is the body’, ‘info@abc.com’,[‘hello@abc.com’],fail_silently=False)

1👍

I have tried smtp settings in order to @Givp(who answered above), I want to give complete AWS SMTP settings in django.

DEFAULT_FROM_EMAIL = 'admin@domain.com'

ADMINS = [('name', 'name@domain.com')]
MANAGERS = ADMINS

SERVER_EMAIL = 'admin@domain.com' # this is for to send 500 mail to admins

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'
MAIL_HOST = 'email-smtp.us-east-1.amazonaws.com' 
EMAIL_PORT = 465
EMAIL_HOST_USER = 'Accesskeyofsmtp'
EMAIL_HOST_PASSWORD = 'secretkeyofsmtp'
EMAIL_USE_TLS = True

Here we have to verify all the mail-ids before sending email.then everything would work as our expectation

Leave a comment