【備忘録】メールの送信機能の実装について

# はじめに
- 本記事は、備忘録としてまとめたものになります。
- 他の方の参考になる可能性も踏まえて、一般公開も行なっております。
- また記載内容はすべて、正しい内容が記載されているとは限りません。
- 誤った内容を見つけた場合は、ご指摘をお願いいたします。

# この記事は誰向けの記事か？
- ChatGPTの拡張機能をGoogleChromeに導入したい人

# 背景


# タスク
主に以下のタスクが生じます。
- 事前準備をしましょう。
- ターミナル上からメーラークラスを生成しましょう。
- メールを送信するためのメソッドを定義しましょう。
- メール文面を設定しましょう。
- 送信メーラーを利用するための環境設定をしましょう。
- コントローラーのアクションに送信メソッドを宣言しましょう。

# ★事前に準備が必要なもの・こと
- Railsでアプリを事前に作成していること
- VSCodeを使用していること
- Gmailアカウント：メールアドレスとアプリパスワード

# ★メーラークラスの作成
ターミナル上で、以下のコマンドを実行することで、メーラークラスが生成されます。(noticeの部分の名称は任意です)
```
rails g mailer notice
```
生成後、ターミナル上で以下のメッセージが出力されれば、生成が完了となります。
```
create  app/mailers/notice_mailer.rb
invoke  erb
create    app/views/notice_mailer
invoke  test_unit
create    test/mailers/notice_mailer_test.rb
create    test/mailers/previews/notice_mailer_preview.rb
```

万が一、メーラークラスを削除したい場合は、以下のコマンドを実行することで、削除されます。
```
rails d mailer notice
```
実行結果は以下の通りになります。
```
remove  app/mailers/notice_mailer.rb
invoke  erb
remove    app/views/notice_mailer
invoke  test_unit
remove    test/mailers/notice_mailer_test.rb
remove    test/mailers/previews/notice_mailer_preview.rb
```

# ★メールの送信メソッドを定義
VSCode上に、notice_mailer.rbが作成されているので、そこに送信メソッドを定義する。
![スクリーンショット 2023-02-16 22.09.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/1110fa12-82bf-8894-d96d-8b340215ce22.png)
以下は、アプリケーション上から管理者にお問い合わせのメールを送信するためのメソッドです。宛先にはto以外にも、ccやbccも設定でき、複数のアドレスを設定することも可能です。
```Ruby
class NoticeMailer < ApplicationMailer
  def send_admin(inquiry)
    @Inquiry = inquiry
    mail to: ENV['GMAIL_ADMIN_ADDRESS'], #ここで宛先の指定を行う(GitHubに公開するため、アドレスは環境変数に設定している)
      subject: "利用者からお問い合わせがありました" #件名
  end
end
```

# ★メール文面を設定
VSCode上に、ファイルを2つ準備し、その中にメールに記載する内容を記載する。名前は送信メソッド名と同じにする。
![スクリーンショット 2023-02-16 22.33.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/2bee406c-3610-dd13-812b-f8d77d2eee86.png)
以下のコードは、メール文面の一例です。
```Ruby
管理者様

ユーザーからお問い合わせがありました。以下の内容をご確認いただき、ご対応をお願いいたします。<br><br>
お名前<br>
<%= @Inquiry.name %>
<br><br>
連絡先メールアドレス<br>
<%= @Inquiry.email %>
<br><br>
お問い合わせ内容<br>
<%= safe_join(@Inquiry.detail.split("\n"),tag(:br)) %>
```

# ★Gmailの送信メーラーを利用するための環境設定
メーラーを使用するため、以下の記述を行う。
![スクリーンショット 2023-02-16 22.50.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/31cbd0fe-a865-d098-317b-84a8950490e5.png)
- 開発環境であれば、「environments>development.rb」へ記述
- 本番環境であれば、「environments>production.rb」へ記述

```Ruby
Rails.application.configure do
  #Email-related settings(Google SMTP)
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.perform_deliveries = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address:  'smtp.gmail.com',
    port:  '587',
    user_name:  ENV['GMAIL_ADMIN_ADDRESS'], #Gmailのカウントユーザー名（〜@gmail.com）
    password:  ENV['GMAIL_APP_PASSWORD'], #アプリケーションパスワード(取得方法は、このページの最後に記載しています)
    authentication:  :plain,
    enable_starttls_auto:  true
  }
end
```
※GitHub上でアドレスやパスワードが流出することを防止するために、環境変数で設定している。

# ★コントローラー上に送信メソッドを記述
「送信メソッドの定義」「メール文面の設定」「送信メーラーの環境設定」を終えたら、各コントローラーのアクション上に送信メソッドを宣言するだけでメール送信の機能が使えます。以下のコードは、メール送信させるための一例です。
```Ruby
  def create
　　　　　　　　@Inquiry = Inquiry.new(inquiry_params)
    if @Inquiry.valid?
      NoticeMailer.send_admin(@Inquiry).deliver_now #送信メソッド
      redirect_to send_inquiry_path #送信完了画面へリダイレクト
    else
      render :new #送られてきたパラメータに問題があれば、問い合わせ入力ページへ戻す
    end
  end

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

# （補足）アプリパスワードの取得方法
1. Googleアカウントにログイン
2. アカウント管理画面から「セキュリティ」タブを選択
![スクリーンショット 2023-02-16 23.16.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/599cf052-d3b5-41aa-340e-f6774a4f010c.png)
3. アプリパスワードへアクセス
![スクリーンショット 2023-02-16 23.17.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/cf7fab21-42fd-4922-23e5-b870d0498a6d.png)
4. アプリパスワードからアプリやデバイスを選択
![スクリーンショット 2023-02-16 23.18.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/605c93b6-8982-ec68-8796-b8fe577ba905.png)
5. アプリパスワードをコピー
![スクリーンショット 2023-02-16 23.18.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/2f7a1a91-b225-d1fc-8ca3-00b162c4cc48.png)

# （補足）開発環境
OS：macOS Ventura 13.1
ブラウザ：GoogleChrome 110.0.5481.100（Official Build） （arm64）
開発言語：Ruby on Rails 6.0.6.1
開発環境：AWS(EC2、Route53）、Nginx、GitHub
その他：Let's Encrypt、Gmail