この 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 つの関数パラメータは次のとおりです:
$メッセージ
: 参照渡し。必要に応じて電子メールに関する定型文を追加します。
: 電子メールに含める必要がある追加データの配列。電子メールの送信時にメール マネージャーから渡されます。
配列を構築しています。構成システムから取得され、メイン サイトの電子メール アドレスを表すデフォルトの from
値を設定しています。新しいノードが作成されたことを受信者に知らせる定型メール subject
と、その後にノードの名前 ($params
配列を介して渡されます) を設定します。 )。トピックは、発信者から渡された言語に翻訳することもできます。
最後に、テキストには HTML が含まれている可能性があり、HTML 要素をエンコードしないと切り詰められる可能性があるため、メッセージ
を文字列サニタイザーを通じて実行します。 SafeMarkup
クラスを使用しているため、先頭で 使用する必要があります:
リーリー
さらに、メッセージ本文は配列であり、後で 文字列に展開されます。もちろん、ヘッダーなど、設定できるパラメータは他にもたくさんありますが、この例ではこれで十分です。
これは hook_mail() の実装のすべてです。次に、新しいノードが作成されるたびに実行されるコード、hook_entity_insert():
を見てみましょう。 リーリー このフックはノードが保存されるたびにトリガーされます。必要なのは、正しいノードをターゲットにし、ロジックを含めていることを確認することだけです。
ノード エンティティのタイプが
であることを確認した後、Drupal Mail Manager サービスをロードし、電子メールのいくつかの値の設定を開始します。次の情報が必要です:
hook_mail()
并定义我们的模板(我上面提到的)的模块名称$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 サイトの他の関連記事を参照してください。