Rails 7中ActiveMailer SMTP配置不生效问题求助
我之前也碰到过一模一样的问题,你的核心问题是直接给ActionMailer::Base.smtp_settings赋值的方式不对,Rails的环境配置流程会导致这种设置被覆盖或者没有正确加载到Rails.configuration里,所以才会出现默认连接本地25端口被拒绝的错误。
修复步骤
修改配置方式,改用Rails环境配置对象设置SMTP参数
把你config/development.rb里的SMTP配置代码改成下面这样,用config.action_mailer.smtp_settings代替直接修改ActionMailer::Base的属性:config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp config.action_mailer.default_url_options = { host: 'localhost:3000' } config.action_mailer.smtp_settings = { user_name: 'apikey', password: '****', domain: 'yourdomain.com', address: 'smtp.sendgrid.net', port: 587, authentication: :plain, enable_starttls_auto: true }原因:Rails的环境配置系统会统一管理所有框架组件的设置,直接修改
ActionMailer::Base的类属性,可能在初始化流程的后期被Rails的默认配置覆盖,或者没有同步到Rails.configuration中,导致byebug查看时看不到完整配置。必须重启Rails服务器
改完配置文件后一定要重启服务器,否则新的配置不会被加载——这是很多人容易忽略的点!验证配置是否生效
重启服务器后,再次用byebug查看Rails.configuration.action_mailer.smtp_settings,如果配置正确加载,应该能看到你设置的所有SMTP参数,而不是只有默认的:open_timeout和:read_timeout。
额外排查点
- 确认
config/development.rb确实被加载:可以在文件开头加一句puts "Loaded development mailer config",启动服务器时看控制台有没有输出这句话,排除文件没被加载的可能。 - 检查是否有其他配置文件覆盖了SMTP设置:比如
config/application.rb或者config/initializers目录下的脚本,有没有重新设置过action_mailer.smtp_settings。 - 确认SendGrid的API密钥和域名正确:API密钥要完全匹配你在SendGrid控制台获取的内容,域名最好是你在SendGrid验证过的域名(本地测试时用
localhost也可以,但部分邮件服务商可能有限制)。
错误原因解释
你看到的Errno::ECONNREFUSED错误是因为Rails使用了默认的SMTP配置(连接本地127.0.0.1的25端口),而不是你配置的SendGrid服务器,这直接说明你的自定义SMTP配置没有生效。
内容的提问来源于stack exchange,提问作者Jin Lim

