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

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

Вывод строки запроса построенного в db_select

Апрель 11, 2019 г.

Конструктор запросов db_select позволяет абстрагироваться от движка базы данных. Если запрос довольно сложный, то на этапе тестирования может потребоваться, что называется, убедиться в том, что конечный запрос на языке SQL к базе именно тот, что вы ожидаете. ...

Читать

Включить вывод php ошибок в drupal 7

Январь 24, 2020 г.

Drupal надстраивает собственные разрешения на вывод ошибок, потому если вам необходим вывод ошибок на этапе разработки, то важно знать как разрешить их ...

Читать

Еще один пример работы с EntityFieldQuery

Декабрь 23, 2020 г.

Время от времени продолжаю кодить под drupal 7, публикую еще один пример для работы EntityFieldQuery, на этот раз с фильтром по полю типа term reference. Основная логика точно такая же как и при работе с data полями (где у нас хранятся тексты или ...

Читать

Как получить текущий id node в drupal из кода программы?

Ноябрь 8, 2016 г.

Можно использовать анализ адреса хранимый Drupal в $_GET['q'] и/или анализ частей адреса, получаемых функцией arg(N). Оба варианта по сути делают одно и тоже - анализ внутреннего адреса, который для публикации имеет вид: node/%NID%. Я использую функцию ...

Читать
 

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

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



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

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

  1. Макс:

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

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

      • Макс:

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

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

      • Макс:

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