Laravelでmailgunを使いメール送信してみる

# mailgunアカウント登録
mailgunのAPIを使うにはアカウント登録が必要です。
[公式ページ](https://www.mailgun.com/)にアクセスし「Start Sending」をクリックしてください。

![20200807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644759/57ec35a6-ab27-201e-6634-36fa96820b3c.png)

アカウント登録ページが表示されます。
必要情報を入力してください。
「Add payment info now」のチェックを外しておけば、クレジットカード情報は入力しなくて済みます。
※後から有償版に切り替えたい場合は、ダッシュボードの「Account Settings」>「Billing plan」から切り替えることができます。

![20200807_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644759/86d493a6-32d8-5965-ff29-5fc1638fae67.png)


アカウントを登録すると、公式からメールが2通届きます。
「Hi [登録者名], please verify your Mailgun account」のメールの方に記載されているURLをクリックしてメール認証を行います。

![20200807_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644759/20dfba87-d903-97f6-b86c-83a4101a27ce.png)

次に認証コードの登録を行います。
画像をなくしてしまったのですが、メール認証を行うと携帯番号を入力する画面が表示され、電話番号の入力を求められます。番号を入力して認証コードの送信依頼を行うと、番号を入力した端末に認証コードが送信されます。
送信された認証コードを、「Verlflcation Code」に入力して「Validate」を押してください。

![20200807_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644759/26cb8291-080a-3de0-dac5-7aaa22b45568.png)

認証に成功してダッシュボード画面が表示されればアカウント登録は完了です。

![20200807_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644759/af438c8e-ed2f-e65c-85a2-c0e63c69a29f.png)

# Laravelの下準備
### Guzzle HTTPライブラリを入れる

以下のコマンドを実行します。

```
composer require guzzlehttp/guzzle
```

### .envファイルに設定を記述
#### ドメインの確認
ダッシュボード画面から「Sending」>「Domains」をクリックします。
「Name」以下に表示されているものがドメインとなります。

![20200807_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644759/6222aabb-ca54-75b5-b610-f2b44086de8c.png)

#### API keyの確認
「Name」のドメインをクリックし、APIの「Select」>「cURL」をクリックするとAPI keyを確認することができます。

![20200807_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644759/6f3a2c7c-71f1-fc89-7e9c-29c1bfb18beb.png)

#### .envに記述

- MAIL_DRIVER
    - `mailgun`と記述します
-  MAILGUN_DOMAIN
    - ドメインを記述します
-   MAILGUN_SECRET
    - API keyを記述します

※API keyやドメインをコピペするときに、最後に半角スペースなどが入らないように気を付けてください。

```
MAIL_DRIVER=mailgun
MAILGUN_DOMAIN=YOUR_MAILGUN_DOMAIN
MAILGUN_SECRET=YOUR_SECRET_KEY
```

これでLaravelの設定は完了です。

# メール受信設定
ダッシュボード画面から「Sending」>「Domains」をクリックし、「Authorized Recipients」の「Email address」に受信するメールアドレスを入力して「Save Recipient」を押します。

![20200814_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644759/17e5241f-dd8f-8a4d-2540-19bc68f11e1e.png)


入力したメールアドレス宛に「Would you like to receive emails from sankosc on Mailgun?」というタイトルのメールが届くので、「I Agree 」を押します。

![20200814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644759/07cbdab4-5507-d37d-0010-08b624a2993f.png)

Confirm画面が表示されるので「Yes」を押します。

![20200814_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644759/6ac7ba48-d5e9-64c4-cd66-cd3f3e72a3b1.png)


Successと表示されれば受信設定は完了です。

![20200814_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644759/4a7be343-9840-2d1a-9f3c-4884845fcd77.png)


# メール送信
### 実装

以下のコマンドを実行します。

```
php artisan make:mail MailgunTest
```

`app/Mail`以下に生成された`MailgunTest.php`を編集していきます。

```php
<?php

namespace App\Mail;

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

class MailgunTest 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.mail')
        ->text('mails.mail')
        ->subject('タイトル')
        ->with([
            'text' => '本文',
          ]);
    }
}

```

`build`メソッド内でメールテンプレートとなるviewファイルに、メールのタイトルと本文を記述しています。

次に`resources/views`以下にmailsフォルダを作成し、`mail.blade.php`ファイルを追加して以下のように編集します。

```php
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
  </head>
  <body>{{$text}}</body>
</html>
```

### 送信テスト
tinkerから送信テストをしてみます。

```
php artisan tinker
```

```
Psy Shell v0.10.4 (PHP 7.2.15 — cli) by Justin Hileman
>>> \Mail::to('送信先アドレス')->send(new App\Mail\MailgunTest());
=> null
```

メールが届きました。

![20200817.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644759/31136df0-5700-f1ae-b652-90291d21ea31.png)