LoginSignup
1

More than 3 years have passed since last update.

posted at

updated at

Rails5.2でSendGridを使う

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

sendgrid.png

まずは、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: "smith@example.com" ,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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1