既に実装されていたメールの一部を別のメイラーに移す機会があったので、全体的に学び直した(主に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メソッドにアクセスする。