【Rails】ActionMailerを使ってメール送信をおこなう方法
2017/8/23
2025/7/31
こんにちは、okutani(@okutani_t)です。本記事ではRuby on Railsでデフォルトで利用できる「ActionMailer」を使って、メール送信を実装する方法について解説しています。
ActionMailerを使うとメイラークラス・ビューを使ってメール送信ができるため、管理しやすいメール配信システムをとてもかんたんに実装することができます。
本記事では、Ruby 2.4.1、Ruby on Rails 5.1.2、MacOS(Sierra)をそれぞれ利用しています。
それでは、実際にActionMailerを使ってメール送信機能を実装してみましょう。
メーラークラスの生成
まずはじめに、メーラークラスを作成します。以下のコマンドを実行。
$ rails g mailer NotificationMailer send_message
Running via Spring preloader in process 19401
      create  app/mailers/notification_mailer.rb
      invoke  erb
      create    app/views/notification_mailer
      create    app/views/notification_mailer/send_message.text.erb
      create    app/views/notification_mailer/send_message.html.erb
      invoke  test_unit
      create    test/mailers/notification_mailer_test.rb
      create    test/mailers/previews/notification_mailer_preview.rb
今回は「NotificationMailer」という名前で生成しましたが、お好みの名前をつけてください。送信用のメソッド/テンプレートは「send_message」としましたが、こちらもお好みでどうぞ。
テンプレートエンジンにSlimやHamlを利用していると、それぞれの専用のviewが作成されます。SlimやHamlを利用している方は適宜読みかえて進めてください。
次にActionMailerを利用するための初期設定をおこなっていきましょう。
ActionMailerの初期設定
開発用にActionMailerの設定をおこないます。「config/environments/development.rb」 に以下を追記。
Rails.application.configure do
  ...省略...
  config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = { address: 'localhost', port: 1025 }
  config.action_mailer.raise_delivery_errors = true
end
上記では、SMTPサーバーに「MailCatcher」というgemライブラリでメールを受け取れるように、SMTPサーバーのポート番号1025で受け付けられるようにしています(導入方法は後述)。
開発用途にgmailを使ってメール送信したい場合は以下のようになります。利用する際に二段階認証の設定をおこなう必要があります(こちらは説明省略)。
Rails.application.configure do
  ...省略...
  config.action_mailer.default_url_options = {  host: 'localhost', port: 3000 }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.smtp_settings = {
    :address => "smtp.gmail.com",
    :port => 587,
    :user_name => ここにgmailのユーザーネーム,
    :password => ここにgmailのパスワード,
    :authentication => :plain,
    :enable_starttls_auto => true
  }
end
なお、今回はMailCatcherを利用して話を進めていきます。
メーラークラスの実装
それでは、先ほど作成したメーラークラス「app/mailers/notification_mailer.rb」を実装していきましょう。
今回はシンプルに以下のような実装にしてみました。
class NotificationMailer < ApplicationMailer
  def send_message(name)
    @name = name
    @greeting = 'Hi'
    mail to: 'to_okutani@example.com', subject: 'ActionMailerのテスト送信'
  end
end
親クラスであるApplicationMailer「app/mailers/application_mailer.rb」を以下のとおり変更します。
class ApplicationMailer < ActionMailer::Base
  default from: 'from_okutani@example.com'
  layout 'mailer'
end
こうすることで、Fromのアドレスを継承したすべてのクラスで利用できます。
次にviewの実装をおこなっていきます。
viewの実装
「app/view/notification_mailer/send_message.html.erb」もしくは「app/view/notification_mailer/send_message.text.erb」を実装していきます。
HTMLメールを送信したい場合は「send_message.html.erb」、TEXTメールを送信したい場合は「send_message.text.erb」を編集していけばOKですね。
今回は「send_message.text.erb」を以下のように編集してみました。
これはメール送信のテストです。
<%= @greeting %>, <%= @name %>!
ちなみに、相手にHTMLメールが送れる場合は.html.erbを、送れない場合は.text.erbをRails側で勝手に判断して送ってくれます。便利ですね。「マルチパートメール」という仕組みらしいです。詳しく知りたい方はぐぐってみてください。
それでは、開発環境用にメール送信のテストをおこなうため「MailCatcher」を導入しましょう。
MailCatcherの導入
開発環境でメール送信のテストをかんたんにおこなえる「MailCatcher」を導入します。
ちなみに、Gemfile(bundler)で導入すると他のgemと競合する可能性があるので、gem installコマンドで直接導入します。
$ gem install mailcatcher
MailCatcherを立ち上げます。
$ mailcatcher
これで、SMTPでlocalhost:1025宛にメールを送信すると、MailCatcherがメールをキャッチしてくれます。
メールの確認はWebブラウザから「http://localhost:1080」にアクセスすればOKです。とても便利ですね。
MailCatcherの他にも「letter_opener」というgemもあります。興味がある人は調べてみてください。
送信確認
それでは、メールの送信確認をおこなってみましょう。以下のようにターミナルから送信できます。
$ rails console
> NotificationMailer.send_message('okutani').deliver_now
引数に値を渡しているところに注目してください。こうすることで、NotificationMailerのsend_messageへ引数の値が渡せます。
MailCatcherを利用している場合、ブラウザから「http://localhost:1080」を開くことでメールを確認することができます。
ActionMailerを使って無事にメール送信できていることが確認できました!これでActionMailerを使ってお手軽にメール送信ができますね。
MailCatcherを停止させたい場合は、ブラウザ右上の「Quit」をクリックすればOKです。
まとめ
ActionMailerを利用することでかんたんにメール送信機能を実装することができました。
HTMLメールもかんたんに作成できて便利ですね。
Ruby on Railsでメール送信機能を実装したい方の参考になれば幸いです。