You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动