Laravel 7 ビューファイルで指定したアドレスにメールを送信する

# 目的

- ビューファイルからのトリガーでメールを送信する処理を追加する際、非常に詰まったため実施方法をまとめる

# 実施環境

- ハードウェア環境(下記の二つの環境で確認)

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いて導入 |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

# 前提情報

- ローカル開発環境を用いたメール送信処理の追加方法をまとめる。
- メール送信サーバはGmailを使用する。
- 下記の方法を実施して当該アプリからテストメールを送信できる状態にしていること。
     - [Laravel 7 アプリからメールを送信する](https://qiita.com/miriwo/items/4dbd3de824dd892047c3)

# 概要

1. 入力フォームの作成
     1. ルーティングファイルの編集
     1. コントローラファイルの作成と編集
     1. ビューフィアルの作成と編集
1. メール送信の準備
     1. クラス作成
     1. 送信内容の作成
1. 確認

# 詳細

1. 入力フォームの作成
    1. ルーティングファイルの編集
        1. Laravelアプリ名ディレクトリで下記コマンドを実行してルーティングファイルを作成する。

            ```terminal
            $ vi routes/web.php
            ```
        1. 開いたルーティングファイルを下記のルーティング情報を追記する。

            ```アプリ名ディレクトリ/routes/web.php
            Route::get('/input', 'TestMailController@input');
            Route::post('/send', 'TestMailController@send');
            ```
        1. 保存して閉じる。
    1. コントローラファイルの作成と編集
        1. アプリ名ディレクトリで下記コマンドを実行してメール送信用のコントローラを作成する。

            ```terminal
            $ php artisan make:controller TestMailController
            ```
        1. アプリ名ディレクトリで下記コマンドを実行して先に作成したコントローラファイルを開く。

            ```terminal
            $ vi app/Http/Controllers/TestMailController.php
            ```
        1. 開いたコントローラファイルを下記の様に修正する。

            ```アプリ名ディレクトリ/app/Http/Controllers/TestMailController.php
            <?php
            
            namespace App\Http\Controllers;
            
            use Illuminate\Http\Request;
            //下記を追記する
            use Illuminate\Support\Facades\Mail;
            use App\Mail\TestSendMail;
            //上記までを追記する
            
            class TestMailController extends Controller
            {
                //下記を追記する
                public function input()
                {
                    return view('test_mails.input');
                }
            
                public function send(Request $request)
                {
                    $contact = $request->all();
                    Mail::to($contact['email'])->send(new TestSendMail());
                    return redirect('/input');
                }
                //上記までを追記する
            }
            ```
        1. 保存して閉じる
    1. ビューファイルの作成と編集
        1. アプリ名ディレクトリで下記コマンドを実行してビューファイルを格納するディレクトリを作成する。

            ```terminal
            $ mkdir resources/views/test_mails
            ```
        1. アプリ名ディレクトリで下記コマンドを実行してビューファイルを開く。

            ```terminal
            $ vi resources/views/test_mails/input.blade.php
            ```
        1. 開いたビューファイルを下記の様に修正する。

            ```アプリ名ディレクトリ/resources/views/test_mails/input.blade.php
            <form action="/send" method="POST">
                @csrf
                <input type="text" name="email">
                <input type="submit">
            </form>
            ```
    1. 確認
        1. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。

            ```terminal
            $ php artisan serve
            ```
        1. 下記にアクセスする。
            - [http://127.0.0.1:8000/input](http://127.0.0.1:8000/input)
        1. 下記の様に入力欄と送信ボタンが表示されている事を確認する。

            <img width="594" alt="スクリーンショット 2020-05-18 23.22.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/fe670d12-d19f-18ae-593f-2be01357d1a3.png">
1. メール送信の準備
    1. アプリ名ディレクトリで下記コマンドを実行してメール送信専用のクラスが記載されたファイルを作成する。

        ```terminal
        $ php artisan make:mail TestSendMail
        ```
    1. アプリ名ディレクトリで下記コマンドを実行して先に作成したメール送信専用のクラスファイルを開く

        ```terminal
        $ vi app/Mail/TestSendMail.php
        ```
    1. 開いたクラスファイルを下記の様に修正する。

        ```アプリ名ディレクトリ/app/Mail/TestSendMail.php
        <?php
        
        namespace App\Mail;
        
        use Illuminate\Bus\Queueable;
        use Illuminate\Contracts\Queue\ShouldQueue;
        use Illuminate\Mail\Mailable;
        use Illuminate\Queue\SerializesModels;
        
        class TestSendMail extends Mailable
        {
            use Queueable, SerializesModels;
        
            /**
             * Create a new message instance.
             *
             * @return void
             */
            public function __construct()
            {
            }
        
            /**
             * Build the message.
             *
             * @return $this
             */
            public function build()
            {
                //下記を追記
                return $this
                    //メールの件名
                    ->subject('Test Mail')
                    //メールとして表示したいビューファイル
                    ->view('mails.test');
            }
        }
        ```
    1. アプリ名ディレクトリで下記コマンドを実行してメールとして表示したいビューファイルを格納するディレクトリを作成する。

        ```terminal
        $ mkdir resources/views/mails
        ```
    1. アプリ名で下記コマンドを実行してメールとして表示したいビューファイル作成する。

        ```terminal
        $ vi resources/views/mails/test.blade.php
        ```
    1. 開いたメールとして表示したいビューファイルを下記の様に編集する。

        ```アプリ名ディレクトリ/resources/views/mails/test.blade.php
        これはテストメールです
        ```
1. 確認
    1. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。

        ```terminal
        $ php artisan serve
        ```
    1. 下記にアクセスする。    
        - [http://127.0.0.1:8000/input](http://127.0.0.1:8000/input)

    1. 入力欄にテストメールを送信したいアドレスを入力する(正常に実装できているとメールが送信されるので注意！！！)
    1. 入力したアドレスのメール受信ボックスを確認する。
    1. 下記の様にメールが受信できていれば実装完了である。
         - [Laravel 7 アプリからメールを送信する](https://qiita.com/miriwo/items/4dbd3de824dd892047c3)も含めて正常に実装できていれば下記の様なメールが送信されるはずである。

            <img width="1459" alt="Test_Mail_-_shun_okawa_gmail_com_-_Gmail.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1e13d9be-e96f-db57-6864-9f84fd97f209.png">