只需通过 Amazon SES 使用 Elixir Phoenix 发送电子邮件,但 cacerts 未定义

问题描述 投票:0回答:1

我怀疑问题是我根本找不到如何为 Elixir / Phoenix 配置 Amazon SES 配置的工作示例。

问题似乎是

cacerts: :undefined

export SES_SMTP_SERVER=email-smtp.us-west-1.amazonaws.com
export SES_SMTP_PORT=465
export SES_SMTP_USERNAME=redacted
export SES_SMTP_PASSWORD=redacted

这是我的

config/prod.exs

config :my_app, MyApp.Mailer,
  adapter: Bamboo.SMTPAdapter,
  server: System.get_env("SES_SMTP_SERVER") || "email-smtp.us-east-1.amazonaws.com",
  port: String.to_integer(System.get_env("SES_SMTP_PORT") || "587"),
  username: System.get_env("SES_SMTP_USERNAME"),
  password: System.get_env("SES_SMTP_PASSWORD"),
  tls: :always,
  tls_cacertfile: "/etc/ssl/certs/ca-certificates.crt",
  ssl: true,
  retries: 1,
  ssl_options: [
    verify: :verify_peer,
    cacertfile: "/etc/ssl/certs/ca-certificates.crt"
  ]

这是我尝试发送电子邮件时遇到的错误:

Failed to send email.
Reason: {:network_failure, ~c"54.176.126.9", {:error, {:options, :incompatible, [verify: :verify_peer, cacerts: :undefined]}}}

听起来好像找不到SSL/TLS(?)证书文件。我运行了

apt-get install ca-certificates
无济于事,同样的错误消息。

我查找了 Bamboo.SMTPAdapter [1] 的文档,但没有提示如何指定 SSL 证书。

有人在生产环境中成功从 Phoenix 发送了电子邮件吗?

就上下文而言,我在尝试使用 Elixir / Phoenix 通过 Gmail 发送电子邮件时遇到了类似的错误:Phoenix / Elixir:通过 Gmail 证书发送电子邮件错误

更新:我从 Swoosh 开始,改用 Bamboo,两者都不起作用,所以我的问题是:根本问题是什么?

[1] https://hexdocs.pm/bamboo_smtp/Bamboo.SMTPAdapter.html

email ssl elixir phoenix-framework amazon-ses
1个回答
0
投票

我设法让它工作。使用 Swoosh SMTPAdapter,不使用 Mua。

这是我在 2024 年使用 Amazon SES 从 Elixir Phoenix 发送电子邮件的工作配置:

smtp_relay =                                                                                                          
    System.get_env("SES_SMTP_SERVER")                                                                                 
    |> to_charlist()                                                                                                  
                                                                                                                      
config :my_app, MyApp.Mailer,                                                                                    
  adapter: Swoosh.Adapters.SMTP,                                                                                      
  relay: System.get_env("SES_SMTP_SERVER") || "email-smtp.us-east-1.amazonaws.com",                                   
  port: String.to_integer(System.get_env("SES_SMTP_PORT") || "587"),                                                  
  username: System.get_env("SES_SMTP_USERNAME"),                                                                      
  password: System.get_env("SES_SMTP_PASSWORD"),                                                                      
  tls: :always,                                                                                                       
  auth: :always,                                                                                                      
  ssl: false,  # true if using port 465                                                                               
  tls_options: [                                                                                                      
      verify: :verify_peer,                                                                                           
      middlebox_comp_mode: false, # <--- this is required!                                                         
      # cacerts: :certifi.cacerts(),
      cacerts: :public_key.cacerts_get(),                                                                             
      server_name_indication: smtp_relay, # <--- this is required!                                                    
      depth: 99,                                                                                                      
      log_level: :debug                                                                                               
    ]                                                                                                                 

我还遇到了

auth_failed
错误,这是由于使用 Amazon SES 用户名(不正确)而不是从 Amazon SES 设置页面随机生成的 SMTP 用户名和密码引起的。

祝大家好运,即使是那些投反对票的人。

© www.soinside.com 2019 - 2024. All rights reserved.