laravelでのメール通知実装（SendGridAPI）

laravelでお問い合わせフォームを作成し、入力された内容をメールに通知する必要があったので、そこで学習したことを残しておきます。(WebAPI経由)

##SendGrid APIKeyの取得
まずは[SendGrid](https://sendgrid.kke.co.jp/)のアカウントを作成する。
APIキーを発行する。発行ページがなかなかわかりづらいが、マイページの左側のメニューバーのSettings内にある。

<img width="175" alt="スクリーンショット 2020-01-21 18.51.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503633/61d36af1-e09a-be57-61e7-da92905890c1.png">

「CreateAPIKey」をクリックし、下記の画面に移ったら、APIキーに名前をつける。ここでは"laravel"。メールを送るだけなので、API Key Permissionsは Restrictedにしておく。
<img width="943" alt="スクリーンショット 2020-01-21 18.54.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503633/0d6a0554-e433-4df9-5431-10e4441747a2.png">

ここもメールを送るだけならMail Sendのみで良い。Create&Viewへ。

<img width="938" alt="スクリーンショット 2020-01-21 18.55.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503633/39b62c13-407c-18dd-77f9-29b3ac8c4831.png">

APIKeyが表示されるはず。クリックするだけでコピー可能。一度しか表示されないのでコピーを忘れずに。

<img width="955" alt="スクリーンショット 2020-01-21 18.55.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503633/b9d3bba3-ec6b-099c-fba1-20372c2410e1.png">



envファイルにAPIキー、メールドライバ（ここではSendGrid）、Fromアドレス、From名を記述する。
デフォルトではSendGridをドライバーに指定できないが、パッケージを作ってくださった方がいるので、composerを使ってインストール。
[ありがたいドライバー様](https://packagist.org/packages/s-ichikawa/laravel-sendgrid-driver)（問題あれば消します。）

```
MAIL_DRIVER=sendgrid
SENDGRID_API_KEY='コピーしたAPIKey'
MAIL_FROM_ADDRESS=送信元メールアドレス
MAIL_FROM_NAME="送信元の名前"
```

##mailable作成
いよいよ実装部分。Mailableクラスを作成する。
``php artisan make:mail SendGridSample``
App/Mail/SendGridSampleというファイルができる。これを編集する
（忘れずに先ほどのありがたいドライバー様のuseも記述しておく。）
buildメソッドを作り、その中に処理を書いていく。

fromはenvファイルに書いているのでここに書かなくても良い。


```SendGridSample.php

<?php

namespace App\Mail;

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

class SendGridSample extends Mailable
{
    use SendGrid;

    /**
     * Create a new message instance.
     *
     * @return void
     */
     // 引数で受け取ったデータ用の変数
     protected $contact;

    public function __construct($contact)
    {
        // 引数で受け取ったデータを変数にセット
        $this -> contact = $contact;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this
        ->view('emails.email') //呼び出すテンプレートを指定
        ->subject('お問い合わせ内容確認') //件名
        ->with(['contact' => $this -> contact]) //withオプションでセットしたデータをテンプレートに渡す
        ]);
    }
}



```


service.phpファイルに、envのSENDGRID_API_KEYの使用を記述する。

```service.php
[  
    'sendgrid' => [
      'api_key' => env('SENDGRID_API_KEY')
   ]
];
```

##メールテンプレート作成
お名前、メールアドレス、受信したお問い合わせ内容を返す簡単なもの。

```html

  <div class="row">
    <h1>お問い合わせ内容を受け付けました。</h1>
  </div>

<br>
・お名前<br>
{{ $contact['name'] }}様<br>
<br>
・メールアドレス<br>
{{ $contact['email'] }}<br>
<br>
・お問い合わせ内容<br>
{!! nl2br(e($contact['post'])) !!}<br>

  <div class="row">
    <p>お問い合わせありがとうございました。</p>
  </div>

```

##ContactControllerを編集

```ContactController.php
<?php

// 作成したメールクラスをuseする
use Illuminate\Support\Facades\Mail;
use Sichikawa\LaravelSendgridDriver\SendGrid;



    public function send(Request $request)
    {
        \Mail::to($request -> email)
        ->send(new SendGridSample($request));
     
    }

```


これでお問い合わせ完了メールを送ることができる。