読者です 読者をやめる 読者になる 読者になる

Rails Webook

自社のECを開発している会社で働いています。Rails情報やサービスを成長させる方法を書いていきます

RailsのAction Mailerでメール送信

Rails入門 Rails Mail

RailsのデフォルトのgemのAction Mailerを使いメールの送信や受信を行うことができます。
この記事では、ステップバイステップでRailsアプリケーションでメールの送信ができるようにしていきます。
f:id:nipe880324:20140828225307p:plain:w480


目次

  1. Railsプロジェクトの作成
  2. メーラーの作成(メール送信)
  3. SMTPサーバの設定(Gmailで設定)

動作確認

  • Rails 4.1


Railsプロジェクトの作成

まず、いつも通りRailsプロジェクトを作成します。

$ rails new mail_basis

次に、記事(Post)のソース一式をScaffoleを使って作成します。

$ cd mail_basis
$ rails g scaffold Post title:string content:text

DBマイグレートをします。

$ rake db:migrate

これで、記事(Post)の一覧表示、作成、更新、削除ができました。
$ rails serverでローカルのサーバを起動していくつかデータを入力してみました。
f:id:nipe880324:20140828225333p:plain:w480


メーラーの作成(メール送信)

それでは、この記事(Post)を作成したときにメールを送信するようにしてみましょう。

メーラーをジェネレーターで作成

$ rails g mailer PostMailer
      create  app/mailers/post_mailer.rb
      invoke  erb
      create    app/views/post_mailer
      invoke  test_unit
      create    test/mailers/post_mailer_test.rb
      create    test/mailers/previews/post_mailer_preview.rb

メーラーは、コントローラーと似ていて、

  • メール処理を記述するxxx_mailer.rbapp/mailers/配下に配置
  • メールの表示を記述するファイルをapp/views/post_mailer/配下に配置

というように、なっています。

ジェネレーターで作成されたapp/mailers/post_mailer.rbを確認してみましょう。

class PostMailer < ActionMailer::Base
  default from: "from@example.com"
end

コントローラーやモデルと同様に、全てのメーラーのクラスは、ActionMailer::Baseを継承する必要があります。
このファイルにアクションを記載すると、そのアクション名に対応するメーラービュー(app/views/xxx_mailer/配下のファイル)が表示されます。

メール送信メソッドを実装

では、早速、「投稿(Post)を作成したときにメールを送信するpost_emailメソッド」を実装してみます。

class PostMailer < ActionMailer::Base
  default from: "from@example.com"

  def post_email(user, post)
    @title = post.title
    mail to: user.email, subject: "記事を投稿しました"
  end
end
  • defaultメソッドは、オプションで指定した値をこのクラス内すべてに適用します。今回の例では、メールのFromヘッダーを全て "from@example.com" に設定しました。もちろん、各アクションで変更することが可能です。
  • mailメソッドは、実際のメールを送信するメソッドです。今回は、メールのToとSubjectヘッダーを設定してメールを送信しました。

これらのオプションには基本的なメールのヘッダーである、subject, to, from, cc, bcc, reply_to, dateが使えます。

また、インスタンス変数(@xxx)でメーラービューに値を渡すことができます。

メーラービューの作成

では、HTML形式とテキスト形式の2種類のメーラービューを作成します。
HTML形式が良いユーザーやテキスト形式が良いユーザーの2パターンのユーザーがいるため両方とも作成するのが良いとされています。

まずは、HTML形式のメーラービューを作成します。
app/views/post_mailer/post_email.html.erbを作成して下さい。
基本的にはHTMLで記述します。ERB形式なので、Rubyのコードを記述することもできます。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
  </head>
  <body>
    <h1>新しい記事「<%= @title %> 」を投稿しました。</h1>
    <p>
      投稿しました。<br />
    </p>
  </body>
</html>

次に、テキスト形式のメーラービューを作成します。
app/views/post_mailer/post_email.text.erbを作成して下さい。

===========================================
  新しい記事「<%= @title %> 」を投稿しました。
===========================================

  投稿しました。

メーラーを呼び出す

では、投稿(Post)を作成したときに今作成したメーラーを呼び出すようにしてみます。

# app/controllers/post_controller.rb

class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit, :update, :destroy]

  .....

	# Userクラスを作成していないので、擬似的なUser構造体を作る
	User = Struct.new(:name, :email)


  # POST /posts
  # POST /posts.json
  def create
    @post = Post.new(post_params)

    respond_to do |format|
      if @post.save
        # 擬似的なUser構造体を作成する
      	user = User.new("name", "<送信したいメールアドレス>")

      	# deliverメソッドを使って、メールを送信する
      	PostMailer.post_email(user, @post).deliver

        format.html { redirect_to @post, notice: 'Post was successfully created.' }
        format.json { render :show, status: :created, location: @post }
      else
        format.html { render :new }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end

  .....

end


SMTPサーバの設定(Gmailで設定)

ここまでで一通りのメーラーを作成することができました。
しかし、メールを送信するにはSMTPサーバが必要ですのでそのための設定が必要です。
今回は、SMTPサーバを構築したくないので、SMTPサーバにGmailを利用し、その設定を記載します。

config/environments/development.rbに以下の設定を追加して下さい。

...
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
	address:               'smtp.gmail.com',
	port:      	           587,
	domain:                'example.com',
	user_name:             '<Gmailのユーザ名>',
	password:              '<Gmailのパスワード>',
	authentication:        'plain',
	enable_starttls_auto:  true
}
...

Gmailのユーザ名やパスワードを設定ファイルに記載し、それをGitHubなどで公開するとバレてしまいますので、「Railsで定数設定ファイルをgitから外して管理する」を参照して、公開しないようにしましょう。また、万が一の場合もありますので、サービスとして展開していく場合は別のGmailアカウントを作ることをおすすめします。

では、$ rails serverでサーバを再起動しなおし、記事を登録してみます。
f:id:nipe880324:20140828230057p:plain:w480
f:id:nipe880324:20140828230059p:plain:w480

記事が登録されたので、メールが届いているか確認しましょう。
実際に届いていますね。
f:id:nipe880324:20140828230335p:plain:w480

Gmailのセキュリティ上、届かない可能性があります。何かしらのメールを受信しているはずなので、その内容を確認して適切な対処をしてください。

実際に記事を登録すると分かりますが、メール送信が裏で走っているため画面の画面の表示が遅いです。大抵、バックグラウンドジョブにメール送信は任せ、メールが送信完了前に画面遷移をするのが一般的です。