1
1

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 3 years have passed since last update.

【Rails】Action Mailerでメール送信機能を作ろう

Posted at

初めに

Railsを使って自分のアプリケーションを作っていると、「会員登録したら自動でご案内のメールが届く」とか「商品を購入したら自動で注文内容の確認メールが届く」などの機能を実装してみたい!と思ったりしていませんか? そういう機能をRailsで作る方法について学習した内容について纏めてみました。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。

目次

  • Action Mailerとは
  • 導入する方法
  • 参考サイト

Action Mailerとは

Action Mailerについて公式ドキュメントでは、以下のように紹介しています。

Action Mailer allows you to send emails from your application using mailer classes and views.

つまり、Railsのメールクラスとビューを使ってE-mailを送ることが出来るRailsの機能の一つです。

導入する方法

✅ Mailerを生成する
rails gコマンドで「rails g mailer mailer名」で生成します。「mailer名」は任意であり、好きなお名前で構いませんが、作りたい機能が分かりやすい名前がいいです。ここでは例として「TestMailer」とします。

❯ rails g mailer TestMailer
Running via Spring preloader in process 13084
      create  app/mailers/test_mailer.rb
      invoke  erb
      create    app/views/test_mailer
      invoke  rspec
      create    spec/mailers/test_mailer_spec.rb
      create    spec/mailers/previews/test_mailer_preview.rb

rspec用のテストファイルまで自動で生成されます。
mailerのコントローラー的な機能をする①「app/mailers/test_mailer.rb」とメールの本文が格納されるフォルダー②「app/views/test_mailer」です。これらは後で詳しくみていきます。

その他のアプリのテストに必要な③「spec/mailers/test_mailer_spec.rb」や
④「spec/mailers/previews/test_mailer_preview.rb」については割愛します。
気になる方は下記の記事をご覧ください。

✅ メールを送る側(sender)のsettingをする
メールを送信するためにはご自身の利用しているメールアカウントの情報が必要です。Mailer自体でメールを送信するのではなく、アプリの開発者が登録した任意のメールサービス(GmailやYahooなどのAPI)を通してMailを送信します。なので、その設定を行う必要があります。
①「development.rb」の修正
railsの「config/environments/development.rb」で以下のような設定を追記します。

  config.action_mailer.default_url_options = { host: 'localhost:3000' }
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.perform_caching = true
  config.action_mailer.smtp_settings = {
    port:                 587,     
    address:              'smtp.gmail.com',
    domain:               'gmail.com',
    user_name:            'user_name@gmail.com',    #ご自身のメールアドレス
    password:             'hogohogo',  #ご自身のパスワードですが、再設定が必要です
    authentication:       'login',
    enable_starttls_auto: true
  }

本番環境の場合は、production.rbファイルをいじりますが、同じ書き方で大丈夫です。
メールのやり取りにはSMTP (Simple Mail Transfer Protocol)を利用します。他には「IMAP」「POP」などがありますが、基本STMPです。

参考サイト:https://www.kagoya.jp/howto/rentalserver/smtpserver/

port番号やaddressなどはメールサービスを提供する企業の製品ごとに決まっています。設定方法などについては下記のサイトをご覧ください。公式ドキュメントでは25番以外はどの番号でも大丈夫とされています。

参考サイト:https://gitlab-docs.creationline.com/omnibus/settings/smtp.html

ちなみにyahooメールで設定してみたんですが、メールを送信した際にtimeoutエラーが出ました。ネットワークの環境問題なので仕方ないと思います。おすすめはやはりGmailです。

②Gmailはパスワードの再設定(2段認証)が必要
手順1:2段階認証の設定を行う
下記のサイトを参考に2段階認証の設定を行います。
https://enjoypclife.net/google-account-gmail-2-step-verification/
手順2:アプリパスワードを入手する
gmailに接続したら、Googleアカウントを管理をクリックします。
スクリーンショット 2021-04-24 8.42.32.png
セキュリティの「アプリパスワード」をクリックして新しいパスワードを入手します。デバイス(mac,iphoneなどなど)色々ありますが、何でも構いません。パスワードを発行したらコピーしておきます。
スクリーンショット 2021-04-24 8.54.40.png

③development.rbのpasswordを新しいパスワードに変更
先ほどコピーしたアプリパスワードをdevelopment.rbのpassword欄に入力します。

 password:           'hogehoge',  #2段階認証で発行した新しいパスワードにかきかえます

これでメールを送信する基本設定は完了です。

✅ test_email.rbファイルを修正
「app/mailers/」ディレクトリのtest_email.rbにメールを送信する処理を記述します。
TestMailerクラスの関数を定義します。関数名は何でも大丈夫ですが、分かりやすい名前で統一します。
また、引数としてuserを指定しました。引数を指定しなくても動かすには問題はありません。

class TestMailer < ApplicationMailer

  def test_email(user)
    @user =  user
    @url  = 'http://localhost:3000/'
    # mail(to: @user.email, subject: '私の素敵なサイトへようこそ')
    mail(to:'target@yahoo.co.jp', subject: 'Action Mailerからのお知らせ')
  end

end

ここで宣言した変数@user@urlなどはviewファイルで使用できます。変数を使うとメールの本文となるviewファイルで使うことが出来るので便利です。これもお好みで設定しましょう。
ここで重要なのは「mail( )」のところです。メールを送る時の送信者やメールのタイトルなどを指定できます。オプションは以下の通りです。

to: メールの宛先
from: メールの送信者
cc: Cc
bcc: Bcc
subject: メールのタイトル
date: 送信日時
reply_to: 返信用のメールアドレス

ここではto:には送信先のメールアドレス('target@yahoo.co.jp')を、subject:にはメールのタイトル('Action Mailerからのお知らせ')をそれぞれ入力しました。

✅ コントローラー(トリガー)に実行文を追記
メールを送信する処理をtest_email.rbファイルに「test_email(user)」という関数名で用意しましたが、関数を呼び出す実行する処理を記述する必要があります。やり方は簡単で「TestMailer」クラスで定義した「test_email(user)」関数を好きなコントローラーのアクション(関数)に追記するだけです。
例としてツイッターを投稿した場合にメールを送信したいため、対象のコントローラーに次のように追記しました。

 def create
    @tweet = Tweet.create(tweet_params)
    if @tweet.valid?
      @tweet.save
      TestMailer.test_email("テスト").deliver  #ここに追記
      redirect_to root_path
  end

「TestMailer.test_email("テスト").deliver」のところですが、TestMailerというクラスのtest_email(user)を呼び出し、deliverメソッドを実行しています。TestMailer??test_email(user)??ってなんぞや?と思われるかもしれませんが、これは先ほど作成したtest_email.rbに書いてある通りです。

class TestMailer < ApplicationMailer

  def test_email(user)

引数として"テスト"を渡しています。

✅ メールの本文(viewファイル)を用意する
自動生成されたviewフォルダー(app/views/test_mailer)のところにメールの本文となるviewファイルを作ります。ファイル名は「test_email.html.erb」と「test_email.text.erb」2つ用意します。railsの特徴としてtest_email.rbで宣言したメソッド名とviewファイル名は同じでなければならない点に注意してください。違う名前だと認識できません。2つ用意する理由はhtml形式の本文が読めないメールサービスもあるからです。action mailerは優先的にhtmlを先に探し、なければtextファイルを探します。これはとても便利な機能ですね。また、test_email.rbの変数をそのままviewファイルでも使えます。

#test_email.html.erb
<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1><%= @user %>様、example.comへようこそ。</h1>
      <p>
      example.comへのサインアップが成功しました。
      <br>
    </p>
    <p>
      このサイトにログインするには、<%= @url %>をクリックしてください。
    </p>
    <p>これでテストは終了です!おめでとう!</p>
  </body>
</html>
#test_email.text.erb
<%= @user %>様、example.comへようこそ。
===============================================
example.comへのサインアップが成功しました。
このサイトにログインするには、<%= @url %>をクリックしてください。
これでテストは終了です!おめでとう!

✅ railsを起動してツイッターを投稿してみる
ご自身で作成したアプリなどでコントローラーの機能を実行します。今回の場合はツイッターに投稿してみました。投稿が成功するとメールが送信される形になります。
スクリーンショット 2021-04-24 10.06.54.png

viewファイルで書いた内容通り、メールが届きました。

参考サイト

https://railsguides.jp/action_mailer_basics.html
https://railsguides.jp/configuring.html
https://www.sejuku.net/blog/48739
https://qiita.com/annaaida/items/81d8a3f1b7ae3b52dc2b
https://stackoverflow.com/questions/31009419/connection-refused-connect2-for-localhost-port-25-rails/31009864
https://teratail.com/questions/44816
http://tatsuya1970.com/?p=7542
https://guides.rubyonrails.org/action_mailer_basics.html
https://dharmdip.wordpress.com/2012/03/22/rails-actionmailer-setup-with-yahoo-smtp-setting/

1
1
0

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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?