122
127

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Action Mailer でメール送信機能をつくる

Last updated at Posted at 2019-06-27

##概要

Action Mailerを使ってメールの送信機能をつくります:speech_balloon:
今回は管理者がユーザーからのお問い合わせに対して、管理者画面から返事をすると、
ユーザーにメールで送信される機能を実装していきます。

学習メモとして記録 :writing_hand_tone4:

##参考

(1)RAILS GUIDES: Action Mailer の基礎
(2)【Ruby on Rails】メール送信の実装手順(ActionMailer)とはまったエラーなど
(3)Railsでメール自動配信機能をつくるまでの道程
(4)Rails の ActionMailer でメール送信処理
(5)RailsのAction Mailerでメール送信

Action Mailerとは

Ruby on Rails に組み込まれているメール送信機能のこと。
Action Mailer を使うと、Ruby on Rails からメールを送信してくれます :envelope:

・メールマガジンの一斉送信
・ウェブサイトに会員登録した時のthank youメール
・お問い合わせフォームの記入内容が管理者にメールでも送信される

のような時にアプリケーションからメールを送信する機能と解釈してます。
アプリケーションのメーラークラスやビューからメールを送信することができる便利な機能です!

#導入手順

1. メイラーを生成

railsコマンド(rails generate)で生成します。 ContactMailer は任意クラス名。
今回はお問い合わせ関係のメール送信機能を作成したいためContactMailerです。

terminal.生成
$ rails generate mailer ContactMailer

terminal.結果
Running via Spring preloader in process 1893
   create  app/mailers/contact_mailer.rb
   invoke  erb
   create    app/views/contact_mailer
   invoke  rspec
   create    spec/mailers/contact_mailer_spec.rb
   create    spec/mailers/previews/contact_mailer_preview.rb

無事に生成されましたね :v_tone3:

###2. サーバーを設定

メールを送信するときは、送信するサーバーが必要。と言うことで、
config/environments/development.rbにメール送信設定を記述します。
今回はg-mailを使う記載方法です。

development.rb
Rails.application.configure do
  #--- 中略 ---#
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    port:                 587,
    address:              'smtp.gmail.com',
    domain:               'gmail.com',
    user_name:            '<YOUR EMAIL ADDRESS>',
    password:             '<YOUR EMAIL PASSWORD>',
    authentication:       'login',
    enable_starttls_auto: true
  }
end

port:も上記の数のままで大丈夫です。

上から順々に見ていきます。
ここでは、config.action_mailerというパラメーターに色んなオプションを指定してます。

1行目 raise_delivery_errors
メールの送信に失敗した時にエラーを出すかどうか (出したいので true)

2行目 delivery_method
メールの送信方法。 デフォルトで :smtd なので気にする必要もないのですが、
わたしみたいに「なにそれ!?」ってなった方は以下の引用を読んでみてください。

「SMTP」とは「Simple Mail Transfer Protocol(シンプル・メール・トランスファー・プロトコル)」の略で、あえて>訳せば「簡単なメールの送信の手順」というところだろうか。お約束ごとと考えてもいい。

あなたがメールを書き、宛先のアドレスを入力して「送信」アイコンをクリックする。このとき、あなたのスマホやパソコン>は、この「SMTP」のお約束ごとに従って、あなたが契約しているメールサーバーと、こんなやり取りをするのである。
「メールを送るよ〜」「ええで!」「宛先は〇◯だよ」「りょ」「本文はかくかくしかじかだよ」「受け取ったで!」――とまぁそんな具合。

出典: メール設定で最初につまずく「SMTP」「POP」「IMAP」。その意味&設定方法は?

3行目 smtp_settings
smtpの詳細設定って感じです。

  1. port => SMTPサーバーのポート番号
  2. address => SMTPサーバーのホスト名
  3. domain => HELOドメイン
  4. user_name => メール送信に使用するgmailのアカウント
  5. password => メール送信に使用するgmailのパスワード
  6. authentication => 認証方法
  7. enable_starttls_auto => メールの送信にTLS認証を使用するか

###3. メーラーを編集
メーラーってRailsのコントローラーと似てるんですね。
「アクション」と呼ばれるメソッドがあり、メールの内容をつくるのにビューを使います。

生成直後は、以下のような application_mailer.rb

app/mailer/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com'
  layout 'mailer'
end

空のメーラー

app/mailer/contact_mailer.rb
class ContactMailer < ApplicationMailer
end

があるはずです。

application_mailerには全メーラー共通の設定を、
sample_mailerにはメーラー個別の設定をします。

###application_mailerを編集します

app/mailer/contact_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from:    "管理人 <from@example.com>",
  layout 'mailer'
end

共通の処理・設定を記述する場合にはdefaultメソッドを使用します。

プロパティ 役割
to 送信先の指定
cc 一斉送信先の指定
bcc 非表示送信先の指定
from メールの送信元名
subject メールタイトル
date メールの送信日時
reply_to 返信用アドレスの指定

などが指定できます。

contact_mailer.rb を編集します

今回は管理者の返信がユーザーのe-mailに届くようにします。
なのでメソッドをsend_when_admin_replyと定義しました。

app/mailer/contact_mailer.rb
class ContactMailer < ApplicationMailer

  def send_when_admin_reply(user, contact) #メソッドに対して引数を設定
    @user = user #ユーザー情報
    @answer = contact.reply_text #返信内容
    mail to: user.email, subject: '【サイト名】 お問い合わせありがとうございます'
  end

end

個別の設定にはmailメソッドを使用します。
send_when_replyedメソッドを呼び出す時に渡されるユーザーの情報から、
emailアドレスだけを取り出してメールの送信先としてします。

mailメソッドが呼び出されると、メール本文が記載されているビューが読み込まれます。
インスタンス変数(@xxx)でメーラービューに値を渡してあげたいので、インスタンス変数を用意してる感じです。

次は、そのメールの本文を作成していきます :keyboard:

###4. メールの本文を作成する(メーラービューの作成)

app/views/contact_mailerディレクトリ下にファイルを2つ作成します。

1つはHTMLフォーマット、もう一つはテキストメール。
顧客によってはHTMLフォーマットのメールを受け取ることができない / 受け取りたくない人もいるので、テキストメールも作成しておくのが最善です。

HTMLファイルの作成

views/contact_mailer/send_when_admin_reply.html.erb

  <h2><%= @user.name %> 様</h2>
 <p>この度は、お問い合わせありがとうございました。<br>
 以下でご質問の回答となっておりますでしょうか。</p>

  <p><%= @answer %></p>

  <p>今後とも XXX をよろしくお願いいたします。</p>

テキストファイルの作成

views/contact_mailer/send_when_admin_replyd.text.erb

  ===============================
  <%= @user.name %> 様
  ===============================

  この度は、お問い合わせありがとうございました。
 以下でご質問の回答となっておりますでしょうか。

  <%= @answer %>

  今後とも XXX をよろしくお願いいたします。

###5. 実際に処理を走らせるアクションにメール送信処理をさせる

メールの設定を記述しただけではメールは送信できません。
メーラー(ここではapplication_mailer.rb / contact_mailer.rb)は各コントローラーのアクションからの呼び出しによって起動します。

管理者がアプリケーション管理画面フォームより返信を送信し、その内容をメールでユーザーに送信します。
実際に処理を走らせるアクションはadmin/contacts_controller.rbとなります。

app/controllers/contacts_controller.rb

class Admin::ContactsController < Admin::ApplicationController
  def update
   contact = Contact.find(params[:id]) #contact_mailer.rbの引数を指定
   contact.update(contact_params)
   user = contact.user
   ContactMailer.send_when_admin_reply(user, contact).deliver
  end
end

例えば、ユーザーが新規アカウント登録をしてメールを送信する場合は、

app/controllers/users_controller.rb
class UsersController < ApplicationController
  before_action :set_user

  def create
    if @user.save #ユーザーのインスタンスが新しく生成されて保存されたら
      NotificationMailer.send_when_signup(@user).deliver #確認メールを送信
      redirect_to @user
    else
      render 'new'
    end
  end
end

createアクションに処理を走らせることになります。

わたしのアプリケーションでは、DBの設計上
ユーザーが問い合わせをした時点で、Contactsテーブルの中に、
1つレコードが準備されていて、その中に'返信'というカラムが用意されています。

なので、updateアクションを使って
すでにあるレコードの中に管理者の返信のデータだけを更新してあげる形になります:sunflower:

6. テストしてみる

以上でメーラーができるはずです・・!
実際にアプリケーションを動かしてみて、メールを受信できたら成功 :ok_hand_tone3:

以上、学習メモでした :hatched_chick::writing_hand_tone4:

122
127
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
122
127

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?