【Rails】メイラー機能について
今回はRailsでのメイラー機能について学んでいきます。
・メイラー機能の実装
・ユーザー全員に該当メールを送信したい場合
・メイラー機能の確認
メイラー機能の実装
メイラーはコントローラーととても役割が似ています。
コントローラーと同じく、以下のジェネレーターで作成することができます。
rails generate mialer TasksMailer
次にapp/mailers/questions_mailer.rbにおいてメールを送るためのメソッドを作成する。
class QuestionMailer < ApplicationMailer #クラス定義でApplicationMailerをスーパークラスに指定しています。 def creation_email(question) # 引数でQuestionオブジェクトを受け取っている。 @question = question メール本文で扱うためインスタンス変数に代入している。 mail # メールを作成・送信するためのメソッド( subject:"質問投稿通知メール", #タイトルを指定 from: "tsunemi0217@icloud.com", #送信元を指定 to:"tsunemi0217@icloud.com" #宛先を指定 ) end end
コントローラーの設定が完了したらメールのテンプレートを作成していきます。
今回はHTMLとテキストどちらの形式も作成するスタイルを取ります。
その理由としては例えば携帯電話向けにはテキストメールを送り、PC向けにはHTMLメールを送りたい、という要望が存在するからです。
このような方式をmultipart alternative方式というので覚えておきましょう。
app/views/task_mailer/creation_email.html.erb
# html形式 <p>以下の質問が投稿されました。</p> <ul> <li> <%= @question.title%> # コントローラーから受け取ったインスタンス変数から表示したい要素を呼び出している。 </li> <li> <%= @question.body%> </li> </ul> # text形式 <p>以下の質問が投稿されました</p> <br> <%= @question.title%> <br> <%= @question.body%>
以上でメイラーの設定は完了です。次にメイラーを呼び出すためのコードをコントローラーに設定していきましょう。
今回はタスク設定後に通知メールを設定したいのでquestionsコントローラーのcreateアクションを以下のように変更します。
def create @question = Question.new(question_params) @question.user_id = current_user.id @question.save! QuestionMailer.creation_email(@question).deliver_now # QuestionMailerクラスのcreation_emailメソッドを呼び出している。引数には今回の質問内容が代入されている@question変数を受け取る。 #deliver_nowは即時送信を行うメソッドである。 redirect_to questions_url end
以上で質問が投稿された際にユーザーに通知メールを送信する機能が完成しました。
ユーザー全員に該当メールを送信したい場合
class AdminMailer < ApplicationMailer default to: -> { Admin.pluck(:email) }, # ユーザーを管理しているAdminクラスにpluckメソッドを使用することですべてのユーザーのメアドを配列で受け取っている。pluckメソッドは引数のカラムのデータを配列で受け取る役割を持っている。 from: 'notification@example.com' def new_registration(user) @user = user mail(subject: "New User Signup: #{@user.email}") end end
メイラー機能の確認
最後に実装したメイラー機能が機能するかを確認します。
確認のためにはmailcatcherのgemを使用します。
gem install mailcatcherでgemをインストールします。
config/enviroments/development.rbでmailcatcherを使用できるように設定を変更します。
# Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false # メールの送信に失敗した場合エラーを出すかどうかを設定することができる。 config.action_mailer.delivery_method = :smtp # メールの送信方法を指定してくれている。smtpもメール送信方法の1つを表している。 config.action_mailer.smtp_settings = {address: '127.0.0.1', port: 1025} # smtpの詳細設定を行っている。ここではportとaddressでSMPTサーバーのポート番号とSMTPサーバーのホスト名を設定している。 ``` mailcatherを起動して送信されるか確かてあげましょう。<br> <br> 無事に送信されていればメイラー機能は問題なく実装されています。 <br> <br> 参考資料: [https://qiita.com/annaaida/items/81d8a3f1b7ae3b52dc2b]