Docker контейнер для django приложения, при отправке сообщения на почту, выдает ошибку ssl.SSLCertVerificationError, как ее устранить?

Я работаю с django приложением, которое я поднимаю через команду: docker compose up --build. Контейнер собирается исправно, но когда дело доходит до отправки сообщения на почту все падает со следующим текстом ошибки


    email_sender  | Traceback (most recent call last):
    email_sender  |   File "manage.py", line 22, in <module>
    email_sender  |     main()
    email_sender  |   File "manage.py", line 18, in main
    email_sender  |     execute_from_command_line(sys.argv)
    email_sender  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
    email_sender  |     utility.execute()
    email_sender  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 436, in execute
    email_sender  |     self.fetch_command(subcommand).run_from_argv(self.argv)
    email_sender  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 412, in run_from_argv
    email_sender  |     self.execute(*args, **cmd_options)
    email_sender  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 458, in execute
    email_sender  |     output = self.handle(*args, **options)
    email_sender  |   File "/sender/handler/management/commands/send_email.py", line 17, in handle
    email_sender  |     sendRegEmail()
    email_sender  |   File "/sender/handler/management/commands/send_email.py", line 12, in sendRegEmail
    email_sender  |     sending_email.send()
    email_sender  |   File "/usr/local/lib/python3.8/site-packages/django/core/mail/message.py", line 298, in send
    email_sender  |     return self.get_connection(fail_silently).send_messages([self])
    email_sender  |   File "/usr/local/lib/python3.8/site-packages/django/core/mail/backends/smtp.py", line 127, in send_messages
    email_sender  |     new_conn_created = self.open()
    email_sender  |   File "/usr/local/lib/python3.8/site-packages/django/core/mail/backends/smtp.py", line 92, in open
    email_sender  |     self.connection.starttls(context=self.ssl_context)
    email_sender  |   File "/usr/local/lib/python3.8/smtplib.py", line 788, in starttls
    email_sender  |     self.sock = context.wrap_socket(self.sock,
    email_sender  |   File "/usr/local/lib/python3.8/ssl.py", line 500, in wrap_socket
    email_sender  |     return self.sslsocket_class._create(
    email_sender  |   File "/usr/local/lib/python3.8/ssl.py", line 1073, in _create
    email_sender  |     self.do_handshake()
    email_sender  |   File "/usr/local/lib/python3.8/ssl.py", line 1342, in do_handshake
    email_sender  |     self._sslobj.do_handshake()
    email_sender  | ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1135)

При этом, если не использовать docker и отправить сообщение на почту, все работает хорошо.

Код Dockerfile-а


    FROM python:3.8
    ENV PYTHONDONTWRITEBYTECODE 1
    ENV PYTHONUNBUFFERED 1
    WORKDIR sender
    COPY requirements.txt /sender/
    RUN pip install -r requirements.txt 
    COPY . /sender/
    ENTRYPOINT python manage.py send_email # вызов функции, которая отправляет сообщение на почту

Код Docker-compose.yml файла


    version: '3'
    services:
      email_sender:
        build:
          context: .
          dockerfile: ./deploy/python/Dockerfile
        container_name: email_sender
        env_file:
          - .env
        ports:
          - 587:587
          - 465:465

Код настроек подключения к SMTP серверу в файле settings.py


    EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
    EMAIL_HOST = "smtp.mail.ru"
    EMAIL_PORT = 587
    EMAIL_USE_TLS = True
    EMAIL_USE_SSL = False
    EMAIL_HOST_USER = "почта"
    EMAIL_HOST_PASSWORD = "пароль"

Код файла, в котором определена функция отправки сообщения на почту, send_email.py


    from django.core.management.base import BaseCommand
    from django.core.mail import EmailMultiAlternatives
    from datetime import datetime
    
    def sendRegEmail():
      sending_email = EmailMultiAlternatives(
        'заголовок',
        'текст',
        'почта отправителя',
        ['почта получателя'],
      )
      sending_email.send()
    
    
    class Command(BaseCommand):
      def handle(self, *args, **options):
        sendRegEmail()

Вот что я уже пробовал:

  1. Менял настройки в settings.py

    EMAIL_PORT = 465
    EMAIL_USE_TLS = False
    EMAIL_USE_SSL = True

  1. Устанавливал через openssl сертификат, через команду: openssl s_client -servername smtp.mail.ru -connect smtp.mail.ru:465 | openssl x509 > mailru.crt. После данный сертификат через Dockerfile добавлял в контейнер в список доверенных сертификатов:

    COPY mailru.crt /usr/local/share/ca-certificates/mailru.crt
    RUN update-ca-certificates

  1. Менял расширение ssl сертификата с crt на pem при помощи команды: openssl x509 -in cert.crt -inform DER -out cert.pem -outform PEM и после через Dockerfile добавлял в список доверенных сертификатов, как и в пункте 2
Вернуться на верх