Phoenix/Elixir通过Gmail发送邮件出现证书错误求助
问题分析与解决方案
你的判断方向是对的,这个错误确实和SSL证书验证直接相关——Erlang的SSL模块在验证Gmail服务器证书时,找不到可用的CA证书(cacerts: :undefined),但同时启用了证书强制验证(verify: :verify_peer),二者冲突导致连接失败。
错误根源拆解
从报错信息{:options, :incompatible, [verify: :verify_peer, cacerts: :undefined]}可以明确:
- Swoosh SMTP适配器默认开启了服务器证书验证(
verify: :verify_peer) - 但Erlang无法自动获取到系统CA证书列表,导致验证流程无法完成
具体解决方案
1. 手动指定CA证书路径
Ubuntu系统的CA证书默认存放在/etc/ssl/certs/ca-certificates.crt,直接在Mailer配置中添加该路径:
config :my_app, MyApp.Mailer, adapter: Swoosh.Adapters.SMTP, relay: "smtp.gmail.com", username: "myemail@gmail.com", password: "abcd 1234 abcd 1234", ssl: true, tls: :never, # 端口465为SSL直连模式,无需再启用TLS协商 auth: :always, port: 465, retries: 1, ssl_options: [ cacertfile: "/etc/ssl/certs/ca-certificates.crt", verify: :verify_peer, depth: 2 ]
2. 改用Gmail推荐的STARTTLS模式(更稳定)
Gmail官方更推荐使用端口587的STARTTLS模式,调整配置如下:
config :my_app, MyApp.Mailer, adapter: Swoosh.Adapters.SMTP, relay: "smtp.gmail.com", username: "myemail@gmail.com", password: "abcd 1234 abcd 1234", ssl: false, tls: :always, auth: :always, port: 587, retries: 1, ssl_options: [ cacertfile: "/etc/ssl/certs/ca-certificates.crt", verify: :verify_peer ]
3. 确认Erlang的CA证书加载能力
通过Erlang Shell检查是否能自动获取CA证书:
iex> :public_key.cacert_get()
如果返回空列表,说明Erlang无法自动识别系统CA路径,必须手动指定cacertfile。
4. 修复系统CA证书文件
如果证书文件损坏或缺失,重新安装并更新:
sudo apt-get install --reinstall ca-certificates sudo update-ca-certificates
额外注意事项
- 若Google账号开启了两步验证,必须使用应用专用密码(当前密码格式符合要求,可确认是否已正确生成)
- 确保服务器出站端口465/587未被防火墙或安全组拦截
内容的提问来源于stack exchange,提问作者legoblocks
相关产品推荐
相关产品推荐

