使用smtplib发送邮件时出现SSL证书验证失败错误的求助
解决
ssl.SSLCertVerificationError证书验证失败问题 这个错误我之前帮不少Mac用户排查过,核心原因不是Python版本切换,而是你用的是从Python官网下载安装的版本(路径里的/Library/Frameworks/Python.framework就是典型标志)——这类Python默认不会自动配置系统根证书,导致连接SMTP服务器时没法验证对方的SSL证书,所以触发了这个报错。换回3.7.6也报错,是因为3.7的官网安装包同样存在这个证书未配置的问题。
下面是几种修复方案,按推荐程度排序:
1. 手动安装Python根证书(最推荐,永久解决)
这是官方提供的标准解决方案,操作很简单:
- 打开Finder,找到
/Applications/Python 3.9/(如果你用的是3.7版本,就找Python 3.7文件夹) - 双击运行文件夹里的
Install Certificates.command脚本,它会自动把系统根证书安装到Python的证书库中 - 运行完成后,再重新测试你的邮件发送代码,应该就能正常连接SMTP服务器了
2. 临时跳过证书验证(仅限测试,不推荐正式环境)
如果只是临时调试代码,不想装证书,可以临时关闭证书验证(注意:这个操作会让你的SSL连接失去安全性,容易被中间人攻击,正式环境绝对不能用):
修改你的context创建代码:
import smtplib, ssl def sendEmail(): port = 465 # For SSL password = 'password' senderEmail = 'senderEmail@email.com' # 修改context配置,临时关闭证书验证 context = ssl.create_default_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context) as server: server.login(senderEmail, password) message = 'Hello world!' server.sendmail(senderEmail, 'myEmail@email.com', message) sendEmail()
3. 指定自定义证书文件(适合特殊环境)
如果你有自己的根证书文件(比如企业内部的自定义证书),可以在创建context时直接指定证书路径:
context = ssl.create_default_context(cafile="/absolute/path/to/your/certificate.pem")
额外提醒(针对Gmail)
等证书问题解决后,你可能还会遇到Gmail登录失败:
- 如果你的账号开启了两步验证,需要生成App密码来代替原密码登录
- 如果没开两步验证,需要在Gmail设置里开启“不太安全的应用访问”(不过更推荐开启两步验证用App密码,安全性更高)
内容的提问来源于stack exchange,提问作者Catyre




