Отправка HTML писем из Drupal 7

html-mail-drupal-7

В семерке поменяли кое что в плане отправки писем, и то что работало в 6ке, в 7ке уже «не катит». Разберем два аспекта отправки писем:

  • HTML формат письма
  • Отправка писем с вложениями

По умолчанию drupal 7 использует реализацию интерфейса MailSystemInterface в классе DefaultMailSystem (modules/system.mail.inc) . В нём реализуется функция форматирования текста письма с использованием drupal_html_to_text(…), которая нам не оставляет шансов на отправку сообщения в HTML формате. Т.е. нам нужно реализовать интерфейс MailSystemInterface в собственном классе и сообщить о нем drupal.

Реализация интерфейса MailSystemInterface

Предлагаю вашему вниманию вот такую версию реализации интерфейса. Этот код нужно разместить в каком то из своих модулей. Функция format больше не портит нам текст письма, мы можем отправлять его в нужном формате. Функция mail упрощена по сравнению с реализацией в классе DefaultMailSystem.

Подключение кастомного класса к обработке писем

Вторая задача — подключить наш кастомный обработчик почты. Можно просто вставить его в код вашего модуля. Но настройка хранится в таблице variable в переменной mail_system, т.е. настроить нужно всего лишь раз. Последовательным было бы следующее решение — в хуке инсталляции модуля добавляем кастомный обработчик, при деинсталляции — удаляем его. Лично я размещаю следующий код в рамках hook_menu, чтобы он вызывался только при сбросе кеша. А деинсталляция меня не интересует, ведь речь идет о модуле, без которого не будет работать сайт (я собираю в нем весь код кастомизации). А вы сами решайте как это делать у вас.

Отправка HTML писем с вложением

Дальнейшее стоит рассматривать на более конкретном примере. Задача такова — у нас есть какая то заявка от клиента, в которой он сообщает свои контактные данные и прикладывает файл (имена полей в HTML name — имя клиента, tel — его телефон, email — почтовый адрес клиента, comment — текст сообщения, flUp — прикладываемый файл) . Надо отправить эти данные на почту менеджеру.

Клиент отправляет данные формы, и первое что нужно сделать — проверить данные. Это делает следующая функция, которая также решает — можно ли отправлять письмо. Также формируется сообщение о результате операции ($mess).

Проверка данных формы

В итоге вызывается функция отправки сообщений — drupal_mail.

Отправка сообщения

Мы вплотную подошли к формированию сообщения. У нас уже все готово — подцеплена наша реализация интерфейса обработки писем, проведена первичная проверка данных формы. Тут я покажу как вложить файл в наше письмо. Продолжим рассматривать все в контексте практического примера.

Пример длинноватый, но основная часть его посвящена составлению текста сообщения. Мне важно было показать порядок обработки всех частей письма, и этот пример может послужить скелетом для вашего случая.

В конце вызывается функция обработки вложения. Я её где то спер, немного подточил и перевел комментарии. Предлагаю вам также ей воспользоваться. :)

Это всё, что требуется для отправки вложения с HTML письмом из Drupal 7.

Написать комментарий

Мало букафф? Читайте есчо !

Загрузка файла в один клик в Drupal формах

Сентябрь 19, 2020 г.

Раздражающая многих особенность друпальных форм, когда пользователь видит избыточное количество элементов формы, связанных с загрузкой файла, может быть ...

Читать

Добавление пунктов меню в Administration menu (admin_menu)

Апрель 8, 2020 г.

Популярный административный модуль admin_menu, собирает всё самое нужное и важное для управления сайтом. И хотя в 7 версии в ядре вы найдете модуль tool, обладающий похожим функционалом, ему не удалось заменить admin_menu. Далее, разберем код, добавляющий ...

Читать

 

Комментарии к «Отправка HTML писем из Drupal 7»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий:

Много комментариев в “Отправка HTML писем из Drupal 7”

  1. Макс:

    Интересно. Но у меня немного иначе. Как релизовать: Клиент заполняет заявку и ему автоматом приходит емайл с аттачем?

    • А в чем трудность?

      • Макс:

        Получается наоборот. Я не принимаю файл, а прикрепляю к уведомлению о заполненной форме. Сам файл лежит в /files. И потом, получается мы изменяем формат вообще всех писем, что не очень хорошо.

      • Если обсуждать это в контексте данного примера в статье, то
        1) нам нет необходимости проверять наши файлы, т.е. _mymodule_data_check() вырождается;
        2) нужно подстроиться под вызов _mime_send_add_attachment($file), что довольно просто мне кажется, особо и комментировать нечего;
        3) ну и в основной ф-ции mymodule_mail(), обработчик вложения изменяется на подключение подготовленного заранее файла. Это файл может генерироваться динамически перед его подключением и т.п. Я так понимаю какой то счет или ком предложение нужно высылать?

      • Макс:

        Да, у меня есть форма с калькулятором. Клиент заполняет и сабмитит. Мне уходит письмо о заявке с данными. Ему подробная инструкция и спец предложение.
        Форма была на webform, удалил, т.к. форму реализуем в модуле, далее разбираюсь с вашим примером.