0

Settings

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

EMAIL_USE_TLS = True

EMAIL_HOST = 'smtp.gmail.com'

DEFAULT_FROM_EMAIL = EMAIL_HOST_USER = 'no_reply@domain.com'

SERVER_EMAIL = 'no_reply@domain.com'

DEFAULT_DO_NOT_REPLY = 'User <no_reply@domain.com>'

EMAIL_HOST_PASSWORD = 'xxxxxxxxx'

EMAIL_PORT = 587

DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

Class

class EmailThread(threading.Thread):
    def __init__(self, subject, context, recipient, template):
        self.subject = subject
        self.recipient = recipient
        self.message = get_template(template).render(context)
        threading.Thread.__init__(self)

    def run(self):
        msg = EmailMessage(
            subject=self.subject,
            from_email=settings.DEFAULT_DO_NOT_REPLY,
            to=self.recipient,
            body=self.message
        )
        msg.content_subtype = "html"

        try:
            msg.send(fail_silently=False)
            log.info("E-mail triggered. Subject: '%s', to: %s" % (self.subject, self.recipient))
        except Exception as e:
            log.exception(e)

Usage

def notify_admin_blocked_account(user):
    """
    Sends sends an email when the account is blocked
    :return:
    """
    email = EmailThread(
        subject='{}, your account has been blocked'.format(user),
        context={
            'user': user,
            'login_attempts': settings.MAX_STAFF_PWD_ATTEMPTS,
        },
        recipient=[user.email,],
        template='mail/notify_admin_blocked_account.html'
    )
    email.start()

Error

[ERROR][2017-08-01 10:40:26,835][mail] EOF occurred in violation of protocol (_ssl.c:645)
Traceback (most recent call last):
  File "./bin/mail.py", line 27, in run
    msg.send(fail_silently=False)
  File "/home/web/sites/envs/project/lib/python3.5/site-packages/django/core/mail/message.py", line 348, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "/home/web/sites/envs/project/lib/python3.5/site-packages/django/core/mail/backends/smtp.py", line 104, in send_messages
    new_conn_created = self.open()
  File "/home/web/sites/envs/project/lib/python3.5/site-packages/django/core/mail/backends/smtp.py", line 69, in open
    self.connection.starttls(keyfile=self.ssl_keyfile, certfile=self.ssl_certfile)
  File "/usr/lib/python3.5/smtplib.py", line 766, in starttls
    server_hostname=self._host)
  File "/usr/lib/python3.5/ssl.py", line 377, in wrap_socket
    _context=self)
  File "/usr/lib/python3.5/ssl.py", line 752, in __init__
    self.do_handshake()
  File "/usr/lib/python3.5/ssl.py", line 988, in do_handshake
    self._sslobj.do_handshake()
  File "/usr/lib/python3.5/ssl.py", line 633, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:645)

I have some weird behavior when I try to send an e-mail (async) with Django. I really wanted to avoid third-party apps being installed to reduce code fragmentation - specially with some of them that seem to use crontab.

It is worth noticing that the error doesn't happen all the time. However, even though it doesn't happen, sometimes e-mails are not sent either. Only some of them manage to go through.

On my development environment it runs fine, and I can send the e-mails. However, on my production environment (EC2 instance) it simply doesn't work.

If I trigger an e-mail through the normal process, it is not sent. If I login to the server, open the manage.py shell, import a project and call the function that sends e-mail, sometimes I receive both triggered and manually-triggered e-mails or get an error (the one bellow).

Ev.
  • 1,537
  • 1
  • 24
  • 49
  • sometimes security groups can be the issue. A port might not be open in your security group – Arpit Solanki Aug 02 '17 at 12:22
  • The weird thing is that some e-mails manage to go through in Production. In development, all of them do. Which makes me wonder if the problem is in the AWS machine. The question is: why certain e-mails are sent and some are not. – Ev. Aug 02 '17 at 12:28

1 Answers1

0

My solution was to use Django-Mailer. It fragments the project, something I wanted to avoid, but its usage is pretty minimalist.

Ev.
  • 1,537
  • 1
  • 24
  • 49