ホームページ  >  記事  >  バックエンド開発  >  Drupal 8 Mail API の機能の拡張: パート 1

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

PHPz
PHPzオリジナル
2023-08-27 20:13:081152ブラウズ

扩展 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 までご連絡ください。