使用 mailgun-ruby 在 Rails 中设置 erb 模板

setting erb template in Rails with mailgun-ruby

我想使用 mailgun-ruby MessageBuilder API 在我的生产环境中构建和发送应用程序电子邮件。文档建议我做这样的事情:

def confirmation_instructions(record, token, opts={})
 mg_client = Mailgun::Client.new ENV['MAILGUN_API_KEY']
 mb_obj = Mailgun::MessageBuilder.new

 mb_obj.from("from@site.com", {"first" => "First", "last" => "Last"})
 mb_obj.add_recipient(:to, record.email)
 mb_obj.subject("Please confirm your account")
 mb_obj.body_html("<p>how would i pass the default confirmation_instructions erb template as an argument to this method?</p>")
 mg_client.send_message("mail.site.com", mb_obj)
end

问题是,一旦我开始使用 Mailgun,我也停止使用 ActionMailer 的默认 mail() 语法。这似乎可以防止 Rails 手动 selecting 匹配方法名称的模板。

我的第一个想法是我需要手动 select 它。回答 here 说我可以像这样更改模板:

mail(to: user.email, subject: "New Projects") do |format|
 format.html { render layout: layout_name }
 format.text { render layout: layout_name }
end

但此语法与 mailgun-ruby 的预期冲突。我不能离开 body/text 设置方法,如果我这样做,它会抛出一个错误:Mailgun::CommunicationError (400 Bad Request: Need at least one of 'text' or 'html' parameters specified)

在上面的第一个示例中,我如何将正确的布局传递给 body_html?也就是说,不直接将 html 作为参数写入?


更新:我的 rake routes 确认

new_user_confirmation    GET    /users/confirmation/new(.:format) users/confirmations#new
user_confirmation        GET    /users/confirmation(.:format) users/confirmations#show
                         POST   /users/confirmation(.:format) users/confirmations#create
update_user_confirmation PATCH  /users/confirmation(.:format) users/confirmations#update 

查看 gem 的问题,似乎不受支持。

方法是使用您喜欢的模板引擎并将输出提供给 body_html

你不是在告诉它,而是看方法名称,我猜你正在使用 Devise gem,并且你想发送它的内容。

以下是如何让它工作(没试过):

def confirmation_instructions(record, token, opts={})
  email_html_body = ERB.new(File.read('devise/mailer/confirmation_instructions.html.erb'))
                       .result_with_hash(
                         email: current_user.email,
                         resource: resource,
                         token: @token
                       )

  # ...
  mb_obj.body_html(email_html_body)
  # ...
end

哇,所以...Rails 默认 mail() 语法 仍然适用于 Mailgun。我不知道为什么不是第一次尝试,但我认为这与我没有将 production.rb 配置设置为 config.action_mailer.delivery_method = :mailgun.