Laravel 7 バッチ処理でusersテーブルのメールアドレスにメールを送る

# 目的

- Authで実装した認証機能で使用する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を実装する(超初歩)](https://qiita.com/miriwo/items/1ab9d01744417a272e67)

# 概要

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;
        //上記までを追加する

        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::raw("これはテストメールです", function($message) use ($users_info)
                    {
                        $message->to($users_info->email)->subject('test');
                    });
                }
                //上記までを追加・修正する
            }
        }
        ```
1. 確認
    1. アプリ名ディレクトリで下記コマンドを実行してコマンドが追加されている事を確認する。

        ```terminal
        $ php artisan list
        ```
    1. 先のコマンドの出力の中に`app:send_mail_users`がある事を確認する。
    1. アプリ名ディレクトリで下記コマンドを実行してバッチ処理が正常に動作するか確認する。(実際にメールが送信されるため注意する！！！)

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

        <img width="1444" alt="test_-_shun_okawa_gmail_com_-_Gmail.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/2c9d589e-5625-1966-8191-0a0b3d3396b5.png">