Rails 5集成Sendgrid:使用html.erb发邮件时ERB代码不生效
解决Rails 5 + SendGrid邮件ERB不解析及发送失败问题
我之前也碰到过一模一样的情况,ERB代码原封不动出现在邮件里真的很头疼,而且按官方教程配置发不出邮件大概率是SMTP设置的小细节没搞对,下面给你一步步解决:
一、先搞定ERB模板不解析的问题
核心原因是你可能没有让Rails的ActionMailer来渲染模板,而是直接读取了静态文件内容。正确的做法是利用Rails自带的模板渲染机制:
1. 确保邮件类正确配置
你的邮件类要继承ActionMailer::Base,并在邮件方法里指定渲染逻辑:
# app/mailers/user_mailer.rb class UserMailer < ActionMailer::Base default from: 'your-verified-email@example.com' # 必须用SendGrid验证过的发件邮箱 def test_erb_email(recipient_email) # 这里会自动去app/views/user_mailer/目录找test_erb_email.html.erb模板 mail(to: recipient_email, subject: 'ERB Render Test') do |format| format.html end end end
2. 手动渲染模板(如果需要自定义内容)
如果需要手动获取渲染后的HTML内容再发送,别用File.read,要用render_to_string触发Rails的ERB解析:
html_content = render_to_string( template: 'user_mailer/test_erb_email', layout: false # 不需要应用布局的话加这个参数 ) mail( to: 'recipient@example.com', subject: 'Custom Rendered Email', html_body: html_content )
二、修复SendGrid配置导致的邮件发送失败问题
官方教程的配置在Rails 5里有个极易踩的坑,按下面的配置来:
1. 配置Gemfile
确保添加SendGrid的官方gem:
# Gemfile gem 'sendgrid-ruby'
然后执行bundle install完成安装。
2. 配置环境文件(比如config/environments/production.rb)
最关键的点:user_name必须是固定值'apikey',不是你的SendGrid账户名:
# config/environments/production.rb config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: 'smtp.sendgrid.net', port: 587, domain: 'your-app-domain.com', # 比如你的Heroku域名或自定义域名 user_name: 'apikey', # 固定值,别改成自己的用户名! password: ENV['SENDGRID_API_KEY'], # 把API密钥存在环境变量里,别硬编码 authentication: :plain, enable_starttls_auto: true }
开发环境的话,在config/environments/development.rb里做同样配置即可。
3. 测试发送
在Rails控制台里调用邮件方法测试:
UserMailer.test_erb_email('your-test-email@example.com').deliver_now
如果有报错,看控制台的错误信息排查——常见问题比如API密钥不正确、发件邮箱没在SendGrid验证、域名未配置等。
三、额外注意事项
- 确保你的
html.erb模板放在正确目录:app/views/[你的邮件类名小写]/,比如user_mailer对应的目录就是app/views/user_mailer/。 - 不要跳过ActionMailer直接用SendGrid的Ruby API发送,那样Rails的模板渲染机制不会生效,ERB自然不会被解析。
内容的提问来源于stack exchange,提问作者Noel Delgado
相关产品推荐
相关产品推荐

