RitoLabo

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」を使ってメール送信を行ってみたいと思います。

アジェンダ
  1. デモ環境と準備
  2. Mailgunとは
  3. Mailgunのアカウント作成
    1. 登録画面
    2. Mailgunアカウントの確認
  4. サンドボックスモードでテスト送信
  5. ドメインを設定する
  6. DNS設定
    1. CNAMEレコード
    2. MXレコード
    3. TXTレコード
  7. DNS検証を行う
  8. LaravelにMailgunを導入する
    1. Guzzle HTTPライブラリの導入
    2. Mailgunドライバへの変更と各種設定
  9. メール送信と動作確認

デモ環境と準備

  • 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のオフィシャルサイトへアクセスします。

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の管理画面から設定する必要があります。

「NowAddYourOwnDomain」をクリック

テストコードの下の「2. Now Add Your Own Domain」から、ドメイン設定画面に遷移します。

「AddDomain」をクリック

ドメインを入力し、「Add Domain」をクリックします。

尚、Mailgunでは、サブドメイン付きでのドメイン設定を推奨しています。

"mg.mydomain.com"のようにMailgunにサブドメインを使用することをお勧めします。 サブドメインを使用すると、ルートドメインからメールを送信することができます。 "you@mydomain.com"

との事なので、ひとまずはそのようにしておきます。

ドメインの追加が完了すると、DNS設定の説明ページに遷移するので、それを参考にして、ドメイン管理プロパイダから設定を行っていきます。

DNS設定の説明ページ

DNS設定

ここからは、ドメインの管理画面からDNS設定を行っていきます。

今回のデモでは、お名前.comでの設定を行います。

「DNS関連機能の設定」をクリック

ログイン後、ドメイン設定から「DNS関連機能の設定」をクリック

内部ドメイン一覧

「内部ドメイン一覧」からドメインを選択し、「次へ進む」をクリック

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」をクリックします。

「ContinueToDomainOverview」をクリック

Once you've added the appropriate DNS records for verification, it can take 24-48 hours for them to propagate.

Unverified

確認のために適切なDNSレコードを追加すると、DNSレコードが浸透するまでに24~48時間かかることがあります。

と書かれてはいますが、今回のデモではおよそ5分程度で浸透しましたので、状況によりけりです。

ちなみに今回の検証の場合は5分程度で確認が完了しました。

Active

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

DomainInformation

Mailgunの設定は以上で完了です。

メール送信と動作確認

それでは実際にメールを送信して動作確認を行います。

Laravel5.5のMailableクラスを使っての送信に関しては、前回の記事
laravel5.5のmailableクラスでメール送信を行う[導入/入門編]

を参考にして構築してください。

「どのメールドライバを使って送信するのか」を気にする必要がなく機能実装が行えるのも、LaravelをはじめとしたPHPフレームワークの良いところですので、今回のドライバ設定のままであれば、前回の記事の通りに送信クラスを実装してももちろん問題がありません。

メール配送画面

Mailgunからメールが配送されました。しかも、SMTPよりも断然早いです。

まとめ

以上で作業は完了です。
Larvelの公式ドキュメントでも「SMTP使うならAPIドライバで送信した方がおすすめだよ」と言っている通り、配送も早いのでとても使い勝手が良いと思います。

また、Mailgunでは送信メールの追跡も行える(開封したかとか)ので、無料枠内で使えるのなら、非常におすすめです。

なにより自分でメールサーバを持たなくても良いのがいいですよね。

無料より安いものはないので、是非試してみてください。