【Rails】ActionMailerを使ってメール送信をおこなう方法
こんにちは、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は独立しているので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でメール送信機能を実装したい方の参考になれば幸いです。
Web開発のお仕事を募集しています
フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。
「Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。
ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。
LINKお問い合わせ
スポンサーリンク