Отправка 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 6

Январь 17, 2013 г.

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

Читать

Доводим модуль transliteration в Drupal

Июль 11, 2016 г.

Модуль транслитерации помогает нам с переименованием загружаемых файлов. Но мне лично не все нравится в его работе. Например, пробелы он заменяет символом нижнего подчеркивания, а хотелось бы получить "дефис". Хоть у модуля и нет тонких настроек, ...

Читать

 

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

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



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

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

  1. Макс:

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

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

      • Макс:

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

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

      • Макс:

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