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()
Вот что я уже пробовал:
- Менял настройки в settings.py
EMAIL_PORT = 465
EMAIL_USE_TLS = False
EMAIL_USE_SSL = True
- Устанавливал через 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
- Менял расширение ssl сертификата с crt на pem при помощи команды: openssl x509 -in cert.crt -inform DER -out cert.pem -outform PEM и после через Dockerfile добавлял в список доверенных сертификатов, как и в пункте 2