6月枠も残りわずか】当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のDMM WEBCAMP(旧WEBCAMP PRO)。
5月受入枠は満員となっております。6月枠に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい

上記にあてはまる方は、ぜひご検討ください!

はじめに

RailsアプリケーションはWebアプリケーションですので、ユーザーにメールで通知するのが一般的です。

また、問い合わせはフォームに入力させるものが多いですが、業務フローを考慮すると、その内容がメールで通知される方が、仕事として効率は良いでしょう。

Action Mailerを使えば、そんなメーラー機能を、ゼロから簡単に実装できるのです。

今回は、そんなAction Mailer機能について、具体的なプログラムコードを作成しながら、詳しく説明していきます。

なお、メール受信については、別のアプリケーションへ転送した上で、それを取得する必要があるため、少し複雑になります。そのため、(用途が限られることもあり、)本記事では割愛します。

Action Mailerでメーラーを搭載できる!

前述の通り、Action Mailerは、Railsアプリケーション上にメーラーを実装することができる機能です。

つまり、RailsアプリケーションであるWebの画面からメールを送信(受信)できる、Webメーラーを搭載できると言っても良いでしょう。

もちろん、本格的なメールの機能はメーラーソフトや、Gmail、Yahooメールのような本格的なWebメーラー同等のものを作ることは、現実的ではありません。

しかし、単に送信と受信を行うだけであれば、Action Mailerを使って、比較的簡単に搭載することができるのです。

“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー

Action Mailerで、メールを送ってみよう

では、早速、具体的にプログラムを作りながら、説明していきましょう。

ここからは、基本的に、コマンドやソースコードなどを提示して、その補足説明をするという形で進めていきます。

環境構築

rails new mail_test
cd mail_test
rails generate scaffold User name:string email:string
rake db:migrate

コマンドプロンプトにて、上記のコマンドを実行してください。

ここでは、Userモデルを生成しています。

rails s

上記コマンドでサーバーを起動し、ブラウザで「localhost:3000/users」へアクセスしてください。
以下の画面が表示されれば、環境構築成功です。

メーラーを生成する

まずは、メール機能であるメーラーを生成しましょう。

メーラーの生成は、モデルやコントローラと同じように、generateコマンドを使えば、必要なファイルやディレクトリを自動的に生成してくれます。

> rails generate mailer NotificationMailer
      create  app/mailers/notification_mailer.rb
      invoke  erb
      create    app/views/notification_mailer
      invoke  test_unit
      create    test/mailers/notification_mailer_test.rb
      create    test/mailers/previews/notification_mailer_preview.rb

全部で4つ生成されているログ(create)が出力されていますが、テスト環境のファイルも生成されていますので、実態としては、以下の2つが必要なものです。

ファイル・ディレクトリ 説明
app/mailers/notification_mailer.rb メーラークラスの実装ファイル。メールごとにメソッドを生成する
app/views/notification_mailer メールのレイアウトを指定するViewが格納されるディレクトリ

メーラーのファイル構成や用途は、コントローラとViewによく似ており、メーラークラスのメソッドごとに、メソッド名に沿ったViewファイルを作成することで、メールのレイアウトを指定することができます。(Viewファイルについて、後述します)

メールの各種設定

Action MailerでRailsアプリケーションにメール機能を追加できますが、メールサーバーそのものが搭載できるわけではありません。

Action Mailerは、メールを生成し、メールサーバーへ送信を指示する「仲介」を行ってくれる機能です。

そのため、使用するメールサーバーに合わせて、設定をしておく必要があります。

なお、この設定は、開発環境ごとの設定ファイル(config/environments/xxxxxxxx.rb)へ、環境ごとの設定を行うことが多いです。しかし、メーラーのパスワードなどの記載もありますので、今回は別ファイルを作成します。

例えばGmailを使う場合は、次のようになるでしょう。
(config/initializers/mail_config.rb)

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  address: 'smtp.gmail.com',
  domain: 'gmail.com',
  port: 587,
  user_name: 'メールアドレス',
  password: 'パスワード',
  authentication: 'plain',
  enable_starttls_auto: true
}

メールアドレスとパスワードは、権限を持っているGmailアカウントのものを設定してください。(このメールアドレスから、メールが送付されます)

ここで設定する項目は、以下のようになっています。

設定 説明
logger 可能であればメール送受信に関する情報を生成する。(nilを指定するとログ出力を行わない)
smtp_settings :smtpの配信メソッドの詳細設定を行います。
:address smtpメールサーバーの指定(デフォルトは"localhost")
:port smtpメールサーバーのポート番号(デフォルトは25番)
:domain ドメイン指定
:user_name メールサーバー認証用のユーザー名
:password メールサーバー認証用のパスワード
:authentication メールサーバーの認証の種類。以下のいずれか
:plain パスワードを平文で送信
:login パスワードをBase64でエンコードする
:cram_md5 チャレンジ/レスポンス+MD5ハッシュ
:enable_starttls_auto SMTPサーバーでSTARTTLSが有効であれば有効にする機能(デフォルトはtrue)
:openssl_verify_mode TLSを利用する場合にOpenSSLが認証をチェックする方法を指定する
sendmail_settings :sendmailの配信オプションを上書きします。
:location sendmailの実行可能ファイルの場所(デフォルトは/usr/sbin/sendmail)
:arguments sendmailに渡すコマンドライン引数(デフォルトは-i)
raise_delivery_errors メール配信に失敗した場合にエラーを発生するかどうか(メールサーバーが即時配信を行っている場合にのみ機能する)
delivery_method 配信方法。config.action_mailer.smtp_settingsで設定可能(デフォルトは:smtp)
:smtp SMTPを使ってメールを送信する
:sendmail sendmailを使ってメールを送信する
:file: メールをファイルとして保存する。
:test メールを配列ActionMailer::Base.deliveriesに保存する。
perform_deliveries メール配信を実際に行うかどうか(デフォルトtrue)
deliveries delivery_method :testを使用してAction Mailerから送信されたメールの配列を保持する場所
default_options mailメソッドオプション (:from、:reply_toなど)のデフォルト値を設定できる

上記のように、特定のメールサーバーの設定を行うことで、そのメールサーバーを通してメールを送付することができます。

ただし、Gmailを利用する場合、Googleのセキュリティ対策のため、Railsアプリケーションからメール送信を行おうとすると、ブロックされるようになっています。(Railsアプリケーションはエラーになりませんが、Gmailのアカウントから警告メールが届きます)

そのため、他のメールアカウントを使用するか、Gmailのセキュリティレベルを下げなければいけません。

Gmailのセキュリティレベルを下げるには、「安全性の低いアプリのアクセス<https://myaccount.google.com/lesssecureapps>」へアクセスして、安全性の低いアプリのアクセスを有効にしてください。

メールの作成処理

メールサーバーの設定が完了したら、次はメールを作成する処理(メーラークラスのメソッド)を作成していきましょう。

上述の通り、メーラークラスは「app/mailers/notification_mailer.rb 」にありますので、そのメソッドを作成していきます。

(app/mailers/notification_mailer.rb)

class NotificationMailer &lt; ApplicationMailer
  default from: 'no-replay@gmail.com'

  def complete_mail(user)
    @user = user
    @url = "http://localhost:3000/users/#{@user.id}"
    mail(subject: "COMPLETE join your address" ,to: @user.email)
  end
end

ここでは、登録完了を知らせるメールを作成するcomplete_mailメソッドを作成しています。

このメソッドのポイントは、mailメソッドです。

今回は、件名(subject)と宛先(to)のみ設定していますが、他にも、本文(message)やCC(cc)も設定することができます。引数に渡すだけですので、とても簡単にメールを作ることができます。

コツコツ独学×スクールで実践。未経験からエンジニアに転職!【WebCamp卒業生インタビュー】

メールのフォーマットをViewで指定する

なお、本文に固定の部分があるのであれば、Viewにレイアウトとして定義する方が良いでしょう。

メーラーのViewについては、コントローラと同じく、メソッド名をもとにしたファイル名のViewファイルを作成することで、反映されます。

ファイル名の規則は、次のようになっています。

「メソッド名.text.erb」もしくは、「メソッド名.html.erb」

メールの送信形式をtext形式にしたければ前者、html形式にしたければ、後者を作成してください。両方あった場合は、メーラーは両方をまとめたメール(マルチパートメール)を送付し、受信する相手の環境に合わせてどちらかが表示されるようにしてくれます。

ここでは、textメールを作ってみましょう。
(app/views/notification_mailer/complete_mail.text.erb)

Dear &lt;%= @user.name %&gt;.

Thank you for registering!

Your page is ...&lt;%= @url %&gt;

とてもシンプルなメールにしています。

メール作成の応用

単純なテキストやHTMLを送るだけではなく、Action Mailerは添付ファイルを付けたり、複数の宛先へメール送信したりすることも可能です。

それぞれ、簡単に説明しておきましょう。

添付ファイルを付けるには

添付ファイルを付けるには、メーラークラスのメソッド内に、以下の一文を追記します。

attachments['ファイル名'] = File.read('ファイルのフルパス')

この1行を追加することで、ファイル名のファイルを添付することが可能です。

例えば、「Gemfile」を「Gemfile.txt」というファイル名で添付するには、以下のようにします。

(app/mailers/notification_mailer.rb)

class NotificationMailer &lt; ApplicationMailer
  default from: 'no-replay@gmail.com'

  def complete_mail(user)
    @user = user
    @url = "http://localhost:3000/users/#{@user.id}"
    attachments['Gemfile.txt'] = File.read('Gemfile')
    mail(subject: "COMPLETE join your address" ,to: @user.email)
  end
end

複数の宛先に送る

ユーザー登録されたことを複数の管理者へ送りたいときなどは、アドレスを複数登録した方が都合が良いでしょう。

Action Mailerでは、簡単に宛先を追加することができます。

mailメソッドに渡す:toキーに、カンマ区切りのメールアドレスか、メールアドレスの配列を渡すことで、複数の宛先を指定することができます。

CCやBCC

mailメソッドに渡すキーとして、「:cc」や「:bcc」を使えば、CCアドレスやBCCアドレスの指定が行えます。

メール送信処理

では、最後にメールの送信処理を実装しましょう。

メールの送信については、今までよりももっと簡単で、メール送信をしたいタイミングに、以下の1行を追加するだけです。

メーラークラス.メソッド.deliver_now

メソッドに引数があれば、次のようになるでしょう。

メーラークラス.メソッド(引数).deliver_now

deliver_nowを使うことで、その瞬間にメール送信処理が実行されます。

deliverは使えない?

いくつかの参考書や解説サイトでは、deliver_nowメソッドではなくdeliverメソッドを使うように記載されています。

じつは、deliver_nowを使ってメール送信すると、メール送信が完了するまでRailsが反応しなくなることがあります。そのため、Rails4.2から「Active Job」という非同期処理が導入されました。「Active Job」を使うと、メール送信を裏で行わせながら処理を行うことができますので、メール送信完了を待つ必要がなくなるのです。

そのため、「すぐに送信する」ということが分かるように、deliverではなく、deliver_nowという名称になっているのです。

なお、Active Jobを使ってメール送信するためには、deliver_laterメソッドを使います。長くなりますので、ここでは詳細は控えます。

(app/controllers/users_controller.rb)

    :
  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        NotificationMailer.complete_mail(@user).deliver_now  # (1)
        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
    :

今回は、登録完了通知ですので、ユーザーを登録したところで、メールを送信するように、コントローラのcreateメソッドに追加します。(上記の(1)の行)

saveメソッドが成功したあとに、メールを送信するようにしています。

これで、メール送信処理の実装完了です。

動作確認

では、試しに、動かしてみましょう。

サーバーを起動後、「localhost:3000/users/new」にアクセスして、登録フォームからユーザー登録を行いましょう。

「Create User」をクリックすると、登録内容の詳細画面になります。

じつは、この時点ですでにメールが送信されています。

宛先に指定したメールアドレスの受信ボックスを確認すれば、以下のようなメールが届いていることを確認できるでしょう。

なお、コマンドプロンプトにもメールの内容がログとして出力されていますので、内容を確認できます。

Sent mail to test@gmail.com (2670.5ms)
Date: Sun, dd mm YYYY HH:MM:DD +0900
From: no-replay@gmail.com
To: test@gmail.com
Message-ID: &lt;XXXXXXXXXXXXX_XXXXXXXXXXXXX@XXXXXX.mail&gt;
Subject: COMPLETE join your address
Mime-Version: 1.0
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

Dear test.

Thank you for registering!

Your page is ...http://localhost:3000/users/6


Redirected to http://localhost:3000/users/6
Completed 302 Found in 3139ms (ActiveRecord: 29.9ms)

ただし、これはtextメールにしたため、確認できるようになっているだけです。そのため、HTMLメールや添付ありメールなどは、コマンドプロンプトではない方法で確認する必要があります。

未経験から上京し、エンジニアとしてチームラボグループに転職!【WebCampPro卒業生インタビュー】

メール送信処理を作成する場合の注意点

ここまでで、Action Mailerを使ったメール送(受)信機能の説明しました。確認しながらですので、時間がかかかったかと思いますが、改めて見直すと、驚くほど簡単にメール機能を搭載できると思います。

ただし、メールは、外部へ情報を送信するリスクがありますので、簡単だからこそ気を付けなければいけません。

そんな、メール機能を実装するにあたって注意する点を紹介しておきます。

アドレスミスは致命的

開発中のテストメールだとしても、間違ったアドレスへ送付してしまうのは、もっとも致命的な事故と言えるでしょう。

会社のサーバーを利用していた場合などは、会社の信用にも関わることになりかねませんし、迷惑メールやウイルスの標的になることもあります。

必ず、送信先のアドレスを確認してから、テストをしなければいけません。

送信先に了承を得る

送信先に間違いがなくても、送信先の人がテストメールが来ることをしらなければ、当然ながらクレームのもとになります。

特に、メーリングリストなどを送信先に設定してしまうと、影響範囲がとても大きくなります。

必ず、送信先にテストメールが届くことを伝え、了承してもらってからテストするようにしましょう。

送信する数にも注意

送信先に問題ないとしても、もしそこに数千件のメールが届いてしまったら、どうなるでしょうか?

送信先がそれを了承していたとしても、メールサーバー管理者からすれば、明らかに不正なメールですので、送信元のメールアカウントが凍結されても仕方ありません。

なにより、メールサーバーへの負荷は相当なものですので、メールサーバーの動作に問題が起こって、他の利用者に迷惑がかかる可能性もあります。

安易に大量のメールを送付しないようにしてください。

開発環境でメールが送付されないようにする

ここまで説明したメール機能の開発時の注意を考慮すると、そもそも開発環境で送信するメールを最低限にすれば良いでしょう。

そんな開発中の問題に対応するため、メールを送信する代わりに、ブラウザ上にメールの内容を表示してくれるgem「letter_opener」があります。

導入方法を紹介します。

(Gemfile)

    :
group :development do
    :
  gem 'letter_opener'
end
    :
bundle install

(config/initializers/mail_config.rb)

if Rails.env.production?
  # 本番環境
    :
  (もともとあった設定処理)
    :
elsif Rails.env.development?
  # 開発環境
  ActionMailer::Base.delivery_method = :letter_opener
else
  # テスト環境
  ActionMailer::Base.delivery_method = :test
end

まとめ

今回は、Action Mailerの説明を行いました。

Active Mailerを使えば、Railsアプリケーションにメール機能を簡単に追加することができます。

ただし、注意点にも挙げたように、メールは外部へ情報が流出するリスクを含んだ機能です。

開発中のアプリケーションでは、ガードすることができない場合もありますので、テストなどは慎重に行うようにしなければいけません。

もちろん、あまり慎重にしすぎても効率が悪くなりますので、「どこまでやるべきか」のさじ加減が重要です。そのあたりのさじ加減が分かるようになれば、中級プログラマーと呼べるのかもしれません。

・Action Mailerを使えば、Railsアプリケーションからメール送信できる
・generateコマンドで、メーラーを生成できる
・メーラーはコントローラのようなView(メールのレイアウトファイル)を持つことができる
・Action Mailer自身がメールを送信するのではなく、既存のメールサーバーを通してメールを送信する
・メール送信機能については、情報漏洩などのセキュリティリスクを理解した上で行うこと

DMM WEWBCAMPについて

DMM WEBCAMPは3ヶ月間で未経験から即戦力エンジニアを育成する転職保障付きのプログラミングスクールです。1ヶ月でプログラミング・Webデザインを学ぶ通い放題の「ビジネス教養コース」も展開しています。

DMM WEBCAMPを運営する株式会社インフラトップ では、「学びと仕事を通して人生を最高の物語にする」という理念で会社を経営しています。

キャリアアップを目指す方は、この機会に私達と一緒にプログラミングを学んでみませんか?

6月枠も残りわずか】当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のDMM WEBCAMP(旧WEBCAMP PRO)。
5月受入枠は満員となっております。6月枠に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい

上記にあてはまる方は、ぜひご検討ください!


▼未経験から1ヶ月でWEBデザイン・プログラミングを学びたい方はこちら!

 

【インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

ブラジルから帰国し技術をつけようとRubyエンジニアを目指してWebCampでRubyを学び、見事Webエンジニアとして転職を果たした田中さんにお話を伺いました。

Rubyの学習がしたい。基礎をしっかりと理解したい

転職のサポートがほしい

と考えている方はぜひお読み下さい。

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

おすすめの記事