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

Rails 5.2+Devise应用无法发送邮件问题求助

解决Rails Devise + Gmail 密码重置邮件发送后收不到的问题

我明白你现在的困扰——控制台明明显示邮件已经发送成功,但就是收不到,而且试了各种配置调整都没用,确实让人头疼。结合你提供的信息(Rails 5.2、Devise、Gmail SMTP),我给你几个针对性的排查和解决方向,你可以逐一尝试:

1. 确认环境变量是否正确加载

你用了ENV["TODO_USERNAME"]和ENV["TODO_PASSWORD"]来存储Gmail账号和密码,首先要确保这些环境变量确实被正确加载到Rails应用中。
打开Rails控制台(rails c),直接执行以下命令:

puts ENV["TODO_USERNAME"]
puts ENV["TODO_PASSWORD"]

如果输出不是你实际的Gmail账号和正确密码,那问题根源就在这里——应用用了错误的凭据连接Gmail SMTP服务器。你需要检查环境变量的配置方式(比如用了dotenv的话,确认.env文件是否正确,并且重启了服务器)。

2. 改用Gmail应用专用密码(关键!)

Google已经逐步停用了“允许不太安全的应用”选项,尤其是开启了两步验证的Gmail账号,必须使用应用专用密码才能通过SMTP发送邮件:

  • 登录你的Google账号,进入「安全设置」
  • 找到「应用专用密码」选项(需要先开启两步验证)
  • 生成一个专门用于Rails应用的密码(可以命名为“Rails Devise”)
  • 把这个生成的16位密码替换掉ENV["TODO_PASSWORD"]的值

这一步是很多人忽略的点,也是最常见的解决方法。

3. 检查邮件是否被归类到垃圾邮件/促销文件夹

控制台显示“Sent mail”,说明邮件已经成功提交给Gmail SMTP服务器,但有可能被收件邮箱的邮件系统判定为垃圾邮件。先去收件箱的「垃圾邮件」「促销」文件夹里找找看,说不定邮件就在那里。

4. 修正SMTP配置的domain字段

你的配置里domain: "example.com"是错误的,应该改为和发件人邮箱匹配的域名,也就是"gmail.com":

config.action_mailer.smtp_settings = {
  # ...其他配置
  domain: "gmail.com",
  # ...其他配置
}

虽然你试过移除这个字段,但留着的话必须和发件人域名一致,否则可能影响SMTP服务器的验证。

5. 绕过Devise,直接测试ActionMailer发送

为了排除Devise的问题,你可以直接在Rails控制台里发送一封测试邮件,看看能不能收到:

ActionMailer::Base.mail(
  from: 'myemail@gmail.com',
  to: '你的收件邮箱地址',
  subject: 'Rails测试邮件',
  body: '这是一封直接通过ActionMailer发送的测试邮件'
).deliver_now

执行后看控制台输出,如果同样显示发送成功但收不到,那问题就出在ActionMailer和Gmail的配置上,和Devise无关;如果能收到,那再去排查Devise的邮件配置(比如mailer_sender是否正确)。

6. 检查Gmail账号的发送限制

有时候Gmail会限制新账号或者短时间内发送大量邮件的账号,你可以登录Google账号,查看「最近活动」里有没有关于SMTP发送的阻止记录。如果有,按照提示解除限制即可。

7. 确认default_url_options的正确格式

虽然这个配置不影响邮件发送,但为了确保邮件里的链接正常,建议把default_url_options改成标准格式:

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

不过你已经试过这个调整,所以这一步可能不是问题根源,但还是确认下。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:54:36