Action Mailer if 경로

13282 단어 Railstech
이 항목은 iCARE Advent Calendar 2020의 20일째 글입니다.

이거 뭐야?


며칠 전 라일스가 개발한 서비스에 사용된 메일 발송용gem이 2년 동안 업데이트되지 않아 메일 발송 서비스(Send Grid) 측 일부 기능을 사용할 수 없어 다른 gem로 바꿨다.
바뀐gem은 SendGrid가 공식적으로 발표한 gemsendgrid-ruby이 아니라 ActionMailer가 메일로 요청을 보내려는 gemsendgrid-actionmailer(내부적으로sendgrid-ruby 사용)
하지만 원래 Action Mailer는 내부에서 메일이gem를 사용했고 전송 방법은pluggable이다.
따라서sendgrid-ruby로delivery method를 독자적인 편지 조립 방법으로 변경하고 싶습니다.

컨디션


・ruby2.6.5
・rails 5.0.7
・sendgrid-ruby6.3.7
· 우편물 2.6.6

API Key 생성


측면 메뉴의 Setting API Keys에서 마이그레이션하고 Create API Key 버튼을 클릭하면 API Key를 만들 수 있는 권한이 있습니다.

gem 추가


Gemfile
gem 'sendgrid-ruby'

delivery_method의 변경 사항


app/mailers/send_grid_mail.rb
class SendGridMail

  def initialize(settings)
    @settings = settings
  end

  def deliver!(mail)
    personalization = SendGrid::Personalization.new
    personalization.add_to(SendGrid::Email.new(email: mail.to.first))
    personalization.subject = mail.subject

    send_grid_mail = SendGrid::Mail.new
    send_grid_mail.from = SendGrid::Email.new(email: mail.from.first)
    send_grid_mail.subject = mail.subject
    send_grid_mail.add_content(SendGrid::Content.new(type: 'text/html', value: mail.body.raw_source))
    send_grid_mail.add_personalization(personalization)

    send_grid = SendGrid::API.new(api_key: @settings[:api_key])
    begin
      response = send_grid.client.mail._('send').post(request_body: send_grid_mail.to_json)
    rescue Exception => e
      # Sentryへ通知
      Raven.capture_exception(e)
    end
  end
end
config/environments/development.rb
  ActionMailer::Base.add_delivery_method :sendgrid, SendGridMail
  config.action_mailer.delivery_method = :sendgrid
  config.action_mailer.sendgrid_settings = {
    api_key: ENV['SENDGRID_API_KEY_FOR_SEND_MAIL']
  }

시용하다


app/mailers/test_mailer.rb
class TestMailer < ApplicationMailer
  def send_mail(to='[email protected]', from='[email protected]', subject='件名:テストメール', body='はじめてのメール')
    @body = body
    @title = subject
    mail(to: to, from: from, subject: subject)
  end
end
app/views/test_mailer/send_mail.html.erb
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta name="viewport" content="width=device-width"/>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title><%= @title %></title>
  </head>
  <body>
    <%= raw @body %>
  </body>
</html>

최후


iCARETech Blog도 매달 투고하기 때문에 꼭 보세요!
그리고 Meet Up도 개최하고 있으니 관심 있는 분들은 언제든지 참가해 주세요!

좋은 웹페이지 즐겨찾기