【Rails入門】Action Mailerのメール送信を初心者向けに基礎から解説

こんにちは!システムエンジニアのオオイシです。

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メールの送信先アドレス
複数の宛先には”,”(カンマ)区切りまたは配列を指定
ccCC(カーボンコピー)のメールアドレス
複数の宛先には”,”(カンマ)区切りまたは配列を指定
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 にアクセスしてみてください。

次の画面が表示されます。

action_mailer_preview

inquiryのリンクは、InquiryMailerPreviewクラスに作成したinquiryメソッドに対応して表示されています。

そのため、確認したいメールデータ毎にメソッドを定義すれば、いろいろなパターンでプレビューすることも可能です。

inquiryのリンクをクリックしてください。

action_mailer_preview2

このように、メールのプレビューが確認することができました!

プレビューでは実際にメールが送信されることはないので何度でも確認することが可能です。

メールを送信してみよう

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」のfromtoを任意のメールアドレスに変更して、次のように実行してください。

注意:間違いメール防止のためにメールの宛先に間違いないかよく確認してください!!

$ bin/rails c
    ~~ 省略 ~~ 
irb(main):001:0> inquiry = Inquiry.new(name: "侍 太郎", message: "問い合わせメッセージ")
irb(main):002:0> InquiryMailer.send_mail(inquiry).deliver_now

実行後はメールが送信されたことを確認してみてください。

自分宛てにGmailでメール送信した場合は次のように受信できたと思います。

action_mailer_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>

プレビュー機能でどのようなレイアウトになるか確認してみましょう。

action_mailer_gmail_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_attach

このように、Action Mailerでメールにファイルを添付するのはとてもカンタンです!

まとめ

いかかでしたか?

今回はAction MailerでRuby on Rails からメールを送信する方法について解説しました。

メールのプレビュー機能を使うと、実際にメールを送信しなくてもメールのレイアウトを確認することが可能です。

HTMLメールや添付ファイル付きメールもカンタンに実現できるので、ぜひ活用してください。

そして、Action Mailerの使い方を忘れてしまったらこの記事を確認してくださいね!

この記事を書いた人

システムエンジニア歴15年のオオイシです!好物は Java と Ruby。プログラミング、システムアーキテクトからマネジメントに到るまでなんでも食べます。
システム開発の相談やお困りごとがあればお気軽に
makoto.oishi.0705@gmail.com まで連絡頂けると幸いです

目次