ssl.SSLEOFError при отправке писем через Django

Настройки

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

EMAIL_USE_TLS = True

EMAIL_HOST = 'smtp.gmail.com'

DEFAULT_FROM_EMAIL = EMAIL_HOST_USER = '[email protected]'

SERVER_EMAIL = '[email protected]'

DEFAULT_DO_NOT_REPLY = 'User <[email protected]>'

EMAIL_HOST_PASSWORD = 'xxxxxxxxx'

EMAIL_PORT = 587

DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

Учебный класс

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)

Применение

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][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)

У меня какое-то странное поведение, когда я пытаюсь отправить электронное письмо (асинхронно) с помощью Django. Я действительно хотел избежать установки сторонних приложений, чтобы уменьшить фрагментацию кода, особенно с некоторыми из них, которые, похоже, используют crontab.

Стоит отметить, что ошибка возникает не постоянно. Однако, даже если этого не происходит, иногда электронные письма также не отправляются. Лишь некоторым из них удается пройти.

В моей среде разработки он работает нормально, и я могу отправлять электронные письма. Однако в моей производственной среде (экземпляр EC2) это просто не работает.

Если я запускаю электронное письмо в обычном режиме, оно не отправляется. Если я захожу на сервер, открываю manage.py shell, импортирую проект и вызываю функцию, которая отправляет электронную почту, иногда я получаю как инициированные, так и инициируемые вручную электронные письма или получаю сообщение об ошибке (такое ниже).


person Ev.    schedule 02.08.2017    source источник
comment
иногда проблемы могут быть с группами безопасности. Порт может быть не открыт в вашей группе безопасности   -  person Arpit Solanki    schedule 02.08.2017
comment
Странно то, что некоторым электронным письмам удается пройти через Production. В разработке у всех так. Что заставляет меня задуматься, не в машине ли AWS проблема. Вопрос в следующем: почему некоторые электронные письма отправляются, а некоторые нет.   -  person Ev.    schedule 02.08.2017


Ответы (1)


Я решил использовать Django-Mailer. Он фрагментирует проект, чего я хотел избежать, но его использование довольно минималистично.

person Ev.    schedule 15.08.2017