Laravelメール送信機能

## はじめに
今回も時間かかったLaravelでのメール送信機能を作ったのでそちらを記事に書いていこうと思います。
メール送信機能自体初めてで思ったより上手くいかなくて苦戦したので、これから導入する人の少しでも参考になれば幸いです。



※１ヶ月前くらいから少しづつLaravelの勉強を始めた初心者ですので間違ってる箇所、至らない点などあると思いますが、指摘して頂けると助かります
（こちらは前回の記事と同様にメモとして書いているのでフロント部分は簡易的なものになります）

### 使用する環境
- MacOS(M1)
- PHP　8.0.19 
- Laravel 9.19.0
- MySQL 8.0.29

## 前提条件
laravelのプロジェクトを作成しており、認証機能（ログインや会員登録）まで作成済
適当にコントローラーを作成済み
gmailの二段階認証の設定とアプリパスワードの発行済
参考：https://support.google.com/accounts/answer/185833?hl=ja

### .envファイルの設定
```
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=<送信元gmailのアドレス>  #gmailの場合、USERNAMEはFROM_ADDRESSと同じ
MAIL_PASSWORD=<発行したアプリパスワード>
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=<送信元gmailのアドレス>
MAIL_FROM_NAME=ECSiteSample   #メールの件名なので適宜
```


### ルーティングの作成

```web.php
Route::get('/mail_send', [ContentsController::class, 'mail_send'])->name('mail_send');
Route::post('/mail_send', [ContentsController::class, 'mail_send'])->name('mail_send');
```

### Laravelのmailableクラスの作成
```
$ php artisan make:mail MailNotification
```
### コントローラーに記述

```hogesController.php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Mail;//追加
use App\Mail\MailNotification;//追加
//コントローラーに追加
public function mail_send()
{
$data = [];
$contact_name = '山田太郎';
$contact_content = '何かありましたらお気軽に連絡ください';
$mail_text = $contact_name . '様、お問い合わせありがとうございました';
$mail_to = 'sample@example.com'//送信先として指定したいメールアドレス
Mail::to($mail_to)->send(new MailNotification($contact_name, $contact_content, $mail_text));//ここでMailNotificationに使いたい変数を渡している
    }
```
```MailNotification.php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class SampleNotification extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($contact_name, $contact_content, $mail_text) //先ほどのコントローラーで変数を渡す順でかないといけない
    {
        //
        $this->name = $contact_name;
        $this->content = $contact_content;
        $this->text = $mail_text;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
　　　　　　　　　　　　　　　　$mail_title = "メールのタイトル"
        $mail_name = $this->name;
        $mail_content = $this->content;
        $mail_text = $this->text;
        return $this
            ->view('email.sample_mail')//ここでメールの本文のviewを指定する
            ->subject($mail_title)//メールのタイトル
            //viewで使いたい変数を渡している
            ->with([
                'name' => $mail_name,
                'content' => $mail_content,
                'text' => $mail_text
            ]);
    }
}

```

### viewの作成
ここでメールの本文のレイアウトを作成していきます
自分の好きな形に適宜変えてください
```
$ touch resources/views/email/sample_mail.blade.php
```

```sample_mail.blade.php
<!DOCTYPE html>
<html lang="ja">
<style>
    body {
        background-color: #fffacd;
    }

    h1 {
        font-size: 16px;
        color: #ff6666;
    }
</style>


<body>
    <p>{{ $name }}</p>
    <p>{{ $text }}</p><br>
    <p>{{ $content}}</p>
</body>

</html>
```
あとはURLを/mail_sendで叩いたらsample@example.com（先ほど指定したメールアドレス）にメールが送信されます

## 最後に
また他の機能などを出来次第どんどん更新していこうと思っています（ゆくゆくは１つのWebアプリケーションのチュートリアル的なのにしていけたらなって思っています）
また今回の記事も機能の概要だけ知って頂きたく、また自分用のメモとして残しているのでフロントはとても簡素なものになっている点申し訳ありません
間違ってる事などありましたら教えて頂けると助かります