Flask-Mail发送邮件遇ssl.SSLError错误的解决求助
解决Flask-Mail调用MailTrap时的SSL版本错误
问题分析
出现ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:997)错误,核心原因通常是SSL/TLS配置与邮件服务器端口不匹配、配置未正确加载,或是依赖库兼容性冲突导致的。
解决方案步骤
1. 确认环境变量已正确加载
确保Flask应用真正读取到了.env中的配置。如果使用python-dotenv,需在应用初始化阶段添加加载逻辑:
from dotenv import load_dotenv import os load_dotenv() # 加载.env文件中的环境变量 app = Flask(__name__) # 显式从环境变量读取配置并转换类型 app.config['MAIL_SERVER'] = os.getenv('MAIL_SERVER') app.config['MAIL_PORT'] = int(os.getenv('MAIL_PORT')) app.config['MAIL_USERNAME'] = os.getenv('MAIL_USERNAME') app.config['MAIL_PASSWORD'] = os.getenv('MAIL_PASSWORD') app.config['MAIL_USE_SSL'] = os.getenv('MAIL_USE_SSL') == 'true' app.config['MAIL_USE_TLS'] = os.getenv('MAIL_USE_TLS') == 'true' app.config['MAIL_SENDER'] = os.getenv('MAIL_SENDER') # 确保该变量在.env中已配置
很多时候错误源于配置未被正确读取,导致Flask-Mail使用了默认的SSL设置。
2. 验证Flask-Mail的初始化逻辑
检查gymanager/extensions/mailer.py中的邮件初始化代码,确保它正确绑定了应用配置:
from flask_mail import Mail mail = Mail() def init_app(app): mail.init_app(app)
并在应用工厂函数中调用mail.init_app(app),让mail对象能获取到正确的SSL和端口配置。
3. 使用MailTrap官方推荐的配置组合
MailTrap官方针对Flask-Mail的标准配置如下,优先使用这套配置测试:
MAIL_SERVER="sandbox.smtp.mailtrap.io" MAIL_PORT=2525 MAIL_USERNAME="你的MailTrap用户名" MAIL_PASSWORD="你的MailTrap密码" MAIL_USE_SSL=false MAIL_USE_TLS=true MAIL_SENDER="no-reply@yourapp.com" # 补充发件人配置
若仍报错,可切换到587端口(同样使用TLS):
MAIL_PORT=587 MAIL_USE_SSL=false MAIL_USE_TLS=true
注意:禁止同时将MAIL_USE_SSL和MAIL_USE_TLS设为true,这会导致协议冲突。
4. 排查本地代理/防火墙干扰
如果开发环境使用了VPN、代理软件或防火墙,可能会拦截SMTP连接导致SSL版本协商失败:
- 临时关闭代理工具后重试
- 用
telnet sandbox.smtp.mailtrap.io 2525测试端口连通性,若无法连接则说明是网络问题。
5. 调整cryptography库版本
部分场景下,SSL版本错误是cryptography库与Flask-Mail的兼容性问题导致的,可安装稳定版本:
pip uninstall cryptography -y pip install cryptography==39.0.1
额外检查点
- 确认MailTrap控制台中的用户名、密码无拼写错误
- 确保
MAIL_SENDER配置的邮箱格式合规,比如"Your App" <no-reply@yourapp.com>
内容的提问来源于stack exchange,提问作者Lucas Ferreira
相关产品推荐
相关产品推荐

