TwilioSendGridとMezzioを使用してPHPでメールを送信する方法

公開: 2021-03-24

電子メールはこれまでになく重要なコミュニケーションツールです。 メールをより有効に活用できるように、PHPのMezzioフレームワークとTwilioSendGridのAPIを使用してメールを送信する方法を紹介します。

具体的には、プレーンテキストとHTML本文の両方を含む電子メールを送信する方法を学習します。これにはPDFの添付ファイルが含まれます。 また、Twilio SendGridのトランザクションテンプレート機能を使用して、開発チームと組織内の他のチームの両方が電子メール本文を簡単に作成できるようにする方法についても学習します。

いいですね? さぁ、始めよう。

クイックアプリケーションの概要

このチュートリアルをより意味のあるものにする方法として、ここで作成するコードが、Mezzioで構築された架空のオンラインeコマースショップであるThe Little PHP Shopの一部であると仮定します。具体的には、顧客が購入した直後の部分です。 ユーザーフローのその時点で、顧客は購入に感謝する電子メールを受け取り、記録用のPDF請求書を含めます。

購入後の電子メールを送信するためのHandlerクラスを作成します。この電子メールは、顧客が完了した注文から購入の詳細を受け取ります。 その購入情報を使用して、HandlerクラスはSendGrid PHP APIのいくつかのクラスを使用して、購入確認メールを作成して送信します。

これらの中で最も重要なのは「SendGrid\Mail\Mail」と「\SendGrid」です。 「SendGrid\Mail \ Mail」は、TwilioSendGridを介して送信する電子メールメッセージのすべてのプロパティを格納するオブジェクトです。 「SendGrid」オブジェクトはトランスポート層を形成し、TwilioSendGridを介した電子メールの送信を容易にします。

前提条件

このチュートリアルを完了するには、ローカル開発環境で次の4つのものが必要です。

  1. TwilioSendGridアカウント
  2. cURL mbstring 、およびOペンSSL拡張機能がインストールされて有効になっているPHP 7.4
  3. グローバルにインストールされたComposer
  4. カール

Mezzioアプリケーションを足場にする

まず、ベースアプリケーションを作成する必要があります。 そのためには、いつものように、MezzioSkeletonを使用して行います。 ベースアプリケーションの足場を作成したら、新しく作成したプロジェクトディレクトリに切り替えます。 次に、最初のコマンドのプロンプトに従って、ターミナルで次のコマンドを実行します。

必要な依存関係をインストールします

プロジェクトの足場を作成したら、プロジェクトを完了するために3つの依存関係を追加する必要があります。 これらは:

  • TwilioSendGridAPIと対話するためのTwilioSendGridのPHPAPIライブラリ
  • HTTPリクエストを送信するためのPHPHTTPクライアント
  • 環境変数を保存および取得するためのPHPDotenv

それらをインストールするには、ターミナルで次のコマンドを実行します。

PHPDotenvを初期化します

依存関係をインストールしたら、PHP Dotenvをロードして、「。env」で設定された変数を読み取り、環境変数としてPHPで使用できるようにします。 これを行うには、「requirevendor/autoload.php」の直後の「public/index.php」に次のコードを挿入します。

TwilioSendGridアカウントの詳細を追加します

次に、SendGridAPIキーをアプリケーションに提供する必要があります。 これを行うには、 Twilio SendGridにログインした後、 [設定]->[ APIキー]に移動します。 」一度そこに:

  1. APIキーの作成」をクリックしてAPIキーを作成します
  2. 新しいAPIキーに名前を付け、「フルアクセス」のデフォルトのAPIキー権限を受け入れ作成して表示をクリックします。

APIキーを作成したら、キーをクリックしてコピーし、[完了]をクリックします

その後、ファイルに「SENDGRID_DEFAULT_SENDER_ADDRESS」と「SENDGRID_DEFAULT_SENDER_NAME」の2つのキーを追加します。 名前が示すように、これらは、オーバーライドされない限り、アプリケーションから送信されるすべての電子メールに使用する電子メールアドレスと名前です。

注:これを行うには、送信者認証で、「単一送信者の検証」テーブルに「検証済み」と表示されていることを確認します。

アプリケーションメール設定の詳細を設定する

Twilio SendGrid APIキーに加えて、他のいくつかのグローバルメール構成設定を保存します。 具体的には、すべてのメールメッセージで使用するメールアドレスと名前に差出人と返信を設定します。 そうすれば、毎回設定する必要がありません。

また、2つのメール本文テンプレートを作成します。1つはプレーンテキストメール用で、もう1つはHTMLメール用です。 これを行うには、「config / autoload」に「mail.global.php」という名前の新しいファイルを作成し、その中に次のコードを追加します。

メールオブジェクトをインスタンス化するクラスを作成します

主要なアプリケーション構成の詳細を設定したら、デフォルトのプロパティが設定された基本的なメールオブジェクトをインスタンス化するクラスを作成しましょう。 これを行うには、新しいディレクトリ「src / App / src / Mailer」に「SendGridMailMessageFactory.php」という名前の新しいファイルを作成し、その中に以下のコードを追加します。

クラスを呼び出すと、アプリケーションの依存性注入(DI)コンテナーにアクセスでき、そこから「config / autoload/mail.global.php」に保存した構成の詳細を取得します。

その後、新しい「SendGrid \ Mail \ Mail」オブジェクトをインスタンス化し、それぞれの構成の詳細を「Mail」、「setFrom」、「setReplyTo」メソッドの呼び出しにそれぞれ渡すことで、fromとreplytoの詳細を設定します。 その後、インスタンス化された「Mail」オブジェクトが返されます。

ただし、使用するには、DIコンテナに登録する必要があります。 これを行うには、「src / App / src / ConfigProvider」で、「getDependencies」メソッドから返された配列の「factories」要素に次のエントリを追加します。

メールを送信するハンドラーを作成する

次に、電子メールを作成して送信するためのHandlerクラスを作成する必要があります。 これを行うには、以下のコマンドを実行して、Composerから利用できるMezzioのCLIツールを使用します。

上記のコマンドを実行すると、次の4つのことが行われます。

  1. Cは、新しいHandlerクラス「src / App / Handler/EmailSenderHandler.php」を作成します
  2. Handlerクラス「src/App / Handler/EmailSenderHandlerFactory.php」をインスタンス化するファクトリクラスを作成します
  3. テンプレートファイル(「src / App / templates / app / email-sender.html。<ext>」)を作成します。これは必要ありません ファイル名「<ext>」は、「create-project」段階で選択したテンプレートエンジンによって決定されます。
  4. 「config/autoload / mezzio-tooling-factories.global.php」にエントリを追加して、新しいHandlerクラスをサービスとしてDIコンテナに登録します

メールを送信するためにハンドラーをリファクタリングする

「EmailSenderHandler.php」を作成したら、メールを送信できるようにリファクタリングする必要があります。 そのためには、最初に「EmailSenderHandler」コンストラクターをリファクタリングし、「TemplateRendererInterface」パラメーターを3つの新しいパラメーターに置き換えます。 これらは、3つの新しいクラスメンバー変数を初期化します。

  • 「\SendGrid\ Mail\Mail」オブジェクト
  • 「\SendGrid」オブジェクト
  • 必要な構成の詳細を含むアレイ

以下の例で、関連するクラスメンバー変数とともに改訂されたコンストラクターを確認できます。 既存のクラスメンバー変数とコンストラクターをこのコードに置き換えます。

注: 次に、「handle」メソッドをリファクタリングする必要があります。 「EmailSenderHandler」「handle」メソッドの既存のコンテンツを以下のコードに置き換えてから、それが何をするかをステップスルーしてみましょう。

まず、「$ request-> getParsedBody()」を使用して、リクエスト本文で提供されているパラメータを取得します。これにより、連想配列が返され、「$details」が初期化されます。 使用可能なパラメーターを使用して、「SendGrid \ Mail \ Mail」オブジェクトの「addTo」メソッドを呼び出して、電子メールの受信者を設定し、最初の2つの引数に受信者の電子メールアドレスと名前を渡し、3番目の引数に一連の置換を渡します。

置換により、受信者ごとに電子メールメッセージをカスタマイズできます。 プレーンテキストの電子メールでは、ハイフンですぐに囲まれた文字列、たとえば「-first_name-」は置換です。 HTMLメールでは、Handlebars構文を使用します。これは、文字列を二重括弧で囲みます(例:「{{first_name}}」)。

次に、メッセージの件名を設定し、プレーンテキストとHTMLメッセージの本文を追加します。 これで、メールを送信する準備が整いました。 そのため、「SendGrid」オブジェクト「$ this-> mailer」を使用して送信し、新しい変数「$ response」を初期化して、メッセージの送信を試みたときの応答を示します。 最後に、応答からのステータスコードと本文を含むJsonResponseオブジェクトを返します。

注:EmailSenderHandlerFactoryの__invokeメソッドをリファクタリングします

「EmailSenderHandler」のリファクタリングが完了したので、「EmailSenderHandlerFactory」をリファクタリングする必要があります。 これにより、「EmailSenderHandler」が正しくインスタンス化されます。 これを行うには、「__invoke`」メソッドの既存の定義を次のコードに置き換えます。

これにより、DIコンテナから「\ SendGrid \ Mail \ Mail」オブジェクトが取得され、送信者で事前に初期化され、電子メールの詳細に返信され、「$message」という名前の新しいオブジェクトが初期化されます。 次に、メールメッセージを送信するための「$mailer」という名前の新しい「SendGrid」オブジェクトをインスタンス化します。 最後に、アプリケーションの構成からメール構成を取得します。 次に、これらを使用して「EmailSenderHandler」オブジェクトを初期化して返します。

ルーティングテーブルを更新します

これらすべての変更を加えて、コードをテストしてメールを送信する前に、最後に1つ変更を加える必要があります。 デフォルトルートが「HomePageHandler」ではなく、ルートのハンドラーとして新しいHandlerクラスを使用するように、ルーティングテーブルを更新する必要があります。 これを行うには、「config/routes.php」のデフォルトルートの定義を次の例に置き換えます。

最初のメールを送信する

次に、最初のメールを送信します。 これを行うには、まず、ターミナルで以下のコマンドを実行してアプリケーションを起動します。

次に、cURLを使用して、以下の例のように「 http:// localhost:8080 」にGETリクエストを行い、山かっこ内の値をメールに関連する詳細に置き換えます。

ターミナルに「{“ status”:202、“ message”:””}」の出力が表示され、次の画像のような電子メールが届くはずです。

注:テンプレート文字列の代わりにトランザクションメールテンプレートを使用する

プレーンテキストとHTML本文の両方を含む電子メールを送信することはできましたが、それをどのように行ったかは理想的とは言えません。 送信する電子メールごとに(そしてアプリケーションがかなりの数を送信する可能性があります)、プレーンテキストとHTML本文を追加する必要があります。

ただし、電子メールの本文の定義をコードに保存すると、開発チームに多大な労力が費やされます。 ただし、少なくとも私の経験では、他のチーム、多くの場合、マーケティング、作成、および電子メールテンプレートの保守を行うことがよくあります。

そのため、また開発をスピードアップし、複数のチーム間で負荷を共有するため、トランザクションメールテンプレートを使用するようにアプリケーションをリファクタリングします これらは、コードではなく、技術的な経験がほとんどまたはまったくないチームメンバーがTwilioSendGridUIを介して作成および保守できます。

それらについて聞いたことがない場合は、TwilioSendGrid用語集で次のように定義されています。

トランザクションメールテンプレートは、マーケター、デザイナー、開発者がトランザクションメールキャンペーンをすばやく簡単に作成するために使用できる、事前にコード化されたメールレイアウトです。 Twilio SendGridのトランザクションEメールテンプレートを使用すると、技術者以外の人も技術者も、受信者が受信するEメー​​ルにリアルタイムで変更を加えることができます。

この記事では、かなり基本的なものだけが必要です。 これを行うには、Twilio SendGridのドキュメントの詳細に従い、コンテンツとしてシングルテキストモジュールのみを持つものを作成します。 次に、本文のテキストには、以下のテキストを使用します。

電子メールには6つの置換があることに注意してください。

  • 「first_name」:顧客の名
  • 「last_name」:顧客の姓
  • 「sender_name」: eコマースショップの名前(The Little PHP Shop)
  • 「sender_state」: eコマースショップの州
  • 「sender_country」: eコマースショップの国
  • 「support_email」:顧客がアフターサポートを受けるために使用できるサポートメール

そのため、その情報をアプリケーションで利用できるようにする必要があります。 私たちがすでに持っている顧客の名前と名前。 残りの4つの置換はグローバルになるため、前に行ったように、以下の構成を「templates」要素の後にconfig / autoload/mail.global.php 」に追加します。

新しい構成ファイルを作成したら、「EmailSenderHandler」「handle」メソッドで、「$ this-> mail-> addContent()」への2つの呼び出しを次のコードに置き換えます。

2つのメソッド呼び出しは、送信者の詳細を追加し、グローバルな置換として電子メールアドレスをサポートします。 これらの置換は、他の置換の前に電子メール本文に適用されますが、電子メール受信者に同じキーを持つ置換がある場合はオーバーライドされます。

次に、トランザクションメールテンプレートのIDを取得する必要があります。 下のスクリーンショットにあるように、テンプレートリストテンプレートの名前をクリックすると見つかります。

それをコピーして、「config / autoload / mail.global.php」の新しい要素の「template_id」キーで保存してから、「plain」と「HTML」を削除します。 完了すると、返される配列の「mail / templates」要素は次のコードのようになります。ここで、「<thetemplate'sid>」がテンプレートのIDに置き換わります。

構成が更新されたら、「EmailSenderHandler」「handle」メソッドの「Mail」「setTemplateId」メソッドへの呼び出しを追加し、「config / autoload/mail.global」に追加したテンプレートIDを渡す必要があります。 php。」 以下のコードで例を見ることができます。

変更をテストしてみましょう

以前と同様に、cURLを使用して、 http:// localhost:8080 」にGETリクエストを送信し、変更が期待どおりに機能するかどうかをテストします。 前の例のように、端末に「{“ status”:202、“ message”:””}」の出力が表示されるはずです。 下のスクリーンショットのように、メールの受信トレイに、置換が置き換えられた素敵なメールが表示されます。

PDFの請求書を添付してください

動的テンプレートを使用しているので、記事の上部に説明したPDF請求書を添付しましょう。 自分で探したり作成したりする時間と労力を節約するために、この記事で使用できるサンプルのPDF請求書を作成しました。 アプリケーションの「データ」ディレクトリに保存します。

注:請求書を添付するには、次のコード例でわかるように、「Mail」「addAttachment」メソッドを使用する必要があります。 このメソッドは5つの引数を取りますが、最初の4つだけを提供しています。これらは次のとおりです。

  1. 添付ファイル」オブジェクトまたはBase64でエンコードされ文字列 このパラメーターの値がbase64でエンコードされていない場合、メソッドはそれを実行します。
  2. 添付ファイルのmimeタイプ(現在はメディアタイプと呼ばれています)。
  3. 添付ファイルのファイル名。 これは、ユーザーが変更しない限り、デフォルトでファイルに保存される名前です。
  4. 添付ファイルのコンテンツの配置 content-dispositionに慣れていない場合、インラインcontent-dispositionは、メッセージが表示されたときに添付ファイルが自動的に表示されることを意味し、添付ファイルcontent-dispositionは、添付ファイルが自動的に表示されず、ユーザーからの何らかのアクションが必要であることを意味します。それを開く。

以下のコード例では、PHPのfile_get_contentsメソッドが、ファイルの内容を「$invoice」という名前の新しい変数に読み込みます。 次に、「addAttachment」メソッドを呼び出して、PDFをメッセージに添付します。

ここで、私たちは:

  • Base64でエンコードされる請求書の内容を渡します
  • PDFファイルを添付するため、MIMEタイプを「application/pdf」に設定します
  • 請求書のファイル名を、顧客が合理的に期待できる架空の名前に設定します
  • コンテンツの配置を「添付ファイル」に設定します

これらの変更が完了したので、それらが機能することをテストしてみましょう。 前の2回実行したのと同じcURLリクエストを実行します。 次に、メールの受信トレイに、メールを表示したときにPDFの請求書の例が表示された素敵なメールが表示されます。

これが、TwilioSendGridとMezzioを使用してPHPでメールを送信する方法です。

Twilio SendGridとMezzioを使用してメールを送信するときに可能なことのほんの一部にすぎませんが、プレーンテキストとHTML本文、および添付ファイルを使用してメールを送信できるようになりました。 また、グローバルに受信者ごとに設定できるトランザクションテンプレートと置換の使用方法も学習しました。

PHPライブラリのドキュメントを参照して、メール送信のスケジュール設定、Amazon S3からのファイルの添付、ヘッダーの追加、セクションとカテゴリの追加など、他に利用できるものを確認することを強くお勧めします。

Matthew Setterは、Twilio VoicesチームのPHPエディターであり、当然のことながらPHP開発者です。 彼はMezzioEssentialsの著者でもあります。 彼がPHPコードを書いていないときは、ここTwilioですばらしいPHP記事を編集しています。 彼には次の方法で連絡できます。

  • Eメール: [email protected]
  • Web: http: //matthewsetter.com
  • Twitter: @settermjd
  • GitHub: https://github.com/settermjd