• урок
  • pantey

Drupal 8 – Использование SwiftMailer

11.07.2017

С выходом Drupal 8, мы так и не увидели реализованную из коробки возможность отправки email в HTML формате. Это одна из тех вещей, которую любой разработчик Drupal реализует практически в любом проекте. Почему это дело не вынесут в ядро – я, честно говоря, не понимаю, если вы в курсе – напишите в комментариях.

По умолчанию в Drupal используется phpMailer, но я в любом случае предпочитаю SwiftMailer, поэтому начнем с установки данной библиотеки.

Установка SwiftMailer

Для установки данной библиотеки нам понадобится модули swiftmailer, mailsystem и собственно сама библиотека SwiftMailer.

Хочу заметить, что вы не сможете активировать модуль swiftmailer, если он не найдет при установке библиотеку SwiftMailer.

Для загрузки библиотеки нам понадобится Composer, если вы не в курсе как его установить, то идем сюда. Загрузка осуществляется простой командой

composer require drupal/swiftmailer

Хочу заметить, что composer при выполнении данной команды загрузит помимо библиотеки еще и все зависимости – модули swiftmailer и mailsystem

send_email_html_in_drupal_8.png

Теперь можно активировать модули Swiftmailer и Mailsystem. Переходим к настройке модуля Swiftmailer, по пути Конфигурация – Система – SwiftMailer и переходим в подраздел «Сообщения», где в качестве формата отправки сообщений выбираем – HTML.

send_email_html_in_drupal_8_1.png

Не забываем сохранить конфигурацию. В подразделе «Тест» вы можете проверить отправку email сообщений Swiftmailer – ом

send_email_html_in_drupal_8_2.png

Теперь давайте изменим систему отправки Email сообщений по умолчанию, для этого идем по пути Конфигурация – Система – Mail System и в разделе «Система по умолчанию» выбираем нашу библиотеку

send_email_html_in_drupal_8_3.png

И осталось теперь все это дело проверить, для этого я создам модуль – 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 по умолчанию)

send_email_html_in_drupal_8_4.png

Теперь нам необходимо указать, что для нашего модуля – ex_email должна быть применена библиотека SwiftMailer, для отправки Email уведомлений. Для этого выбираем наш модуль, в качестве ключа используем тот ключ, который мы определили в hook_mail нашего модуля и выбираем библиотеку.

send_email_html_in_drupal_8_5.png

И жмем добавить, после чего вы должны увидеть модуль ex_email в таблице

send_email_html_in_drupal_8_6.png

Хочу заметить, что не всегда добавление происходит с первого раза – с чем этого связано, сказать не могу.

С настройками определились, теперь давайте отправим тестовое сообщение. Отправку сообщения я реализую в 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);

}

Чистим кеш сайта и смотрим результат

send_email_html_in_drupal_8_7.png

Как видите, для нашего модуля письма отправляются в 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);

На этом можно закончить. Скачать модуль используемый в примере.

Скачать

-->
Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.