С выходом Drupal 8, мы так и не увидели реализованную из коробки возможность отправки email в HTML формате. Это одна из тех вещей, которую любой разработчик Drupal реализует практически в любом проекте. Почему это дело не вынесут в ядро – я, честно говоря, не понимаю, если вы в курсе – напишите в комментариях.
По умолчанию в Drupal используется phpMailer, но я в любом случае предпочитаю SwiftMailer, поэтому начнем с установки данной библиотеки.
Установка SwiftMailer
Для установки данной библиотеки нам понадобится модули swiftmailer, mailsystem и собственно сама библиотека SwiftMailer.
Хочу заметить, что вы не сможете активировать модуль swiftmailer, если он не найдет при установке библиотеку SwiftMailer.
Для загрузки библиотеки нам понадобится Composer, если вы не в курсе как его установить, то идем сюда. Загрузка осуществляется простой командой
composer require drupal/swiftmailer
Хочу заметить, что composer при выполнении данной команды загрузит помимо библиотеки еще и все зависимости – модули swiftmailer и mailsystem
Теперь можно активировать модули Swiftmailer и Mailsystem. Переходим к настройке модуля Swiftmailer, по пути Конфигурация – Система – SwiftMailer и переходим в подраздел «Сообщения», где в качестве формата отправки сообщений выбираем – HTML.
Не забываем сохранить конфигурацию. В подразделе «Тест» вы можете проверить отправку email сообщений Swiftmailer – ом
Теперь давайте изменим систему отправки Email сообщений по умолчанию, для этого идем по пути Конфигурация – Система – Mail System и в разделе «Система по умолчанию» выбираем нашу библиотеку
И осталось теперь все это дело проверить, для этого я создам модуль – ex_email
name: Example email
description: Данный модуль тестирует отправку Email
core: 8.x
package: Drupalfly
type: module
Для того что бы наш модуль был доступен в mailsystem - нам необходимо реализовать hook_mail() в нашем модуле, тем самым мы скажем mailsystem, что наш модуль способен отправлять email сообщения с указанными параметрами.
Файл - ex_email.module
<?php
/**
* @param $key
* @param $message
* @param $params
* Implements hook_mail()
*/
function ex_email_mail($key, &$message, $params) {
switch ($key) {
case 'ex_email_notify':
$message['subject'] = $params['subject'];
$message['body'][] = check_markup($params['message'], 'full_html');
break;
}
}
Хочу заметить, что мы специально используем дополнительный ключ – ex_email_notify, ибо в зависимости от данного ключа будет формироваться необходимый шаблон для тела email сообщения.
Далее активируем модуль и переходим к настройке mailsystem по пути Конфигурация – Система – Почтовая система. Для чистоты эксперимента, изменим систему по умолчания на phpMailer (Почтовая программа PHP по умолчанию)
Теперь нам необходимо указать, что для нашего модуля – ex_email должна быть применена библиотека SwiftMailer, для отправки Email уведомлений. Для этого выбираем наш модуль, в качестве ключа используем тот ключ, который мы определили в hook_mail нашего модуля и выбираем библиотеку.
И жмем добавить, после чего вы должны увидеть модуль ex_email в таблице
Хочу заметить, что не всегда добавление происходит с первого раза – с чем этого связано, сказать не могу.
С настройками определились, теперь давайте отправим тестовое сообщение. Отправку сообщения я реализую в hook_prepocess_html, - это значит, что email будет отправляться каждый раз при загрузке страницы
Файл – ex_email.module
<?php
/**
* @param $key
* @param $message
* @param $params
* Implements hook_mail()
*/
function ex_email_mail($key, &$message, $params) {
switch ($key) {
case 'ex_email_notify':
$message['subject'] = $params['subject'];
$message['body'][] = check_markup($params['message'], 'full_html');
break;
}
}
/**
* @param $variables
* Implements hook_preprocess_html()
*/
function ex_email_preprocess_html(&$variables){
$to = 'user@gmail.com';
$from = \Drupal::config('system.site')->get('mail');
$lang = 'ru';
$subject = 'Test send email from swiftmailer';
$body = '<p style="background-color: #0c97ed">Destroy for creation</p>';
$params = array(
'subject' => $subject,
'message' => $body,
);
Drupal :: service ('plugin.manager.mail') -> mail('ex_email', 'ex_email_notify', $to, $lang, $params, $from, TRUE);
}
Чистим кеш сайта и смотрим результат
Как видите, для нашего модуля письма отправляются в HTML формате, с использованием библиотеки SwiftMailer.
Конечно, использовать SwiftMailer только для отправки писем в HTML формате – это глупость, его применение гораздо больше подходит для отправки сложных email сообщений, например сообщения со вставкой изображений и прикрепленных файлов. На что способна данная библиотека можно посмотреть (почитать) на официальном ресурсе.
И на последок, если вам необходимо отправить простое письмо в HTML формате, то это можно сделать без дополнительных модулей, а самостоятельно изменять headers перед каждой отправкой email сообщения
<?php
$send_mail = new \Drupal\Core\Mail\Plugin\Mail\PhpMail();
$from = $this->config('system.site')->get('mail');
$message = array();
$message['headers'] = array(
'content-type' => 'text/html; charset=UTF-8; format=flowed; delsp=yes',
'MIME-Version' => '1.0',
'reply-to' => $from,
'from' => 'Pantey (drupalfly.ru) <'.$from.'>',
'Return-Path' => $from,
);
$message['to'] = 'panteymos@gmail.com';
$message['subject'] = 'Subject';
$message['body'] = '<p style="background-color: #5cb730">Example body</p>';
$result_email = $send_mail->mail($message);
На этом можно закончить. Скачать модуль используемый в примере.