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

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

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

Хватит места каждому гению

Ноябрь 3, 2013 г.

С месяц уже участвую в проекте ГенийМеста в качестве, естественно, программиста. В наследство от разработчиков мне достался довольно спорный подход (почти ...

Читать

Ctools modal закрытие при клике вне модального окна

Июнь 28, 2019 г.

Привычное для пользователей поведение модального окна изначально не реализовано в ctools. Давайте добавим немного js, реализующего нужный функционал. Код универсален для модального окна создаваемого ctools, т.к. привязан к верстке окна: [crayon-5dca7c9dc6801334621926/] ...

Читать

 

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

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



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

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

  1. Макс:

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

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

      • Макс:

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

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

      • Макс:

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