Inbound Parse WebhookとPHPを使った 返信可能なメールの作成
- 2021年5月28日
- by 青木大将
- Category: 技術ネタ
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で受信して、自動的に返信する機能を実装します。
構築する機能の詳細を下の図に示します。
- Email.phpを実行し、SendGridへメール送信をリクエストする
- 本文に「#Another one」と書いて、ユーザがメールを返信する
- Inbound Parse WebhookのエンドポイントURLにPOSTされたメールの内容をWebhook.phpで受け、返信メールを構築して送信リクエストする
- ユーザがメールを受信する
必要なもの
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 AuthenticationとMXレコードの設定をお忘れなく!
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と書いて返信してみると、
次のようなメールが返ってくるはずです!
まとめ
今回は、Inbound Parse Webhookを用いて、返信可能なメールを送ってみました!この機能を使うことで、メール受信をトリガーにした機能を実装できます。Inbound Parse Webhookを使った実装についてさらに興味のある方は、以下の関連記事もぜひご覧ください!