Похоже, что версия Python 3.13 изменила требования к одному из параметров сертификатов SSL. И если в сертификатах ваших почтовых серверов не установлен этот новый параметр, доставка вашей электронной почты не удастся из-за сбоя SSL.
В каждом сертификате есть поле под названием «Базовые ограничения», которое было проигнорировано в предыдущих версиях Python, но теперь он ищет, чтобы для этого поля было установлено значение «Критический». Если это не так, SSL объявляет рукопожатие неудавшейся проверкой. Поэтому выдается исключение.
Я проверил сертификацию, которую мой почтовый сервер использует для SSL, и в этом поле установлено значение False, а не Critical. А так как хостинг-провайдер не имеет возможности менять сертификат для отдельных клиентов, то придется покупать собственный сертификат и устанавливать его на сервер. Это дорого обходится каждому домену, используемому для доставки электронной почты.
Предложите другим столкнуться с этой проблемой и обойти ее без необходимости приобретать специальную сертификацию из-за настроек, установленных их поставщиками услуг электронной почты. поставил? Конечно, один из способов обойти эту проблему — игнорировать проверку SSL, но это не кажется разумным.
Я удивлен, что в Python не будет новой настройки, позволяющей принять предыдущий уровень сертификации, который поддерживается версия 3.12. Но мы можем запустить одно и то же программное обеспечение на разных версиях Python и увидеть сбой в версии 3.13.
Код: Выделить всё
import ssl
EmailServer = 'SomeDomain.com'
EmailPort = 465
context = ssl.create_default_context()
with smtplib.SMTP_SSL (EmailServer, EmailPort, context=context) as server:
server.login(EmailServerUsername, EmailServerPassword)
server.send_message(msg)
Выдается исключение: Исключение отправки электронной почты [SSL: CERTIFICATE_VERIFY_FAILED] проверка сертификата не удалась: основные ограничения сертификата CA не помечены как критические (_ssl.c:1018)
РЕШЕНИЕ. При чтении примечаний к выпуску Python 3.13 я обнаружил, что в SSL установлен флаг, требующий более строгий сертификат SSL для прохождения проверки. Отключение этого «строгого флага» возвращает SSL к тому же уровню проверки, который был в версии 3.12. Таким образом, следующая строка добавляется после оператора context = ssl.create_default_context().
Код: Выделить всё
context.verify_flags &= ~ssl.VERIFY_X509_STRICT
Возможно, заголовок не совсем правильный, но его цель состояла в том, чтобы привлечь внимание и предложить, как решить конкретную проблему, с которой пришлось столкнуться. Дело не столько в поломке электронной почты, сколько в том, что версия 3.13 повысила уровень безопасности SSL по сравнению с версией 3.12. Но с таким названием можно было бы не осознать последствий такого изменения, если бы они не столкнулись с проблемой доставки электронной почты, как я. Первые опубликованные комментарии действительно указали на решение. К сожалению, мой хостинг-провайдер не предоставляет сертификаты с такими строгими настройками, как того требует версия 3.13
Подробнее здесь: https://stackoverflow.com/questions/793 ... ssl-change
Мобильная версия