目次
電子メールはどのように送信すればよいですか?
我们如何更改电子邮件?
结论
ホームページ バックエンド開発 PHPチュートリアル Drupal 8 Mail API の機能の拡張: パート 1

Drupal 8 Mail API の機能の拡張: パート 1

Aug 27, 2023 pm 08:13 PM

扩展 Drupal 8 Mail API 的功能:第 1 部分

この 2 部構成のシリーズでは、Drupal 8 の Mail API について説明します。その過程で、プログラムで電子メールを送信するためにこれを使用する方法と、Mandrill などの外部サービスを使用できるように拡張する方法の 2 つの主要な側面について説明します。

これを実証するために、最初の部分では、現在のユーザーが新しい記事ノードを保存したときに電子メールを送信するカスタム電子メール テンプレートを作成します。さらに、他の人がこのテンプレートを変更して、デフォルトのプレーン テキストの代わりに HTML で電子メール本文をレンダリングできるようにした方法を見ていきます。

第 2 部では、メール システムの拡張と、電子メール配信のための外部 API の統合について見ていきます。このために、Mandrill とその API と対話するための優れた基盤を提供するその PHP ライブラリを使用します。

私たちが行ったすべての作業は、ここで書き始めるカスタム Drupal 8 モジュールの一部として、この Git リポジトリにあります。したがって、フォローしたい場合は、お気軽にチェックしてください。はじめましょう。

このモジュールの最初の前提条件は、.info ファイルです:

d8mail.info.yml:

リーリー

この問題が解決されたので、必要に応じてサイトでモジュールを有効にすることができます。

電子メールはどのように送信すればよいですか?

Drupal 8 を使用してプログラムで電子メールを送信するには、主に 2 つの手順が必要です。まず、hook_mail() を実装して 1 つ以上の電子メール テンプレートを定義する必要があります。 2 番目のステップは、メール マネージャーを使用して、これらの テンプレート のいずれかを使用して電子メールを送信することです。

フックと呼ばれていますが、hook_mail() は典型的なフックではなく、通常はそれを実装する同じモジュールによってのみ呼び出される通常の関数です。つまり、プログラムで電子メールを送信するときは、hook_mail() を実装するモジュールの名前と、使用する定義済みの template ID を指定する必要があります。あのフックで。しかし、それはすぐに分かります。まず、それをどのように実装するか?

d8mail.module:

リーリー

これは、node_insert ($key) として識別される template を定義する非常に単純な実装です。他の 2 つの関数パラメータは次のとおりです:

  • $メッセージ: 参照渡し。必要に応じて電子メールに関する定型文を追加します。
  • $params: 電子メールに含める必要がある追加データの配列。電子メールの送信時にメール マネージャーから渡されます。
  • ご覧のとおり、このメールにすべての呼び出しに含める値を含む
$message

配列を構築しています。構成システムから取得され、メイン サイトの電子メール アドレスを表すデフォルトの from 値を設定しています。新しいノードが作成されたことを受信者に知らせる定型メール subject と、その後にノードの名前 ($params 配列を介して渡されます) を設定します。 )。トピックは、発信者から渡された言語に翻訳することもできます。 最後に、テキストには HTML が含まれている可能性があり、HTML 要素をエンコードしないと切り詰められる可能性があるため、メッセージ

body

を文字列サニタイザーを通じて実行します。 SafeMarkup クラスを使用しているため、先頭で 使用する必要があります: リーリー さらに、メッセージ本文は配列であり、後で 文字列に展開されます。もちろん、ヘッダーなど、設定できるパラメータは他にもたくさんありますが、この例ではこれで十分です。

これは hook_mail() の実装のすべてです。次に、新しいノードが作成されるたびに実行されるコード、hook_entity_insert():

を見てみましょう。 リーリー

このフックはノードが保存されるたびにトリガーされます。必要なのは、正しいノードをターゲットにし、ロジックを含めていることを確認することだけです。 ノード エンティティのタイプが

article

であることを確認した後、Drupal Mail Manager サービスをロードし、電子メールのいくつかの値の設定を開始します。次の情報が必要です:

  • 实现 hook_mail() 并定义我们的模板(我上面提到的)的模块名称
  • 模板 ID($key
  • 收件人电子邮件地址(在当前用户帐户中找到的地址)
  • 进入 $params 数组并用于翻译主题消息的语言 ($langcode)
  • 将添加到电子邮件主题的节点标题
  • 电子邮件正文,在我们的例子中将是节点正文字段的值
  • 指示是否应实际发送电子邮件的布尔值

然后我们将所有这些值传递给邮件管理器的 mail() 方法。后者负责构建电子邮件(调用正确的 hook_mail() 实现是其中的一方面)并最终将实际交付委托给负责的插件。默认情况下,这将是 PHPMail,它使用 PHP 自带的默认 mail() 函数。

如果邮件管理器成功发送电子邮件(不考虑实际发送,而是考虑成功的 PHP 操作),则 mail() 方法将返回一个包含 result 键的数组,其中包含以下内容:邮件插件返回。通过检查该值,我们可以了解电子邮件操作是否成功,并通知用户我们已通知他们他们的操作。否则,我们将打印并记录一条错误消息。

就是这样。清除缓存并创建文章节点应该会在您的收件箱中收到一封电子邮件。如果您没有收到任何信息,并且屏幕上没有错误迹象,请务必检查服务器日志和邮件队列,以验证电子邮件是否已发出。

在继续之前,我想快速说明一下这个钩子的实现。在这个例子中,我直接将所有逻辑放在其中。此外,我在顶部使用了早期返回,这本质上意味着除了特定于文章节点的逻辑之外,不能添加其他逻辑。在实际应用程序中,我建议将邮件逻辑重构为单独的函数或类,并遵循该逻辑。此外,您不应在钩子实现中使用提前返回,而应在满足条件时调用其他函数。

我们如何更改电子邮件?

一旦所有这些都到位,我们就可以使用另一个工具来更改现有的设置:hook_mail_alter()。在负责的邮件插件发送电子邮件之前,从邮件管理器内部调用此挂钩。目的是允许其他模块对正在发送的现有电子邮件进行最终更改。

虽然其他模块也可以使用它,但我们将在我们一直使用的同一模块中说明示例实现。为此,我们将通过更改其默认标头之一来更改电子邮件,以便将其从纯文本转换为 HTML。我们可以这样做:

/**
 * Implements hook_mail_alter().
 */
function d8mail_mail_alter(&$message) {
  switch ($message['key']) {
    case 'node_insert':
      $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed; delsp=yes';
      break;
  }
}
ログイン後にコピー

如您所见,这是对 Content-Type 标头的简单更改,可将电子邮件转换为 HTML。这样纯文本 HTML 实体将被邮件客户端解析为 HTML。使用 switch case,我们确保这只发生在我们之前定义的电子邮件模板中。

这里需要注意的一件事是,在相关的 hook_mail() 实现之后调用 alter hook。因此,在此之后,对电子邮件进行的唯一处理是在邮件插件的 format() 方法内完成的(由其接口强制执行)。

结论

这几乎就是使用 Drupal 8 以编程方式发送电子邮件的全部内容。我们已经了解了以编程方式设置电子邮件模板所需的步骤,只要我们需要,这些模板就会由邮件管理器进行水合。我们还提到了 Drupal 8 中用于发送电子邮件的默认邮件传递插件。最后,我们看到了其他模块现在如何通过添加新标头、更改主题、将值连接到邮件正文来更改我们的电子邮件等

在下一篇文章中,我们将考虑用我们自己的自定义实现替换默认的 PHPMail 插件。我们将在 PHP 库的帮助下设置一个使用 Mandrill 的邮件程序。目标是允许我们自己的模块使用此邮件程序,而应用程序的其余部分继续使用默认的 PHPMailer。

以上がDrupal 8 Mail API の機能の拡張: パート 1の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPロギング:PHPログ分析のベストプラクティス PHPロギング:PHPログ分析のベストプラクティス Mar 10, 2025 pm 02:32 PM

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

See all articles