【初心者向け】Ruby on Railsアプリでメール送信機能を実装する方法




Ruby on Railsアプリでメールを自動的に送信する機能をつけたい!

どうも、Linです。開店と同時に入店してます。

 

Ruby on Railsアプリを作ると、つけたい機能としてありがちなのが、

メールの自動送信機能

ではないでしょうか??

 

たとえば、ユーザーが投稿した時にメールで通知が来るように設定したり、情報を更新したときに確認メールが送信されるといった具合ですね。

メール送信機能の実装は、すこぶる難易度が高かったですが、こちらの神記事を参考にさせてもらい、なんとかメール送信機能をつけることに成功しました。

今日はその方法を忘れないうちに書き留めておこうと思います。

 

 

Railsアプリでメール送信機能を実装する方法6つのステップ

Railsアプリにメール送信機能を実装していきましょう。

Railsのバージョンは残念ながら4ですので、そこらへんはご了承ください。

 

 

Step1. Railsアプリ作成

今回は例としてmailerというアプリを作っていきます。

$ rails new mailer

 

ディレクトリを移動。

$ cd mailer

 

今回は、ユーザーが新規追加されたらメールを送るアプリを作りたいので、ユーザーテーブルを作成しておきましょう。

$ rails g scaffold User name email

ユーザーテーブルには、

  • name
  • email

の2つのカラムがあれば十分です。

マイグレーションファイルを作成できたら、

$ rake db:migrate

でデータベースを作成しましょう。

 

これで準備完了です。

 

 

Step2. メール送信設定

続いてはメールの送信設定。

今回はGmailで送れるようにします。

 

メールの送信設定は、

config/environment/development.rb

のファイルを編集していきます。

 

Rails.application.configure do
  #--- 中略 ---#
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    port:                 587,
    address:              'smtp.gmail.com',
    domain:               'smtp.gmail.com',
    user_name:            '<YOUR EMAIL ADDRESS>',
    password:             '<YOUR EMAIL PASSWORD>',
    authentication:       'login',
    enable_starttls_auto: true
  }
end

 

ここでは、「メール送り主」に設定したいGmailの情報を設定していきます。

具体的には、

  • ユーザー名(メールアドレス)
  • パスワード

の2つを設定します。

Githubなどでコードを公開する場合は、自分のGmailアカウントがバレてしまうので要注意。

 

Step3. メーラー作成

お次は、「メーラー」を作成していきます。

メーラーとは、

メール送信におけるコントローラー的役割を果たす

ものです。

こいつをrailsのコマンドで作っていきましょう。

メーラーの名前はSampleMailerとします。

 

$ rails g mailer SampleMailer

 

このコマンドを実行すると、app/mailer以下に次の2つのメーラーが作成されます。

  1. application mailer
  2. sample_mailer

「application mailer」は全体のメーラーの設定、

「sample_mailer」は先ほど作成したSampleMailerという個別のメーラーの設定です。

 

rails メール 設定

 

ぼくは最初この2つをごちゃまぜにしてゾンビになっていました。要注意です。

 

 

Step3. 全体のメーラー編集(application_mailer.rb)

いよいよメーラーの編集。

メーラー全体の設定の「application_mailer.rb」を編集していきます。

 

いじる前は次のようなコードになっていますよね??

class ApplicationMailer < ActionMailer::Base
  default from: "from@example.com"
  layout 'mailer'
end

こいつを、

class ApplicationMailer < ActionMailer::Base
  default from:     "謎の男",
          bcc:      "sent@gmail.com",
          reply_to: "reply@gmail.com"
  layout 'mailer'
end

のように編集します。

 

これは送信するメールの情報を表しています。

from メールの送り主の名前
bcc BCCで同時に送る宛先
reply_to 返信した場合の受信先アドレス

を表しています。

 

上の例でいうと、「謎の男」からメールが送られてきます。

また、BCCでsent@gmail.comにも送られて、もし、ユーザーがこのメールに返信した場合は、reply@gmail.comに届くというわけです。

 

 

Step4. 個別のメーラー編集(sample_mailer.rb)

個別のメール設定のメーラー(sample_mailer.rb)を編集していきましょう。

デフォルトでは、

class SampleMailer < ApplicationMailer
end

のようになってるはず。

 

今回はこちらを、

class SampleMailer < ApplicationMailer
  def send_when_create(user)
    @user = user
    mail to:      user.email,
         subject: 'こんにちは!新しいユーザーが追加されました'
  end
end

のように編集していきます。

 

userを引数にしたsend_when_createメソッドを定義。

新しいユーザーが作成されたら、メールが送られるようになってます。

userの情報からemailをいただき、その宛先に、

こんにちは!新しいユーザーが追加されました

という件名のメールが届くように設定されてますね。

 

Step5. メール本文編集

あとはメールの本文を決めるだけ。

 

先ほどの個別のメーラーの中で、「mail」というメソッドを呼び出しましたね??

こいつを呼ぶと、メール本文のテンプレートが呼び出されるようになってます。

 

メールの本文は、どちらの場合も対応できるように、

  1. HTMLバージョン
  2. テキストバージョン

の2タイプ用意してあげましょう。

 

メール本文のテンプレートは、

app/view/sample_mailer

の中に格納していきます。

まだファイルがない状態なので、この中に新規ファイルを作成してぶち込んでいけばいいのですね。

 

rails メール 送信

 

先ほど個別メーラーで定義したsend_when_createのメソッド名から、

  • send_when_create.html.erb
  • send_when_create.txt.erb

の2種類作ってみましょう。

 

テンプレートたちと、メーラーの関係は、viewとcontrollerと一緒。

メーラーで宣言したインスタント変数をテンプレートでも使えるのです。

 

HTMLメールのテンプレート(send_when_create.html.erb)は、

<!doctype html>
<html lang="ja">
<head>
  <meta content="text/html; charset=UTF-8" />
</head>
<body>
  <h2><%= @user.name %> 様</h2>
  <hr />
  <p>
    こんにちは! <%= @user.name %>さん!</p>
  <hr />
</body>
</html>

テキストバージョン(send_when_create.txt.erb)は、

===============================
<%= @user.name %>様
===============================

こんにちは! <%= @user.name %>さん

とでもしておきましょうか。

 

 

Step6. メーラーを呼び出す

最後にメーラーを呼び出しましょう。

メーラーはコントローラーで呼び出します。

 

今回は、ユーザーを新規作成した時にメールを送るアプリを作りたいので、「users_controller.rb」の「createメソッド」に注目。

 

def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

 

メーラーは、

メーラー名.メソッド

で呼び出すことができます。

さらに、そこにdeliverメソッドをつかえばメールを送れるとのこと。

早速やってみましょう。

 

今回は、

  • メーラー名:SampleMailer
  • メソッド名:update_when_create

だったので、

Sample.update_when_create.deliver

という一行のコードをメールを送りたいタイミングに追加すればオッケー。

 

update_when_createの引数として、新規作成したuserオブジェクトを利用したいので、

Sample.update_when_create(@user).deliver

としてあげましょう。

この一行のコードをcreateメソッドの中に追加。

 

def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
    SampleMailer.send_when_create(@user).deliver
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

 

 

 Railsアプリでメール送信機能は意外と簡単だ!

と以上がRailsアプリのメール送信機能の実装方法でした。

 

早速、テストサーバーを立ち上げて検証してみましょう。

 

rails メール 送信

 

 

Linという名前のユーザーを新規追加してみると、

rails メール 送信

メールきたああああああああああ!!!

 

もし、メールが届かないという方は、もしかしたらセキュリティが固すぎるのかもしれません。

ブロックされたログインについてご確認ください

というメールが来てませんか??

 

rails メール 送信

 

安全性の低いアプリからのアクセスを許可すると、無事にメールを送れると思います笑

 

 

それでは!

Lin




音生入力で楽にブログを書く技が満載!
ブログ音声入力術

音声入力の使い方から文章を書くコツまで完全網羅。ブログを書きたいすべての人向けの電子書籍