actionmailerを使ってみる

榊間です
お盆とかで少し間が空いてしまったので久しぶりの更新です。


今日はアクションメイラーについて書こうと思います。


今回やりたいことは、inquireページからお問い合わせを送信した時、運営者側と利用者に通知のメールを送ることです。


準備

まずメイラーを生成します(今回はinquirymailerにします)

rails generate mailer InquiryMailer

formで以下のように書いときます。(simpleform使ってますが、要はemailとかもろもろの情報をハッシュ形式で渡してます)

    <%= simple_form_for(@inquiry) do |f| %>
...
      <%= f.input :email %>
...
      <%= f.button :submit, "この内容で送信する" %>
    <% end %>



次にapp/mailerに生成されたinquiry_mailer.rbにdefaultメソッドと、complete_inquiry、notice_inquiry(この二つの名前は自由)メソッドを定義します。

# encoding: utf-8
class InquiryMailer < ActionMailer::Base
  default from: "defaultの送信元メールアドレスを書いてください"

  def complete_inquiry(inquiry)
    @inquiry = inquiry
    mail(to: "利用者のメールアドレス", subject: "題名です")
  end

  def notice_inquiry(inquiry)
    @inquiry = inquiry
    mail(to: "運営側のメールアドレス", subject: "問い合わせ通知")
  end
end



そして、controllerにメールを送りたいタイミングで、inquire_mailer.rbに定義したメソッドを呼び出します。

引数には@inquiryを渡しており、inquire_mailer.rbや、最終的にはview(後述)で使われています。

# encoding: utf-8
class InquiriesController < ApplicationController
  before_filter :set_inquiry, only: [:new, :create]

  def new
  end

  def create
    if @inquiry.save
      InquiryMailer.complete_inquiry(@inquiry).deliver
      InquiryMailer.notice_inquiry(@inquiry).deliver
      redirect_to inquiries_path
    else
      render action: "new"
    end
  end

private

  def set_inquiry
    @inquiry = Inquiry.new(params[:inquiry])
  end
end



あとはメールの内容をviewで生成します。

一番最初に生成されたview/inquiry_mailerに、inquiry_mailerに定義したメソッドに対応するファイルである、complete_inquiry.text.erbとnotice_inquiry.text.erbを生成し編集します。ここでは@inquiryを利用して、formで入力された内容(例えば名前やメールアドレスなど)を利用できます。文面はお好みで。

お名前:<%= @inquiry.name %> 様
メールアドレス:<%= @inquiry.email %>

これでメールが送られるようになったはずです。