Laravel 6.0 on Heroku mailgun アドオンでメール送信実装手順

Laravel 6.0では、3rdパーティのメール送信サービスMailgun, Postmark, Amazon SESが標準で選択できます。バージョンによっては、MandrillやSparkPostもサポートしていたようです。Transportのクラスは残っているので設定すれば使えるかもしれません。

一方、この記事を書いている2019年10月時点でHerokuアドオンとして利用可能なメールサービス(SMS含む)のラインナップは以下の通りです。

よって、Laravel 標準サポートで、Herokuのアドオンとして利用可能なサービスはMailgunのみとなります。

Mailgunは国内代理店は無いので、日本語でのサポートをが必用な場合はSendGridがおすすめですが、まずは標準で固められるMailgunを試してみたのでまとめてみました。

Heroku アドオン Mailgunの価格など詳細については以下のページを参照ください

Herokuアドオンの追加

以下のコマンドを実行してアプリケーションにmailgunアドオンを追加します。

$ heroku addons:create mailgun
Creating mailgun on ⬢ fathomlexs-fjord-78998... free Successfully created your Mailgun account. Happy Sending! Created mailgun-slippery-16984 as MAILGUN_API_KEY, MAILGUN_DOMAIN, MAILGUN_PUBLIC_KEY, MAILGUN_SMTP_LOGIN, MAILGUN_SMTP_PASSWORD, MAILGUN_SMTP_PORT, MAILGUN_SMTP_SERVER Use heroku addons:docs mailgun to view documentation

メッセージにあるように、環境変数がいくつか追加されます。

Laravelの設定では、MAILGUN_API_KEYとMAILGUN_DOMAINを利用します。

Sandboxドメインにメール受信者を追加する

以下のコマンドでmailgunのダッシュボードを表示します。

$ heroku addons:open mailgun
Opening https://addons-sso.heroku.com/apps/f837902b-xxxx-xxxx-xxxx-2df055125c03/addons/8785b37f-xxxx-7899-xxxx-e19aa3f27044...

左のメニューから[Sending] > [Domains]を開き、デフォルトで作成されているSandboxドメインをクリックして開きます。

右側の[Authorized Recipients]の[Email address]に受信者のメールアドレスを入力して[Save Recipient]をクリックします。

以下のように[Unverified]の状態で追加されます。

入力したメールアドレス宛に「Would you like to receive emails from Heroku Account on Mailgun?」というタイトルのメールが送信されるので[I Agree]をクリックします。

Confirm画面が表示されるので[Yes]をクリックします。

Successと表示されるとメールが受信できるようになります。

ページを閉じます。

参照: Authorized Recipients – Mailgun Help Center

ローカルでメールの送信を確認

メールドライバーの切替えとAPIキー、ドメインの設定

mailgunアドオンを追加すると、API_KEYやデフォルトで追加されたSandboxドメインの情報などが環境変数に追加されます。

以下のコマンドで、APIキーとSandboxドメインの値を取得して.envファイルにセットします。

Sandboxドメイン

$ heroku config:get MAILGUN_DOMAIN
sandbox982dfa228e9e4facaacf2caxxxxxxxxx.mailgun.org

APIキー

$ heroku config:get MAILGUN_API_KEY
ca6725468f3c6a732332edb26a67d3b9-xxxxxxxx-xxxxxxx

以下のように環境変数をセットします。

// .env
MAIL_DRIVER=mailgun
MAILGUN_DOMAIN=sandbox982dfa228e9e4facaacf2caxxxxxxxxx.mailgun.org
MAILGUN_SECRET=ca6725468f3c6a732332edb26a67d3b9-xxxxxxxx-xxxxxxx

メール送信の実装

テスト用にLaravelの標準の仕組みでメール送信を実装します。

公式おドキュメント「Mail – Laravel – The PHP Framework For Web Artisans」の例を参考に実装してみます。

mailgun ドライバーはSMTPではなくWeb APIを利用するのでguzzleをインストールする必用があります。

$ composer require guzzlehttp/guzzle

続いてテストメール送信用のコードを追加していきます。

Mailableクラスを生成します。

$ php artisan make:mail Test

生成された’App\Mail\OrderShipped’クラスのbuildメソッド以下のように修正します。

<?php

namespace App\Mail;

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

class Test extends Mailable
{
    use Queueable, SerializesModels;

    public function __construct()
    {
    }

    public function build()
    {
        return $this->view('emails.test');
    }
}

メール用のViewのフォルダーを作成

$ mkdir resources/views/emails

以下のようなViewを作成します。

// resources/views/emails/test.blade.php
<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
  </head>
  <body>This mail was sent with mailgun.</body>
</html>

メール送信の実行

Tinkerでメールを送信してみます。

$ php artisan tinker

以下のように実行するするとmailgunからメールが送信されます。

>>> \Mail::to('foo@example.com')->send(new App\Mail\Test());
=> null

以下のようなメールを受信できました。

Herokuからメールを送信

プロジェクトへの変更をherokuにデプロイします。

$ git add .
$ git commit -m "テストメール送信"
$ git push heroku master

環境変数のセット

$ heroku config:set MAIL_DRIVER=mailgun
$ heroku config:set MAILGUN_DOMAIN=`heroku config:get MAILGUN_DOMAIN`
$ heroku config:set MAILGUN_SECRET=`heroku config:get MAILGUN_API_KEY`

Heroku上でTinkerを起動し、テストメールを送信

$ heroku run php artisan tinker
Running php artisan tinker on ⬢ pure-beyond-20332... up, run.7028 (Free)
Psy Shell v0.9.9 (PHP 7.3.10 — cli) by Justin Hileman
>>> \Mail::to('foo@example.com')->send(new App\Mail\Test());

メールが受信できたら成功です。