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
の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つのメーラーが作成されます。
- application mailer
- sample_mailer
「application mailer」は全体のメーラーの設定、
「sample_mailer」は先ほど作成したSampleMailerという個別のメーラーの設定です。

ぼくは最初この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」というメソッドを呼び出しましたね??
こいつを呼ぶと、メール本文のテンプレートが呼び出されるようになってます。
メールの本文は、どちらの場合も対応できるように、
- HTMLバージョン
- テキストバージョン
の2タイプ用意してあげましょう。
メール本文のテンプレートは、
app/view/sample_mailer
の中に格納していきます。
まだファイルがない状態なので、この中に新規ファイルを作成してぶち込んでいけばいいのですね。

先ほど個別メーラーで定義した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アプリのメール送信機能の実装方法でした。
早速、テストサーバーを立ち上げて検証してみましょう。

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

メールきたああああああああああ!!!
もし、メールが届かないという方は、もしかしたらセキュリティが固すぎるのかもしれません。
ブロックされたログインについてご確認ください
というメールが来てませんか??

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

おそらく、ブロガー。
今年でフリーランス 6年目。