1. Home
  2. PHP
  3. Laravel
  4. Laravel5.5のメール送信をMailgun API(無料)で行う~アカウント開設、DNS設定からMailableクラスでの送信まで~

Laravel5.5のメール送信をMailgun API(無料)で行う~アカウント開設、DNS設定からMailableクラスでの送信まで~

  • 公開日
  • 更新日
  • カテゴリ:Laravel
  • タグ:PHP,Laravel,Queues,Mail,SMTP,Mailgun,Mailable,API
Laravel5.5のメール送信をMailgun API(無料)で行う~アカウント開設、DNS設定からMailableクラスでの送信まで~

前回の記事 で Laravel5.5 の mailable クラスを使い、メール送信機能を実装しましたが、その時は、SMTP と PHP の mail関数を使ってのメール送信を行いました。

今回は、「Mailgun 」を使ってメール送信を行ってみたいと思います。

Contents

  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 件のメールが無料)

メール送信は、送れればなんでも良いわけではなく、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

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 では送信メールの追跡も行える(開封したかとか)ので、無料枠内で使えるのなら、非常におすすめです。

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

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

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級