Rails 5.2+Devise应用无法发送邮件问题求助
我明白你现在的困扰——控制台明明显示邮件已经发送成功,但就是收不到,而且试了各种配置调整都没用,确实让人头疼。结合你提供的信息(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

