Rails
ActionMailer

ActionMailerを使ってメールを送信する

既に実装されていたメールの一部を別のメイラーに移す機会があったので、全体的に学び直した(主にRails Guide)ので備忘録的にメモ。
なお、メールを送るための設定はすでにされていたので割愛。

ActionMailerの特徴

  • ActionMailer::Baseを継承している
  • app/mailersに配置される
  • app/viewsにあるビューと結びつく

メイラーの作成

コマンドでメイラーを作成する
rails gコマンドでメイラーに必要なファイルを作成する。

$ rails g mailer UserMailer

メイラーの編集

メイラーを編集することで、送信するメールを設定できる。また、誰にメールを送るかや、メールの送信元のアドレス、メールの題も設定できる。

send_mailというメソッドでメールを送るようにしてみる。
使っているものは以下。

  • default
    • ハッシュを渡すことができ、全メールで適用されるデフォルト値を決める。:formは送信元のメールアドレスを設定している。
  • mail
    • メソッド内それぞれの設定。メールの題や誰に送るかを設定している。

インスタンス変数を定義することで、メールの文面内で使用できるようなる。

class UserMailer < ApplicationMailer::Base
  default from: 'sender@mail.com'  # デフォルトの送信元のメールアドレス

  def send_mail(user)
    @user = user
    mail(to: @user.email, subject: 'メールのタイトル')
  end
end

メイラービューを作成

app/views/user_mailer/ディレクトリでメソッド名と同じsend_mail.html.erbというファイルを作成する。
HTMLでフォーマットされたメールテンプレートになる。

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1><%= @user.name %>様、example.comへようこそ。</h1>
      <p>
      example.comへのサインアップが成功しました。
      your username is: <%= @user.login %>.<br>
    </p>
    <p>ご入会ありがとうございます。どうぞお楽しみくださいませ。</p>
  </body>
</html>

HTMLフォーマットのメールを受け取らない人のために、テキストメールも作成しておく。
app/views/user_mailer/ディレクトリでsend_mail.text.erbというファイルを作成する。

<%= @user.name %>様、example.comへようこそ。
===============================================

example.comへのサインアップが成功しました。ユーザー名は「<%= @user.login %>」です。

本サイトにユーザー登録いただきありがとうございます。

メイラーを呼び出す

コントローラやモデルなどからメイラーを呼び出す。

UserMailer.send_mail(@user).deliver_later

ActionMailerはActive Jobと統合されているので、Webのリクエスト/レスポンスサイクルの外で非同期にメールを送信できる。

メイラーの呼び出し

メイラーのメソッドはActionMailer::MessageDeliveryオブジェクトを返り値として返す。
ActionMailer::MessageDeliveryオブジェクトは、そのメール自身が送信対象であることをdeliver_nowやdeliver_laterに伝える。
ActionMailer::MessageDeliveryオブジェクトは、Mail::Messageをラップしている。
内部のMail::Messageオブジェクトの表示や変更を行いたい場合は、ActionMailler::MessageDeliveryオブジェクトのmessageメソッドにアクセスする。