Laravel 7 バッチ処理でusersテーブルのメールアドレスにビューファイルをベースとしたメールを送る

# 目的

- ビューファイルを用いたメールをバッチファイルから送信する方法をまとめる

# 実施環境

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

| 項目 | 情報 |
| --- | --- |
| 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を用いて導入 |

# 前提情報

- 下記、または下記に準ずる方法でバッチ処理を行うLaravelアプリでAuthによるユーザ認証機能が実装されていること。
    - [Mac Laravel 7 Authを用いたユーザ登録 ログイン ログアウトなどの機能を作成する](https://qiita.com/miriwo/items/5d4a94e8d2aa06b61530)
    - 認証機能実装後、受信可能なメールアドレスでLaravelアプリにユーザ登録されていること。
- 下記の作業がすでに完了しているものとして今回の記事ではメール送信サーバの設定は行わない。
    - [Laravel 7 アプリからメールを送信する](https://qiita.com/miriwo/items/4dbd3de824dd892047c3)
- 下記に目を通していただくと理解が早いかもしれない。
    - [Laravel Commandを実装する(超初歩)]()

# 概要

1. バッチファイルの作成
1. メール用のビューファイル設定
1. 確認

# 概要

1. バッチファイルの作成
    1. アプリ名ディレクトリで下記コマンドを実行してバッチファイル(コマンドファイル)を作成する。ファイル名を「SendMailCommand.php」とする。

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

        ```terminal
        $ vi app/Console/Commands/SendMailCommand.php
        ```
    1. 開いたコマンドファイルを下記の様に修正する。(開いたファイルで作成するコマンドでメールの送信処理を行う)
    
        ```アプリ名ディレクトリ/app/Console/Commands/SendMailCommand.php
        <?php
        
        namespace App\Console\Commands;
        
        use Illuminate\Console\Command;
        //下記を追加する
        //usersテーブル用のモデルファイルを紐づける
        use App\User;
        //メール送信用ファサードを紐づける
        use Illuminate\Support\Facades\Mail;
        use App\Mail\SendMail;
        //上記までを追加する

        class SendMailCommand extends Command
        {
            /**
             * The name and signature of the console command.
             *
             * @var string
             */
            //下記を修正する
            protected $signature = 'app:send_mail_users';
        
            /**
             * The console command description.
             *
             * @var string
             */
            //下記を修正する
            protected $description = 'usersテーブルのemail全てにメールを送信する';
        
            /**
             * Create a new command instance.
             *
             * @return void
             */
            public function __construct()
            {
                parent::__construct();
            }
        
            /**
             * Execute the console command.
             *
             * @return mixed
             */
            public function handle()
            {
                //下記を追加・修正する
                $users_infos = User::all();
                
                foreach ($users_infos as $users_info) {
                    echo $users_info['email']."\n";
                    Mail::to($users_info['email'])->send(new SendMail());
                }
                //上記までを追加・修正する
            }
        }
        ```
1. メール用のビューファイル設定
    1. アプリ名ディレクトリで下記コマンドを実行してビューファイルをメールで使用するためのクラス(Mailable)ファイルを用意する。

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

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

        ```アプリ名ディレクトリ/app/Mail/SendMail.php
        <?php
        
        namespace App\Mail;
        
        use Illuminate\Bus\Queueable;
        use Illuminate\Contracts\Queue\ShouldQueue;
        use Illuminate\Mail\Mailable;
        use Illuminate\Queue\SerializesModels;
        
        class SendMail 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->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 list
        ```
    1. 先のコマンドの出力の中に`app:send_mail_users`がある事を確認する。
    1. アプリ名ディレクトリで下記コマンドを実行してバッチ処理が正常に動作するか確認する。(実際にメールが送信されるため注意する！！！)

        ```terminal
        $ php artisan app:send_mail_users
        ```
    1. usersテーブルに登録されているメールアドレスの受信ボックスを確認し、下記の様なメールが届いていれば実装完了である。

        <img width="1471" alt="Test_Mail_-_shun_okawa_gmail_com_-_Gmail-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/51af76ae-5066-a064-e4c0-dcabc5d0835c.png">