Inbound Parse WebhookとPHPを使った 返信可能なメールの作成

Inbound Parse WebhookとPHPを使った返信可能なメールの作成

SendGridサポートチームの青木です。

皆さん、noreply@example.comのようなアドレスからメールを受け取ったことはありますでしょうか。このようなアドレスからのメールに対しては、多くの場合、文字通り返信はできないのではないかと思ってしまいます。

返信不可のメールを送るのは、一方的なコミュニケーションとなるため、メール購読者と送信者の双方にとって好ましくありません。

返信不可メールが望まれない理由の詳細は、こちらの記事で紹介しています!

可能であれば、メールは返信できるようにしておきましょう。SendGridにはメールを受信するためのInbound Parse Webhookという機能があります。この機能を利用するともし返信があったときにも受け取ることが可能です!

今回は、Twilioのブログ「Create Transactional Emails you can Reply to in PHP with Twilio SendGrid Inbound Parse」で取り上げられた、Inbound Parse Webhookを使った返信可能なトランザクションメールの作成方法について紹介します!

今回実装する機能について

Inbound Parse Webhookは、指定したドメインに送られてきたメールをSendGridが受信して、その内容を指定したURLへPOSTする機能です。今回は、ユーザからの返信をInbound Parse Webhookで受信して、自動的に返信する機能を実装します。
構築する機能の詳細を下の図に示します。

ユーザからの返信をInbound Parse Webhookで受信して、自動的に返信する機能

  1. Email.phpを実行し、SendGridへメール送信をリクエストする
  2. 本文に「#Another one」と書いて、ユーザがメールを返信する
  3. Inbound Parse WebhookのエンドポイントURLにPOSTされたメールの内容をWebhook.phpで受け、返信メールを構築して送信リクエストする
  4. ユーザがメールを受信する

必要なもの

SendGridはFreeプランのアカウントで構いません。
私の開発環境では、PHP (7.3.11)とComposer (2.0.13)、ngrok (2.3.35)を使いました。

手順

Step 1: 開発環境の構築

開発用ディレクトリを作成し、ディレクトリ内に次の3つのファイルを追加します。

  • Webhook.php
  • Email.php
  • .env

以下のコマンドを実行してください。

$ mkdir SendGrid && cd SendGrid
$ touch Webhook.php Email.php .env

Step 2: 依存関係の解決

開発用ディレクトリに移動し、次の2つの依存ソフトウェアをComposerでインストールします。

実行するコマンドは以下の通りです。

$ composer require vlucas/phpdotenv sendgrid/sendgrid

Step 3: SendGrid APIキーの作成

SendGridのダッシュボードに移動し、APIキーを作成しましょう。
作成するAPIキーの権限は、Inbound ParseとMail SendのみFull Accessで十分です。.envファイルに以下の通り入力し、環境変数としてAPIキーを設定してください。

SENDGRID_API_KEY=”INSERT YOUR API KEY HERE"

Step 4: メール送信用コードの準備

Email.phpに以下のコードを入力してください。

<?php
require 'vendor/autoload.php';

// Load our `.env` variables
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

// Declare a new SendGrid Mail object
$email = new \SendGrid\Mail\Mail();

// Set the email parameters
$email->setFrom("sales@yourdomain", "Daisuke Aoki");
$email->setSubject("Order #456557");
$email->addTo("customer@example.com", "Daisuke Aoki");
$email->addContent("text/plain", "Thank you for the purchase! If you need to
make another order of this item, respond to this email with the text ‘#Another one’.");

$sendgrid = new \SendGrid($_ENV['SENDGRID_API_KEY']);

// Send the email
try {

  $response = $sendgrid->send($email);
   print $response->statusCode() . "\n";
   print_r($response->headers());
   print $response->body() . "\n";
   echo "email sent!\n";

} catch (Exception $e) {
   echo 'Caught exception: '. $e->getMessage() ."\n";
}

Email.phpを実行すると、商品の注文確認のメールが、14行目のaddToで指定した宛先に届きます。12行目のsetFromの送信元アドレスには、Inbound Parse Webhookを設定したドメインを使います。

Step 5: Inbound Parse Webhookの設定

Inbound Parse Webhookを設定することで、指定したドメインでメールを受信し、受信したメールの内容をお好きなURLにPOSTすることが可能となります。まずは、ngrokを使って、メールのPOST先となるURLを作成しましょう。

ngrokを使うことにより、手元の環境でInbound Parse Webhookの動作確認を行うことができます。

コンソール画面上で次のコマンドを実行してください。

$ php -S localhost:3000

新しいコンソール画面を開き、次のコマンドを実行してください。

$ ngrok http 3000

ngrokコマンドの実行結果として、以下のようなURLが表示されるはずです。

https://XXXXXXXXXXXX.ngrok.io

ngrokのURLの最後に/webhook.phpを付け足したものを、POST先URLとします。

https://XXXXXXXXXXXX.ngrok.io/webhook.php

Inbound Parse Webhookの設定内容は以下の通りです。

設定方法の詳細については、チュートリアルもしくはブログ記事をご覧ください。使用するドメインのDomain AuthenticationMXレコードの設定をお忘れなく!

Inbound Parse Webhookの設定

Step 6: メール返信用コードの準備

前のステップでInbound Parse Webhookの設定が完了したので、POSTされるメールの内容から返信メールを作成する以下のコードを、Webhook.phpに書き込みましょう。

<?php

require 'vendor/autoload.php';

// Load our `.env` variable
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

// Declare a new SendGrid Mail object
$email = new \SendGrid\Mail\Mail();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    $from = $_POST["from"];
    $body = $_POST["text"];
    $subject = $_POST["subject"];

    $body = explode("\n", $body);

    preg_match('#\<(.*?)\>#', $from, $match);
    $fromEmail = $match[1];

    $name = explode("<", $from);

    $order = explode(":", $subject);

    // Remove a newline code from the String
    $keyword = trim($body[0]);

    if (strcmp(strval($keyword), "#Another one") == 0) {

        // Set the email parameters
        $email->setFrom("reorder@yourdomain", "Daisuke Aoki");
        $email->setSubject("Another one!");
        $email->addTo($fromEmail, $name[0]);
        $email->addContent("text/plain", "Thanks $name[0], we have
        made another dispatch for your previous order:$order[1]");

        // Send the email
        $sendgrid = new \SendGrid($_ENV['SENDGRID_API_KEY']);
        $response = $sendgrid->send($email);
        
    } else {

        // error handling

    }
}

ユーザからの返信メールに#Another oneが含まれていた場合、30行目のif文の条件分岐がtrueとなり、「Another one!」のタイトルで追加注文の確認メールが作成され、ユーザに返信されます。

以上で準備は完了なので、実際にメールを送ってみましょう!

結果

コンソール画面で次のコマンドを実行して、最初のメールを送ってください。

$ php Email.php

以下のメールを受け取るはずです。
最初のメール

メール本文に#Another oneと書いて返信してみると、
メール本文に#Another oneと書いて返信

次のようなメールが返ってくるはずです!
返ってくるメール

まとめ

今回は、Inbound Parse Webhookを用いて、返信可能なメールを送ってみました!この機能を使うことで、メール受信をトリガーにした機能を実装できます。Inbound Parse Webhookを使った実装についてさらに興味のある方は、以下の関連記事もぜひご覧ください!

関連記事

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。