[Rails]ActionMailerでメール送信機能を作る(完全版)

# はじめに
ある案件にお問い合わせメール送信機能の実装がありました。
自分的には、初めて自分で実装するので備忘録として、また、ひとつの記事だけではなかなか実装出来なかったので、この記事を見るだけで実装完了出来ると他の人にも役立つと思い書きます。

## 実装手順
#####1.使用するモデルの作成

```ruby

# 任意のモデル名、必要カラムを設定する
$ rails g model inquiry name:string text:string

$ rails db:migrate
```

#####2.Action Mailerの作成
メール送信するために必要なApplicationMailerを継承するクラスは、generateコマンドから作成出来る。

```ruby

$ rails g mailer inquiry
```

#####3.Gmailで送信するための設定
Railsからメール送信出来るようにするには、2つやることがあります。
①パスワードの二段階認証の設定
②アプリパスワードの設定
↑は[こちら](https://myaccount.google.com/security)から設定出来ます。
設定出来たら、下記を記述してください。

```config/enviroments/development.rb

# trueだと、メールが送信されない時にエラーメッセージが表示される
config.action_mailer.raise_delivery_errors = true

# メイラーのテンプレートでフラグメントキャッシュを有効にするべきかどうかを指定する
config.action_mailer.perform_caching = false

# 配信方法を指定する
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
 address:              'smtp.gmail.com',
 port:                  587,
 domain:               'gmail.com',
 user_name:            '<gmailのメールアドレス>',
 password:             'アプリパスワード',
 authentication:       'plain',
 enable_starttls_auto:  true
}
```

#####4.メールの宛先や件名を指定する

```app/mailer/inquiry_mailer.rb

def send_mail(inquiry)
  @inquiry = inquiry
  mail(
    from: 'from@example.com', # 送信元メールアドレス
    to:   'to@example.com',   # 送信先メールアドレス
    subject: 'お問い合わせメール' # 件名
  )
end
```

※デフォルト値を設定する場合は、application_mailer.rbに記述する。
(この場合、app/mailer/inquiry_mailer.rbのfrom: 〇〇の記述は必要なし。)

```app/mailer/application_mailer.rb

class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com'
  layout 'mailer'
end
```

#####5.メール本文のレイアウトを作成
メール本文のレイアウトを作成するためは命名規則にしたがってerbファイルを作成します。
(app/views/メイラー名_mailer/メイラークラスのメソッド名.text.erb)

```app/views/inquiry_mailer/send_mail.text.erb

==================================
<%= @inquiry.name %> 様 から問い合わせがありました。
==================================

＜お問い合わせ内容＞
<%= @inquiry.text %>
```

#####6.メールをプレビューで確認
ActionMailer::Previewを継承したクラスは、generateコマンドで生成したInquiryMailerPreviewクラスが存在するので、そちらに下記を記述して確認する。

```spec/mailers/previews/inquiry_preview.rb

# Preview all emails at http://localhost:3000/rails/mailers/inquiry
class InquiryPreview < ActionMailer::Preview
  def inquiry
      inquiry = Inquiry.new(name: "三原 蓮之介", text: "問い合わせメッセージ")

      InquiryMailer.send_mail(inquiry)
  end

  private
  def inquiry_params
    params.require(:inquiry).permit(:name, :text)
  end
end
```

確認方法は、サーバーを起動し、http://localhost:3000/rails/mailers/inquiry に接続。
※接続先はファイルの一番上に書いてあります。

#####7.実際にメールを送信する
コントローラーに送信する処理を記述する。
そうすれば、該当のアクションを実行された時にメールが送信されます。

``` app/controllers/inquiries_controller.rb

class InquiriesController < ApplicationController

〜中略〜

  def create
    @inquiry = Inquiry.new(inquiry_params)

    if @inquiry.save
      # こちらのコマンドを実行することでメールが送信される
      InquiryMailer.send_mail(@inquiry).deliver
      redirect_to inquiries_path, flash: {success: '送信が完了しました'}
    else
      flash.now[:alert] = '必須項目を入力、もしくは入力内容に間違いがあります'
      render :index
    end
  end

  private
  def inquiry_params
    params.require(:inquiry).permit(:name, :text)
  end
end
```

コンソールで確認してみても良いです○

```ruby

$ rails c

irb(main):001:0> inquiry = Inquiry.new(name: "サンプル太郎", text: "問い合わせメール")
irb(main):002:0> InquiryMailer.send_mail(inquiry).deliver_now
```

# 終わりに
意外と簡単に実装出来ますね。
個人的にGmailの設定をするってことに気付くのに少し遅れて時間がかかりましたが、そこだけしっかり設定すればつまづくことも少ないと思います！
よく使う機能だと思うので、実装できるようにしておきましょう！！

## 参考
[【Rails入門】Action Mailerのメール送信を初心者向けに基礎から解説](https://www.sejuku.net/blog/48739)

[【Rails】メール送信設定 〜gmail利用〜](https://qiita.com/ozackiee/items/f260f34db4e5c887460d)

[Action Mailer の基礎]
(https://railsguides.jp/action_mailer_basics.html)