laravel6 htmlメールとtextメール両方送信できるようにする

# 目的

- htmlメールとtextメールをどちらか一つ、または両方を送信する方法をまとめる

# 条件

- 下記のどちらかの記事の内容の実装が完了していることを確認する。筆者は「laravel6 ファイル添付できるメール送信機能を作成する」のあとに本記事で紹介している作業を実施した。
    - [laravel6 メール送信機能を作成する](https://qiita.com/miriwo/items/aa6b4de7fc548f3b1f8c)
    - [laravel6 ファイル添付できるメール送信機能を作成する](https://qiita.com/miriwo/items/1fe36c37b0ad9ade46b1)

# 情報

- 筆者はMacに直接作成したlaravelのローカル開発環境で本記事に記載したソースの検証を行っている。
- 筆者の環境ではメールの受信確認はMailCatcherを用いて行う。
- メール送信相手のアドレスは「test@example」とする。
- メール送信者のアドレスは「app@example」とする。
- 特筆しない限り実行しているコマンドは前のコマンドと同じディレクトリで実行するものとする。
- 下記の記事で実装したメールをhtmlメールとtextメール両方送信するように修正する。
    - [laravel6 メール送信機能を作成する](https://qiita.com/miriwo/items/aa6b4de7fc548f3b1f8c)

# 概要

1. コントローラファイルの修正
1. メールクラスの修正
1. htmlメールのテンプレート追加
1. 確認

# 詳細

1. コントローラファイルの修正
    1. NoticeController.phpを開き、下記のように修正する。

        ```アプリ名ディレクトリ/app/Http/Controllers/NoticeController.php
        <?php
        
        namespace App\Http\Controllers;
        
        use Illuminate\Http\Request;
        use App\Http\Requests\MailRequest;
        use Illuminate\Support\Facades\Mail;
        use App\Mail\AppMail;
        use App\Services\MailAttachmentService;
        
        class NoticeController extends Controller
        {
            /**
             * @var MailAttachmentService
             */
            private $mailAttachmentService;
        
            public function __construct(MailAttachmentService $mailAttachmentService)
            {
                $this->mailAttachmentService = $mailAttachmentService;
            }
        
            public function index()
            {
                return view('notices.index');
            }
        
            public function mailMake()
            {
                return view('notices.mails.make');
            }
        
            public function mailConfirm(MailRequest $mailRequest)
            {
                $postData = $mailRequest->all();
                
                if (isset($postData['file'])) {
                    $postData['putFileInfo'] = $this->mailAttachmentService->saveFile($postData['file']);
                }
        
                $viewData = [
                    'postData' => $postData
                ];
        
                return view('notices.mails.confirm', ['viewData' => $viewData]);
            }
        
            public function mailSend(Request $request)
            {
                // 下記を追記
                $mailInfo = [
                    'htmlTemplate' => 'mail_templates.html_mail',
                    'textTemplate' => 'mail_templates.text_mail',
                ];
                // 上記までを追記
                $postData = $request->all();
                // 下記を修正
                Mail::to('test@example')->send(new AppMail($postData, $mailInfo));
                return redirect(route('notice.index'));
            }
        }
        ```

1. メールクラスの修正
    1. AppMail.phpを開き、下記のように修正する。

        ```アプリ名ディレクトリ/app/Mail/AppMail.php
        <?php
        
        namespace App\Mail;
        
        use Illuminate\Bus\Queueable;
        use Illuminate\Contracts\Queue\ShouldQueue;
        use Illuminate\Mail\Mailable;
        use Illuminate\Queue\SerializesModels;
        
        class AppMail extends Mailable
        {
            use Queueable, SerializesModels;
        
            /**
             * メール送信引数
             *
             * @var array
             */
            private $postData;
        
            /**
             * Create a new message instance.
             *
             * @return void
             */
            // 下記を修正
            public function __construct($postData, $mailInfo)
            {
                $this->postData = $postData;
                // 下記を修正
                $this->mailInfo = $mailInfo;
            }
        
            /**
             * Build the message.
             *
             * @return $this
             */
            public function build()
            {
                // 下記を修正
                // デフォルト処理、fromメールアドレス、件名、テキストメールのテンプレートの設定
                $mail = $this->from('app@example')->subject($this->postData['subject'])->text($this->mailInfo['textTemplate'], ['postData' => $this->postData]);
        
                if (isset($this->postData['filePath'])) {
                    // 添付ファイルが有るときに実行
                    $mail->attachFromStorage($this->postData['filePath'], mb_encode_mimeheader($this->postData['fileName']));
                }
        
                if (isset($this->mailInfo['htmlTemplate'])) {
                    // htmlメールも同時に送信するとき
                    $mail->view($this->mailInfo['htmlTemplate'], ['postData' => $this->postData]);
                }
        
                return $mail;
                // 上記までを修正する。
            }
        }
        ```

1. htmlメールのテンプレート追加
    1. 下記コマンドを実行してhtmlメールのテンプレートを作成して開く。

        ```terminal
        $ vi resources/views/mail_templates/html_mail.blade.php
        ```

    1. 開いたファイルに下記の内容を記載する。

        ```アプリ名ディレクトリ/resources/views/mail_templates/html_mail.blade.php
        {!! nl2br(e($postData['content'])) !!}
        
        <h1>Foo</h1>
        ```

1. 確認
    1. 下記コマンドを実行してローカルサーバを起動する。

        ```terminal
        $ php artisan serve
        ```

    1. 下記にアクセスする。
        - [http://127.0.0.1:8000/notice](http://127.0.0.1:8000/notice)
    1. 件名と内容に任意の内容を入力して「確認」をクリックする。遷移先のページで「送信」をクリックしてメールを送信する。

        ![Laravel-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6774778a-1baa-a6fe-c859-e98c0e93c893.png)

    1. 受信したメールを確認する。
    1. MailCatcherで確認する場合「HTML」のタブを開いたときにメール内容の末尾にh1要素で「Foo」と表示されることを確認する。

        ![MailCatcher__24_-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1e3cfb5c-174c-bcbf-ba4a-3c846fbbce87.png)

    1. 「Plain Text」のタブを開いたときメールの内容がそのまま表示されることを確認する。

        ![MailCatcher__24_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b8dae932-1692-b045-3d9b-4d721a3b7c79.png)