こんにちは!システムエンジニアのオオイシです。
Action Mailerをご存知でしょうか?
Action MailerはRuby on Railsからメールを送信するために利用します。
今回は、
- Action Mailerとは
- Action Mailerの作成方法
- メールをプレビューで確認しよう
- メールを送信してみよう
といった、基本的な解説から
- HTMLメールの送信方法
- 添付ファイルの付きのメールの送信方法
などの応用的な使い方関しても解説していきます。
今回はそんなAction Mailerの使い方をわかりやすく解説します!
Action Mailerとは
Action Mailerは、Ruby on Rails に標準で組み込まれているメールの送信機能です。
例えば、
- メールフォームの入力内容を業務担当者に自動送信
- メールマガジンを一括メール送信
- システム障害を検知してシステム担当者メール通知
など、色々な場面で活用することができます。
そんな、Action Mailerの使い方は実はとってもカンタンです。
次項で詳しく説明していきます!
Action Mailerの作成方法
今回は、ユーザーの問い合わせをシステム管理者にメール通知するプログラムを作成しながら、Action Mailerの使い方を説明します。
まずはじめに、問い合わせ内容を保存するInquiryモデルを作成します。
Inquiryモデルは氏名(name)、メッセージ(message)の属性を持ちます。
モデルの作成は次のコマンドを実行してください。
bin/rails g model inquiry name:string message:string ~~ 省略 ~~ rails db:migrate
なお、Ruby on Rails のインストール方法については、こちらで詳しく説明していますので、ぜひ参考にしてください。
Action Mailerを生成する
メール送信するために必要なApplicationMailerを継承するクラスは、generateコマンドから作成することが可能です。
- bin/rails generate mailer 任意のメイラー名
今回のサンプルプログラムは、inquiryメイラーをgenerateコマンドで自動作成します。
bin/rails generate mailer inquiry
実行結果:
Running via Spring preloader in process 616 create app/mailers/inquiry_mailer.rb invoke erb create app/views/inquiry_mailer invoke test_unit create test/mailers/inquiry_mailer_test.rb create test/mailers/previews/inquiry_mailer_preview.rb
作成されたファイルのうち「app/mailers/inquiry_mailer.rb」は、メール送信機能を実装するための空のクラスとなります。
class InquiryMailer < ApplicationMailer end
次項から、メールの送信機能を実装するためにInquiryMailerクラスへコーディングしていきましょう!
メールの宛先や件名を指定する
InquiryMailerクラスへsend_mailという名前のメソッドを追加して、システム管理者にメール送信できるようにしてみましょう。
app/mailers/inquiry_mailer.rb:
def send_mail(inquiry) @inquiry = inquiry mail( from: 'system@example.com', to: 'manager@example.com', subject: 'お問い合わせ通知' ) end
mailメソッドで利用可能なオプションは次のとおりです。
オプション | 説明 |
---|---|
from | 送信元メールアドレス |
subject | メールの件名 |
to | メールの送信先アドレス 複数の宛先には”,”(カンマ)区切りまたは配列を指定 |
cc | CC(カーボンコピー)のメールアドレス 複数の宛先には”,”(カンマ)区切りまたは配列を指定 |
bcc | BCC(ブラインドカーボンコピー)のメールアドレス 複数の宛先には”,”(カンマ)区切りまたは配列を指定 |
このように、mailメソッドでは通常のメールと同じようにto(メールの送信先アドレス)などを指定可能です。
次は、メール本文のレイアウトを作成していきます。
メール本文のレイアウト
メール本文のレイアウトを作成するためは命名規則にしたがってerbファイルを作成します。
- app/views/メイラー名_mailer/メイラークラスのメソッド名.text.erb
今回作成するサンプルでは「app/views/inquiry_mailer/send_mail.text.erb」を新規に作成してください。
app/views/inquiry_mailer/send_mail.text.erb:
<%= @inquiry.name %> 様 から問い合わせがありました。 ・お問い合わせ内容 <%= @inquiry.message %>
このように、erbのタグを使ってメール本文のレイアウトを作成することが可能です。
メールを送信するためのコーディングは以上です!
メールをプレビューで確認しよう
実際にメール送信する前に、メール本文のレイアウトを確認したいですよね?
Action Mailerにはメールのプレビュー機能があります。
メールをプレビューするにはActionMailer::Previewクラスを継承したクラスを作成し、メール送信処理を呼び出すプログラムをそこに書きます。
ActionMailer::Previewを継承したクラスは、generateコマンドで生成したInquiryMailerPreviewクラスが存在するので、こちらにコーディングしていきましょう。
次のサンプルコードは、InqueryMailerクラスから問い合わせ内容をメール送信するプログラムです。
test/mailers/previews/inquiry_mailer_preview.rb:
# Preview all emails at http://localhost:3000/rails/mailers/inquiry_mailer class InquiryMailerPreview < ActionMailer::Preview def inquiry inquiry = Inquiry.new(name: "侍 太郎", message: "問い合わせメッセージ") InquiryMailer.send_mail(inquiry) end end
プレビューを確認するには「bin/rails s」でサーバーを起動し、http://ホスト名:3000/rails/mailers/inquiry_mailer にアクセスしてみてください。
次の画面が表示されます。
inquiryのリンクは、InquiryMailerPreviewクラスに作成したinquiryメソッドに対応して表示されています。
そのため、確認したいメールデータ毎にメソッドを定義すれば、いろいろなパターンでプレビューすることも可能です。
inquiryのリンクをクリックしてください。
このように、メールのプレビューが確認することができました!
プレビューでは実際にメールが送信されることはないので何度でも確認することが可能です。
メールを送信してみよう
Gmailで送信するための設定
メールのプレビューが確認できたので、実際にメールを送信してみましょう。なお、Gmailに2段階認証がかかっているなど、セキュリティの状態によっては送信できないことがあります。
メールサーバの設定をするには「config/environments/環境毎に設定.rb」に追記します。
本記事ではGmailでの設定方法について紹介します。
config/environments/development.rb:
config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: 'smtp.gmail.com', port: 587, domain: 'gmail.com', user_name: '<gmailのメールアドレス>', password: '<gmailのパスワード>', authentication: 'plain', enable_starttls_auto: true }
次項では実際にメールを送信してみましょう。
メールの送信
メールを送信するにはdeliver_nowメソッドを実行します。
サンプルプログラムでメール送信するには、
- InquiryMailer.send_mail(モデル変数).deliver_now
を実行します。
メール送信プログラムの実行タイミングは、Ruby on Rails のコントローラーなどから実行できますが、今回はRailsコンソールから実行します。
「app/mailers/inquiry_mailer.rb」のfromやtoを任意のメールアドレスに変更して、次のように実行してください。
注意:間違いメール防止のためにメールの宛先に間違いないかよく確認してください!!
$ bin/rails c ~~ 省略 ~~ irb(main):001:0> inquiry = Inquiry.new(name: "侍 太郎", message: "問い合わせメッセージ") irb(main):002:0> InquiryMailer.send_mail(inquiry).deliver_now
実行後はメールが送信されたことを確認してみてください。
自分宛てにGmailでメール送信した場合は次のように受信できたと思います。
応用的なメール送信方法
HTMLメールの送信方法
Action MailerでHTMLメールを送信するためには、
- app/views/メイラー名_mailer/メイラークラスのメソッド名.html.erb
とファイル名を作成し、メール本文もHTMLで記載します。
サンプルプログラムを確認してみましょう。
app/views/inquiry_mailer/send_mail.html.erb:
<!DOCTYPE html> <html> <head> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /> </head> <body> <h1><%= @inquiry.name %> 様 から問い合わせがありました。</h1> <p>・お問い合わせ内容</p> <p><%= @inquiry.message %></p> </body> </html>
プレビュー機能でどのようなレイアウトになるか確認してみましょう。
このようにHTML形式のメールレイアウトとなりました。
なお、テキストメールとHTMLメールのレイアウトが、
- app/views/メイラー名_mailer/メイラークラスのメソッド名.text.erb
- app/views/メイラー名_mailer/メイラークラスのメソッド名.html.erb
のように2ファイル存在する場合は、Ruby on Rails がマルチパートメール(multipart/alternative形式)を自動生成してメール送信します。
パルチパートメールとは、テキストメールとHTMLメールの両方をメール送信して、メールクライアント側で自動判別してメールを表示するための仕組みです。
添付ファイルの付きのメールの送信
Action Mailerで添付ファイルを送信するためには、メイラークラスに、
- attachments[添付ファイル名] = 添付するファイルデータ
を追加するだけで実現できます。
画像ファイルをメールに添付するサンプルプログラムを確認してみましょう。tmpフォルダにsample.jpgがあり、このファイルを添付するサンプルです。
app/mailers/inquiry_mailer.rb:
class InquiryMailer < ApplicationMailer def send_mail(inquiry) @inquiry = inquiry # 追記 attachments['sample.jpg'] = ..File.read(‘./tmp/sample.jpg') mail( from: 'system@example.com', to: 'manager@example.com', subject: 'お問い合わせ通知' ) end end
プレビューで確認すると、画像ファイルが添付されたことが確認できました!
このように、Action Mailerでメールにファイルを添付するのはとてもカンタンです!
まとめ
いかかでしたか?
今回はAction MailerでRuby on Rails からメールを送信する方法について解説しました。
メールのプレビュー機能を使うと、実際にメールを送信しなくてもメールのレイアウトを確認することが可能です。
HTMLメールや添付ファイル付きメールもカンタンに実現できるので、ぜひ活用してください。
そして、Action Mailerの使い方を忘れてしまったらこの記事を確認してくださいね!