Laravel 6.xでは、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());
メールが受信できたら成功です。