使用Swoosh发送邮件遇超时错误,寻求技术支援
解决Swoosh发送Gmail邮件的超时问题
看起来你被Swoosh发送Gmail邮件的超时问题卡住了,结合你的代码和错误信息,我帮你梳理几个关键问题,一步步解决:
1. 先把配置里的「重复adapter」坑填上
你的config.exs里重复写了三次adapter,Elixir的配置会取最后一个生效——也就是Swoosh.Adapters.Local,这根本不是用来发真实SMTP邮件的适配器!这是导致你无法连接Gmail SMTP的第一个核心问题:
# 错误的配置(重复adapter,最后Local生效) config :mailapp, Mailapp.Mailer, adapter: Swoosh.Adapters.SMTP, adapter: Swoosh.Adapters.Test, adapter: Swoosh.Adapters.Local, # 这个会覆盖前面所有adapter设置 relay: "smtp.gmail.com", username: "firstname.lastname", password: "password", tls: :always, auth: :always, port: 1025
改成只保留SMTP适配器,同时修正几个关键参数:
config :mailapp, Mailapp.Mailer, adapter: Swoosh.Adapters.SMTP, relay: "smtp.gmail.com", username: "your-full-gmail@gmail.com", # 必须填完整邮箱地址,不是前缀 password: "your-app-specific-password", # 下面会讲这个密码的要求 tls: :always, auth: :always, port: 587 # Gmail SMTP的正确TLS端口,不是1025(1025是Local适配器的测试端口)
2. 搞定Gmail SMTP的认证要求
Gmail对SMTP客户端的限制比较严格,这里有两个必注意的点:
- 端口选择:用
587(TLS模式)或者465(SSL模式),你之前写的1025是Local适配器用来本地测试的端口,完全不匹配Gmail的服务,这也是超时的主要原因。 - 密码问题:如果你的Google账号开启了两步验证,普通的登录密码无法用于SMTP,必须创建应用专用密码:
- 登录Google账号的安全设置页面
- 找到「应用专用密码」(前提是已经开启两步验证)
- 创建一个新的应用专用密码,把这个密码填到配置里即可
- 用户名:一定要填写完整的Gmail邮箱地址,比如
firstname.lastname@gmail.com,不能只写前缀firstname.lastname。
3. 检查网络连通性
超时也可能是本地网络阻止了SMTP请求,你可以先测试下能不能连通Gmail的SMTP服务器:
telnet smtp.gmail.com 587
如果连接失败,检查本地防火墙、杀毒软件是否拦截了587端口的出站请求,或者你的网络是否能正常访问Google服务。
4. 测试修正后的代码
修改配置后,重启iex并重新编译项目:
iex -S mix
然后再执行发送命令试试:
Mailapp.UserEmail.welcome(%{name: "Name", email: "example.name@gmail.com"}) |> Mailapp.Mailer.deliver
额外提示:分环境配置更清晰
如果你想在测试环境用Test适配器(比如你写的测试用例),不要把生产和测试配置混在一起,建议分环境配置:
# config/config.exs(生产/开发环境) config :mailapp, Mailapp.Mailer, adapter: Swoosh.Adapters.SMTP, relay: "smtp.gmail.com", # ... 其他生产配置参数 # config/test.exs(测试环境) config :mailapp, Mailapp.Mailer, adapter: Swoosh.Adapters.Test
这样测试时用Test适配器,开发/生产用SMTP,不会出现配置冲突的问题。
内容的提问来源于stack exchange,提问作者Sh4dy
相关产品推荐
相关产品推荐

