vdeep

*

vdeepはプログラミング、IT、Web技術、ライフハックの事などなどを管理人okutaniがつぶやくブログです。月間13万PV〜。

【Rails】ActionMailerを使ってメール送信をおこなう方法

   

LINEで送る
Pocket


こんにちは、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」を導入します。

公式MailCatcher

ちなみに、Gemfile(bundler)で導入すると他のgemと競合する可能性があるので、gem installコマンドで直接導入します。

$ gem install mailcatcher

MailCatcherを立ち上げます。

$ mailcatcher

これで、SMTPでlocalhost:1025宛にメールを送信すると、MailCatcherがメールをキャッチしてくれます。

メールの確認はWebブラウザから「http://localhost:1080」にアクセスすればOKです。とても便利ですね。

ちなみに、MailCatcherは独立しているのでRails以外からも利用できます(参考LaravelでMailCatcherを利用してテストメールを送信する | vdeep)。ぜひ参考にしてみてください。

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でメール送信機能を実装したい方の参考になれば幸いです。

この記事が気に入ったら
いいね ! しよう

Twitter で
LINEで送る
Pocket

okutani (@okutani_t) のヒトコト
Railsを使うとかんたんにメール送信ができて便利ですねー。rakeやrails runnerと組み合わせて自動メール送信機能なんかが実装できるともっと便利ですね

 - プログラミング

スポンサーリンク

PC用AdSense

PC用AdSense

  こちらもどうぞ

vdeepのトップページへ戻る画像です。風船の形をした島を女の子が掴んでいます。