You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 10:43:30