Rails5.2でSendGridを使う


Rails5.2で色々やってみる という記事の続きで、メール送信機能を実装します。

まずは、railsコマンドでメーラの作成をします。

rails g mailer Notifications greet
:(省略)

greetというメソッドとテンプレート(textとhtml)が生成されています。今回は送信先のアドレスのみ引数として受け付けるように修正しました(その他はそのまま)。

app/mailers/notifications_mailer.rb
  def greet(to)
    @greeting = "Hi"

    mail to: to
  end

メールの送信フォーム(mail1)と送信完了のページ(mail2)を作成します。

config/routes.rb
  get '/mail1', to: 'pages#mail1'
  post '/mail2', to: 'pages#mail2'

コントローラ内の実装は以下のようになります。先に定義したgreetメソッドにメールの送信先を渡してそのまま配信しています。

app/controllers/pages_controller.rb
  def mail1
  end

  def mail2
    @to = params[:to]
    NotificationsMailer.greet(@to).deliver_later
  end

対応するビューは以下のようになります。

app/views/pages/mail1.html.erb
<%= form_tag mail2_path do %>
  <% if flash[:error].present? %>
    <div id="error_explanation">
      <p><%= flash[:error] %></p>
    </div>
  <% end %>
    To:
    <%= text_field_tag :to, "", {placeholder: "[email protected]" ,size: 60} %>
    <%= submit_tag 'Send email' %>
<% end %>
app/views/pages/mail2.html.erb
<p>Message was sent to <%= @to %></p>
<p><%= link_to 'Back', mail1_path %></p>

ローカルの開発環境(development)では実際にメールは送信されず、ログに送信されるメールが出力されますので、ここまでの設定でテストが可能なはずです。次にproduction環境にSendGridを設定します。SendGridのダッシュボードから秘密鍵を取得しておいてください。

config/environments/production.rb
  ActionMailer::Base.smtp_settings = {
    :user_name => 'apikey',
    :password => Rails.application.credentials.sendgrid_secret_key,
    :domain => 'wiki.lmlab.net',
    :address => 'smtp.sendgrid.net',
    :port => 2525,
    :authentication => :plain,
    :enable_starttls_auto => true
  }

sendgrid_secret_keyは以下のコマンドでcredentials.ymlを開いて書き込んでください(master.keyの無い環境では読み書きできません、heroku環境でのRAILS_MASTER_KEYの設定方法については Rails5.2でStripeを使うのおまけ欄を参照してください)。

EDITOR=vim rails credentials:edit