Для отправки писем, Drupal 9 использует реализации интерфейса MailInterface (core/lib/Drupal/Core/Mail/MailInterface.php). И в коробке сразу же имеется реализация — класс PhpMail (core/lib/Drupal/Core/Mail/Plugin/Mail/PhpMail.php). С ним все отлично, но вот только в функции форматирования письма вновь (аналогично как и в Drupal 7) вызывается функция, зачищающая HTML теги письма MailFormatHelper::htmlToText().
Нам подходит весь код класса, за исключением строки #49, в которой производится обработка текста письма.
Потому я создаю свой класс на основе данного.
А чтобы добавить класс в проект нам нужно оформить его в виде плагина, где мы разместим собственную имплементацию MailInterface. Назовем его myhtmlmail. Кроме того, в коннотации класса нужно указать своё описание (исправим то, что скопировали из класса PhpMail:
1 2 3 4 5 6 7 |
/** * @Mail( * id = "html_mail", * label = @Translation("Html mailer"), * description = @Translation("Sends the message as html text, using PHP's native mail() function.") * ) */ |
Далее, чтобы не копипастить весь код, я приведу текст нового файла с изменениями и сокращениями:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php namespace Drupal\myhtmlmail\Plugin\Mail; use ....; /** * @Mail( * id = "html_mail", * label = @Translation("Html mailer"), * description = @Translation("Sends the message as html text, using PHP's native mail() function.") * ) */ class HtmlMail implements MailInterface { protected $configFactory; public function __construct() { ... } /** */ public function format(array $message) { // Join the body array into one string. $message['body'] = implode("\n\n", $message['body']); // Удаляем всего одну строку: // $message['body'] = MailFormatHelper::htmlToText($message['body']); // Wrap the mail body for sending. $message['body'] = MailFormatHelper::wrapMail($message['body']); return $message; } // остальной код идет без изменений public function mail(array $message) { ... } protected static function _isShellSafe($string) { ... } } |
Итак, отличий всего 3:
- изменено пространство имен (namespace)
- изменена коннотация и имя класса
- удалена одна строка
Для создания модуля нам потребуется создать еще один текстовый файл — описатель нашего модуля — myhtmlmail.info.yml (лежит в корне папки модуля).
1 2 3 4 5 6 7 8 9 10 11 12 |
name: MyHtmlMail description: Html mail class package: Custom dependencies: - drupal:mailsystem type: module core: 8.x core_version_requirement: ^8 || ^9 hidden: false required: false |
Как видите — для работы требуется drupal:mailsystem. Это компонент позволит настроить ваш проект на использование объявленного нами класса из адинки Drupal. Настройки находятся по адресу /admin/config/system/mailsystem. Выбираем ‘Html mailer’ в качестве форматтера и отправителя.
Чтобы не запутаться — вот вся структура и архив: