Laravel5.5のメール送信をMailgun API(無料)で行う~アカウント開設、DNS設定からMailableクラスでの送信まで~
- 公開:
- カテゴリ: PHP Laravel
- タグ: PHP,Laravel,composer,5.5,Queues,Mail,SMTP,Mailgun,Mailable,API
前回の記事でLaravel5.5のmailableクラスを使い、メール送信機能を実装しましたが、その時は、SMTPとPHPのmail関数を使ってのメール送信を行いました。
今回は、「Mailgun」を使ってメール送信を行ってみたいと思います。
- アジェンダ
デモ環境と準備
- linux CentOS 7
- Apache 2.4
- PHP 7.1
- Laravel 5.5
上記環境でなくても再現は可能ですが、途中linuxコンソールを叩く場面があります。
そして、操作を行えるドメインが一つ必要です。
Mailgunとは
Mailgun(メールガン)は、APIベースのメール配信サービスです。
- Mailgun
- https://www.mailgun.com/
メールの送信から受信、追跡(トラッキング・分析)までを行える非常に高機能なメール配信サービスです。
ただし、開発者向けの電子メールサービスを謳っており、便利な反面、一般人では扱えないという面もあります。いわゆる、私たちのようなエンジニア向けに完全に絞ったサービスという事です。
そんなMailgunですが、毎月10,000通までのメール送信が無料で使えます。 個人で使うには十分ですね。
ちなみにMailgunは、Google Cloud PlatformのCompute Engineのサードパーティメールサービスとしても提供されており、メール配信サービスとしてもとてもメジャーです。(その場合は毎月30,000件のメールが無料)
- Google Cloud Platform - Compute Engine / Mailgun
- https://cloud.google.com/compute/docs/tutorials/sending-mail/using-mailgun?hl=ja
メール送信は、送れればなんでも良いわけではなく、PHPのmail関数での送信ではどこかのタイミングで迷惑メール扱いになってしまう可能性がありますし、SMTPは悪くはありませんが、もう少し高速に(処理も到達も)動作させたい…。
そんな時は「Mailgun」というわけです。メールもすぐに届きます。
しかもそれをLaravelではとても簡単に扱えるので、使わない手はありません。
Mailgunを使うには「ドメインを所有している事」だけ達成していれば後は問題ありません。DNS設定の件もありますが、それはこの記事を読んでいただければ難しくないと思います。
Mailgunのアカウント作成
まずは、Mailgunのアカウントを作成しましょう。
Mailgunのオフィシャルサイトへアクセスします。
「Try Mailgun Now」をクリックします。
登録画面
登録画面に遷移したら、必要項目を埋めていきます。
- Company/Account name
- 任意のアカウント名を入力します。
- Estimated Monthly Volume
- 無料範囲で使うので「Less than 10,000」を選択します。
- Your name
- あなたの名前を入力します。
- Work email
- あなたの認証・連絡用のメールアドレスを入力します。
- Password
- 任意のパスワードを入力します。
- Confirm password
- パスワードを再度入力します。
- Add payment info now (optional)
- クレジットカード情報を入力するかのチェックです。入力しないのでチェックは外します。
「私はロボットではありません」にチェックを入れ、「Create Account」をクリックします。
Mailgunアカウントの確認
登録を済ませるとページ遷移しますが、そのページそれはひとまずそのまま置いておいて、まずはアカウントの確認を済ませましょう。
メールアドレスに確認メールが届いているので確認します。
メール本文のリンクをクリックします。
電話番号を入力する画面へ遷移するので、入力します。
ページ遷移後、SMSで確認コードが届くので、入力します。
ここまで行うとようやくダッシュボードに遷移します。これでアカウント確認は完了です。
以上でアカウントの作成が完了となります。
サンドボックスモードでテスト送信
アカウント作成が完了すると、テストでメール送信を行う事が出来るので試してみます。
アカウント作成後に遷移するこの画面
赤枠の部分にテスト用コードが表示されています。
テスト用コードを使うと、サンドボックスモードでお試し送信が行え、一切の設定・下準備無しで送信をテストする事が出来ます。
サンドボックスサーバーから許可された受信者(アカウント作成時に登録したメールアドレス)にのみ最大300件の電子メールを送信できます。
「Curl」「Ruby」「Python」「PHP」「Java」「C#」 から選べますが、linuxコンソールから「Curl」でテスト送信を行います。
# サンドボックスモードでデモ送信を行う
curl -s --user 'api:key-yhripbmcx3vvpxbnsgtauanfawhvz3k5r7rd92cc' \
https://api.mailgun.net/v3/sandboxyhripbmcx3vvpxbnsgtauanfawhvz3k5r7rd92cc.mailgun.org/messages \
-F from='Mailgun Sandbox <postmaster@sandboxyhripbmcx3vvpxbnsgtauanfawhvz3k5r7rd92cc.mailgun.org>' \
-F to='rito <rito@rito.net>' \
-F subject='Hello rito' \
-F text='Congratulations rito, you just sent an email with Mailgun! You are truly awesome!'
# 実行結果
[demo@localhost ~]$ curl -s --user 'api:key-yhripbmcx3vvpxbnsgtauanfawhvz3k5r7rd92cc' \
> https://api.mailgun.net/v3/sandboxyhripbmcx3vvpxbnsgtauanfawhvz3k5r7rd92cc.mailgun.org/messages \
> -F from='Mailgun Sandbox <postmaster@sandboxyhripbmcx3vvpxbnsgtauanfawhvz3k5r7rd92cc.mailgun.org>' \
> -F to='rito <rito@rito.net>' \
> -F subject='Hello rito' \
> -F text='Congratulations rito, you just sent an email with Mailgun! You are truly awesome!'
{
"id": "<20171127123301.82639.yhripbmcx3vvpxbn@sandboxrito@rito.net.mailgun.org>",
"message": "Queued. Thank you."
メールボックスを確認してみると、
きちんとメールが届きましたね。
ドメインを設定する
Mailgunを使ってメールを送信するには、自身のドメインをMailgunの管理画面から設定する必要があります。
テストコードの下の「2. Now Add Your Own Domain」から、ドメイン設定画面に遷移します。
ドメインを入力し、「Add Domain」をクリックします。
尚、Mailgunでは、サブドメイン付きでのドメイン設定を推奨しています。
"mg.mydomain.com"のようにMailgunにサブドメインを使用することをお勧めします。 サブドメインを使用すると、ルートドメインからメールを送信することができます。 "you@mydomain.com"
との事なので、ひとまずはそのようにしておきます。
ドメインの追加が完了すると、DNS設定の説明ページに遷移するので、それを参考にして、ドメイン管理プロパイダから設定を行っていきます。
DNS設定
ここからは、ドメインの管理画面からDNS設定を行っていきます。
今回のデモでは、お名前.comでの設定を行います。
ログイン後、ドメイン設定から「DNS関連機能の設定」をクリック
「内部ドメイン一覧」からドメインを選択し、「次へ進む」をクリック
「DNSレコード設定を利用する」を選択します。
ページ遷移したら、5つの設定を行います。 TXTレコードを2つ、MXレコードを2つ、そしてCNAMEを1つ登録します。
CNAMEレコード
- ホスト名
- email.mg.laravel55-practice.com
- TYPE
- CNAME
- TTL
- 3600
- VALUE
- mailgun.org
MXレコード
- ホスト名
- mg.laravel55-practice.com
- TYPE
- MX
- TTL
- 3600
- VALUE
- mxa.mailgun.org
- 優先
- 10
- ホスト名
- mg.laravel55-practice.com
- TYPE
- MX
- TTL
- 3600
- VALUE
- mxb.mailgun.org
- 優先
- 10
TXTレコード
- ホスト名
- mailo._domainkey.mg.laravel55-practice.com
- TYPE
- TXT
- TTL
- 3600
- VALUE
- k=rsa; p=記載されている値
- ホスト名
- mg.laravel55-practice.com
- TYPE
- TXT
- TTL
- 3600
- VALUE
- v=spf1 include:mailgun.org ~all
最終的に以下のようになります。
DNS検証を行う
DNS設定が完了したら、Mailgunの管理画面に戻って設定検証を行います。
DNS設定説明ページの最下部にある「4. Wait For Your Domain To Verify」の「Continue To Domain Overview」をクリックします。
Once you've added the appropriate DNS records for verification, it can take 24-48 hours for them to propagate.
確認のために適切なDNSレコードを追加すると、DNSレコードが浸透するまでに24~48時間かかることがあります。
と書かれてはいますが、今回のデモではおよそ5分程度で浸透しましたので、状況によりけりです。
ちなみに今回の検証の場合は5分程度で確認が完了しました。
DNS検証が完了すると、メールで通知されます。
これでDNS検証は完了です。
おつかれさまでした。以上でMailgun側の全ての設定が完了しました。
LaravelにMailgunを導入する
いよいよLaravel側にMailgunを導入していきます。
Guzzle HTTPライブラリの導入
まずは、必要なライブラリを導入します。
Mailgunに限らず、LaravelでAPIドライバを使用する際はGuzzle HTTPライブラリが必要になるので、composerでインストールします。
laravelルートディレクトリへ移動し、以下のコマンドを叩きます。
# laravelルートディレクトリへ移動
cd /path/to/laravel
# Guzzle HTTPライブラリのインストール
composer require guzzlehttp/guzzle
# 実行結果
[demo@localhost laravel]# composer require guzzlehttp/guzzle
Using version ^6.3 for guzzlehttp/guzzle
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: laravel/socialite
Package manifest generated successfully.
laravel/composer.jsonを開いて確認を行います。
"require": {
"php": ">=7.0.0",
"doctrine/dbal": "^2.6",
"fideloper/proxy": "~3.3",
"guzzlehttp/guzzle": "^6.3", // ← ココ
"laravel/framework": "5.5.*",
"laravel/socialite": "^3.0",
"laravel/tinker": "~1.0"
},
Guzzle HTTPライブラリが追加されている事を確認できました。
Mailgunドライバへの変更と各種設定
次に、ドライバ変更含め設定を行っていきます。
ちなみに、メール設定に関しては
laravel/config/mail.php
laravel/config/service.php
にあるのですが、各項目に関しては全て.envファイルで置き換えられているので、
laravel/.env
を開いて、以下を記述します。
MAIL_FROM_ADDRESS=notif@laravel55-practice.com
MAIL_FROM_NAME=LaravelSampler
MAIL_DRIVER=mailgun
MAIL_USERNAME=postmaster@mg.laravel55-practice.com ①
MAIL_PASSWORD=hnzgh9yv377igeaf7chq2j9qj2kffzbq ②
MAILGUN_DOMAIN=mg.laravel55-practice.com ③
MAILGUN_SECRET=key-tfwtjkudarvm6dwf4h6mzk4xvmne9gb5 ④
Mailgunの設定は以上で完了です。
メール送信と動作確認
それでは実際にメールを送信して動作確認を行います。
Laravel5.5のMailableクラスを使っての送信に関しては、前回の記事
laravel5.5のmailableクラスでメール送信を行う[導入/入門編]
を参考にして構築してください。
「どのメールドライバを使って送信するのか」を気にする必要がなく機能実装が行えるのも、LaravelをはじめとしたPHPフレームワークの良いところですので、今回のドライバ設定のままであれば、前回の記事の通りに送信クラスを実装してももちろん問題がありません。
Mailgunからメールが配送されました。しかも、SMTPよりも断然早いです。
まとめ
以上で作業は完了です。
Larvelの公式ドキュメントでも「SMTP使うならAPIドライバで送信した方がおすすめだよ」と言っている通り、配送も早いのでとても使い勝手が良いと思います。
また、Mailgunでは送信メールの追跡も行える(開封したかとか)ので、無料枠内で使えるのなら、非常におすすめです。
なにより自分でメールサーバを持たなくても良いのがいいですよね。
無料より安いものはないので、是非試してみてください。