RailsとSendGridでメール送信処理を実装する

公開日:2019/10/04 更新日:2019/10/04
RailsとSendGridでメール送信処理を実装するのサムネイル

mail-image.jpg Photo by Web Hosting on Unsplash

はじめに

Ruby on RailsからAction Mailerを使用してSendGrid経由でメールを送信する処理を実装したのでその手順をまとめます。

前提と環境

以下の通りです。

  • Ruby on Rails : 5.2.2
  • Send Gridアカウントは作成済とする
  • Rails側でemailnameをカラムとして持つUserモデルを作成済とする

基本的な手順は以下のSend Gridの公式ドキュメントに従って行いました。公式ドキュメントには、Ruby on Rails以外にもCake PHP、Djangoなどのフレームワークについての手順も記載されています。

sendgrid.kke.co.jp

以下の例ではユーザのサインアップのためにメールを利用する方法を示します。より高度な機能を実現するためにこちらのgem を利用することも可能です。

Action Mailerを設定する

メール送信処理実装に必要なファイルを作成してくれるAction Mailerのジェネレータを実行します。

$ bundle exec rails generate mailer UserNotifier

上記を実行すると以下のように表示されいくつかのファイルとディレクトリが作成されることを確認できます。

 $ bundle exec rails generate mailer UserNotifier
      create  app/mailers/user_notifier_mailer.rb
      invoke  erb
      create    app/views/user_notifier_mailer
      invoke  test_unit
      create    test/mailers/user_notifier_mailer_test.rb
      create    test/mailers/previews/user_notifier_mailer_preview.rb

作成されたファイルを以降で修正していきます。

メール送信を実行する処理を書く

ジェネレータによって作成されたapp/mailers/user_notifier_mailer.rbを以下のように内容を変更します。

app/mailers/user_notifier_mailer.rb
class UserNotifierMailer < ApplicationMailer
    default :from => 'notify@yourdomain' # 送信元アドレスの指定

    # サインアップ時(ユーザ新規登録時)にメール送信するためのアクション
    def send_signup_email(user)
      @user = user
      mail( :to => @user.email, # 送信先アドレスの指定
            :subject => 'ご登録ありがとうございます!'  # 送信メールの件名
          )
    end
end

上記は、例としてRailsによって構築されているアプリがユーザーサインインが必要なものとし、サインアップした時にその旨を通知するためのアクションをsend_signup_emailという名前で定義しています。 このsend_signup_emailを以降でユーザのコントローラ内でサインインした時の処理に追加します。

メールのテンプレートファイルを作成する

続いてユーザに送信するメールのテンプレートファイルをHTML表示用とテキスト用の2種類作成します。 ディレクトリapp/views/user_notifier_mailerが作成されているので、その中にsend_signup_email.html.erbというファイルをHTML用に、send_signup_email.text.erbをテキスト用にそれぞれ作成します。ここで作成するテンプレートファイル名はapp/mailers/user_notifier_mailer.rb内で定義したアクション名と同じにして対応付けます。

app/views/user_notifier_mailer/send_signup_email.html.erb
<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1>Welcome <%= @user.name %></h1>
    <p>ご登録ありがとうございます。</p>
  </body>
</html>

以下はテキスト表示用です。

app/views/user_notifier_mailer/send_signup_email.text.erb
Welcome <%= @user.name %>
ご登録ありがとうございます。

send_signup_emailが実行されると上記のテンプレートファイルのメールが送信されます。HTML用とテキスト用の表示分けについてはメールを受信するメーラーによって自動でわけられます。

なお、HTML用のメールの見た目を確認したい場合は、冒頭でのジェネレータによって作成されたtest/mailers/previews/user_notifier_mailer_preview.rbの中身にプレビュー用のURLがあるのでこれにブラウザからアクセスして確認できます。具体的には、test/mailers/previews/user_notifier_mailer_preview.rbは以下のようになっており、

test/mailers/previews/user_notifier_mailer_preview.rb
# Preview all emails at http://localhost:3000/rails/mailers/user_notifier_mailer
class UserNotifierMailerPreview < ActionMailer::Preview

end

Railsサーバが起動している状態でhttp://localhost:3000/rails/mailers/user_notifier_mailerにブラウザからアクセスするとプレビュー表示を確認できます。 テストにRSpecを使用している場合は、spec/mailers/previews/user_notifier_mailer_preview.rbとなっていると思いますので各自読み替えてください。

コントローラにメール送信用のアクションを追記する

冒頭に記載したように、ここではemailnameをフィールド?としてもつUserモデルを前提としています。そしてUserモデルに対応するコントローラは、Railsのお作法に従うとapp/controllers/users_controller.rbとなります。app/controllers/users_controller.rbの中のサインアップ時の処理(create)にメール送信処理を追記します。

app/controllers/users_controller.rb
class UsersController < ApplicationController
 # (...省略...)
def create
      @user = User.new(user_params)
  
      if @user.save
        # メール送信処理
        UserNotifierMailer.send_signup_email(@user).deliver
        redirect_to(@user, :notice => '新規登録が完了しました。')
      else
        render :action => 'new'
      end
    end
 # (...省略...)
end

最後に、Send Grid経由でメール送信を行うための設定を記述します。

Send Grid経由でメール送信するための設定を記述する

以下の内容をconfig/initializers/mailer.rbというファイルを新しく作成して保存します。

config/initializers/mailer.rb
ActionMailer::Base.smtp_settings = {
  :user_name => 'your_username@kke.com', # Send Gridから送られてきているユーザ名
  :password => 'your_password', # ユーザ名に対応するパスワード
  :domain => 'yourdomain.com', # Send Grid登録時に設定した各自のドメイン名
  :address => 'smtp.sendgrid.net',
  :port => 587,
  :authentication => :plain,
  :enable_starttls_auto => true
}

なお、上記の内容をconfig/environment.rbなどに追記してもOKです。各自わかりやすいところに記述してください。

まとめ

Action Mailerを使うことでとても簡単にメール送信処理を実装できます。Send Gridもアカウントを作成すれば特別な設定必要なく使用できるのでとても便利です。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。