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

Fly.io部署Phoenix应用调用Resend API发邮件报错求助

解决方案:Fly.io环境下Resend API调用因CA证书缺失失败

问题根源

错误:enoent表示文件不存在,结合调用栈里的pubkey_os_cacerts.get/0,说明Erlang的httpc适配器在Fly.io容器中找不到系统CA证书——这是因为部分精简容器镜像未预装CA证书,或者Erlang/OTP 26在容器环境下默认的CA证书路径不匹配。

可行解决方法

方法1:切换Tesla适配器为Hackney(推荐)

Hackney适配器自带CA证书,无需依赖系统证书文件,能直接解决问题:

  1. 在mix.exs的依赖中添加hackney:
    defp deps do
      [
        # 其他依赖...
        {:hackney, "~> 1.18"}
      ]
    
  2. 运行mix deps.get安装依赖。
  3. 配置Resend使用Hackney适配器,在config/runtime.exs中添加:
    config :resend, adapter: Tesla.Adapter.Hackney
    

方法2:手动指定CA证书路径(适用于坚持使用httpc的场景)

Fly.io的Debian/Ubuntu镜像中,CA证书通常位于/etc/ssl/certs/ca-certificates.crt,可以给httpc适配器指定该路径:

config :tesla, Tesla.Adapter.Httpc,
  httpc_options: [
    ssl: [cacertfile: "/etc/ssl/certs/ca-certificates.crt"]
  ]

方法3:确保容器镜像预装CA证书

如果使用自定义Docker镜像,需要在Dockerfile中安装CA证书包:

# 基于官方Elixir镜像的示例
FROM elixir:1.15.4-slim

# 安装CA证书
RUN apt-get update && \
    apt-get install -y --no-install-recommends ca-certificates && \
    rm -rf /var/lib/apt/lists/*

# 其他构建步骤...

验证

部署修改后的代码到Fly.io,触发邮件发送功能,检查Sentry是否再出现该错误,同时确认Resend后台是否收到发送请求。

内容的提问来源于stack exchange,提问作者hackemate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:42:40