使用aiosmtplib发送Yandex邮件遇SSL证书验证失败问题求助
解决Yandex SMTP SSL证书验证失败问题
基于aiogram开发的机器人调用Yandex SMTP发送邮件时,出现SSL: CERTIFICATE_VERIFY_FAILED错误,错误信息显示无法获取本地颁发者证书。以下是具体解决方案:
可能的原因与解决步骤
1. 检查Yandex邮箱的SMTP权限与认证方式
- 确保你的Yandex邮箱已开启POP3/SMTP服务:登录Yandex邮箱,进入「设置」→「邮件客户端」,开启POP3和SMTP服务。
- 若开启了两步验证,必须使用应用密码而非邮箱原密码:在Yandex账户设置的「安全」→「应用密码」中生成专用密码,替换代码中的
YAMAIL_PASSWORD。
2. 修复Python环境的根证书(macOS专属)
macOS下的Python环境可能默认缺少根证书,导致无法验证Yandex的SSL证书。执行以下步骤:
- 找到你的Python安装路径(比如用户的Python 3.12路径为
/Applications/Python 3.12)。 - 运行该路径下的证书安装脚本:
该脚本会自动安装必要的根证书,解决验证问题。/Applications/Python 3.12/Install Certificates.command
3. 手动指定SSL上下文(备用方案)
如果上述方法无效,可以通过以下两种方式调整SSL配置:
方法A:使用系统默认根证书
import ssl async def send_mail(to: str, text: str): load_dotenv() login = os.getenv('YAMAIL_LOGIN') password = os.getenv('YAMAIL_PASSWORD') email = MIMEText(text, 'plain', 'utf-8') email['Subject'] = Header('Поступил запрос на обратную связь!', 'utf-8') email['From'] = login email['To'] = to # 创建SSL上下文,加载系统默认根证书 ssl_context = ssl.create_default_context() con = aiosmtplib.SMTP(hostname='smtp.yandex.ru', port=465, timeout=10, ssl_context=ssl_context) await con.connect() await con.login(login, password) await con.sendmail(email['From'], to, email.as_string()) await con.quit()
方法B:临时禁用证书验证(仅测试用,不推荐生产环境)
async def send_mail(to: str, text: str): load_dotenv() login = os.getenv('YAMAIL_LOGIN') password = os.getenv('YAMAIL_PASSWORD') email = MIMEText(text, 'plain', 'utf-8') email['Subject'] = Header('Поступил запрос на обратную связь!', 'utf-8') email['From'] = login email['To'] = to # 禁用证书验证,仅用于测试场景 con = aiosmtplib.SMTP(hostname='smtp.yandex.ru', port=465, timeout=10, use_tls=True, validate_certs=False) await con.connect() await con.login(login, password) await con.sendmail(email['From'], to, email.as_string()) await con.quit()
内容的提问来源于stack exchange,提问作者dasEgo
相关产品推荐
相关产品推荐

