Категория:
Опубликовано:

SMS - E-mail рассылка своими руками на Drupal

Рассылка сообщений на Drupal

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

Похоже нас ждет море работы.

Вот бы у нас был мульти-инструмент, позволяющий это все автоматизировать...

СТОП! Drupal - именно такой инструмент!

Давайте рассмотрим пример создания простой рассылки, которая облегчит нам жизнь и автоматически отправит все поздравительные СМС и E-mail, словно в сказке, по 12-му бою курантов.

Легенда

После наших манипуляций, наш сайт будет иметь функционал небольшой CRM.

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

Итак, нам понадобятся следующие модули:

Устанавливаем все, и вот что нам нужно включить:

  • AWD SMS API
  • AWD SMS Rules integration
  • Conditional Rules
  • Date
  • Date API
  • Date Popup (по усмотрению)
  • Rules
  • Rules Scheduler
  • Rules UI

Ну, и все их зависимости, при необходимости, включаются автоматически (после нашего разрешения).

Создаем тип материала "Рассылка"

Переходим на страницу admin/structure/types/add, и создаем тип материала "Рассылка".

Добавляем поля:

Отправить СМС

  • Метка - Отправить СМС
  • Машинное имя - send_sms
  • Тип данных - Логическое поле
  • Виджет - Одиночный флаг
Отправить СМС

Добавляем настройки отображения значений:

Настройки поля - Отправить СМС

В основных настройках указываем следующее:

  • Использовать для отображения метку поля, вместо значения, указанного для значения "Да"

Сохраняем поле. Скриншот настроек поля.

Отправить E-mail

  • Метка - Отправить E-mail
  • Машинное имя - send_mail
  • Тип данных - Логическое поле
  • Виджет - Одиночный флаг

Настройки аналогично прошлому полю. Скриншот настроек поля.

Получатели (СМС)

  • Метка - Получатели (СМС)
  • Машинное имя - recipient_sms
  • Тип данных - Текст
  • Виджет - Текстовое поле
Получатели СМС

В настройках ставим неограниченное количество значений поля. Скриншот настроек поля.

Сообщение (СМС)

  • Метка - Сообщение (СМС)
  • Машинное имя - message_sms
  • Тип данных - Длинный текст
  • Виджет - Много строчное текстовое поле
Сообщение (СМС)

Будет простой текст, на 3. Скриншот настроек поля.

Получатели (E-mail)

  • Метка - Получатели (E-mail)
  • Машинное имя - recipient_mail
  • Тип данных - Текст
  • Виджет - Текстовое поле

Настройки аналогично полю "Получатели (СМС)"? с неограниченным количеством значений. Скриншот настроек поля.

Тема (E-mail)

  • Метка - Тема (E-mail)
  • Машинное имя - theme_mail
  • Тип данных - Текст
  • Виджет - Текстовое поле

В настройках все оставляем стандартно. Скриншот настроек поля.

Сообщение (E-mail)

В качестве поля сообщения для E-mail будем использовать стандартный Body.

В настройках можно изменить метку поля, уменьшить отображение строк до 5-ти и убрать ввод анонса. Скриншот настроек поля.

Дата и время рассылки

  • Метка - Дата и время рассылки
  • Машинное имя - date
  • Тип данных - Дата
  • Виджет - Всплывающий календарь
Дата рассылки

В предварительных настройках указываем степень детализации до минут.

Предварительные настройки даты

В основных настройках - отмечаем обязательность заполнения поля, выбираем подходящий формат даты и выставляем значение по умолчанию - "Сейчас".

Скриншот настроек поля.

Немного передвигаем поля, и получаем вот такой тип материала.

Создаем компонент правил

Тип материала готов, приступаем к созданию компонента, отправляющего сообщения.

Переходим на страницу admin/config/workflow/rules/components/add, и добавляем новое правило:

Плагин компонента

Настраиваем компонент следующим образом:

  • Имя - Рассылка
  • Машинное имя - gratters

Добавляем переменную:

  • Тип данных - Материал
  • Метка - Node
  • Машинное имя - node
  • Использование - Параметр

Скриншот настроек компонента.

Добавляем условие - "Тип материала", в котором проверяем соответствие нашему типу материала:

Условие - тип материала

Теперь нам будут доступны все поля нашего материала.

Добавляем условное действие:

Добавить условное действие

Теперь добавим условие "Если:"

Добавление условия - Если

Здесь доступны точно те же условия, что и в блоке условий, и работать с ними можно точно так же. Это позволяет нам создать логику правила, по аналогии с программированием:

  • Если (условие верно)
    • Выполнить действие 1
  • Иначе
    • Выполнить действие 2

Все это предоставляет модуль расширяющий стандартные возможности Rules - Conditional Rules, который мы установили в самом начале. Без него нам бы пришлось создавать несколько разных компонентов, делать кучу повторяющихся проверок и объединять их неудобной логикой.

Вернемся к нашему условию. Нам нужно условие - "Сравнение данных".

Для начала, проверим необходимость отправки СМС. В селекторе данных выбираем сначала "node", и после "node:field-send-sms":

Логическое поле - Отправить СМС

Теперь, в настройках сравнения, оператор оставляем со значением "равно", а значение выбираем "Истинно". Скриншот настройки сравнения.

Таким образом, мы задали условие - "Если в материале отмечен чекбокс - Отправить СМС." Перейдем к действиям, которые необходимо выполнять если условие соответствует.

А именно, будем отправлять SMS-ки.

Получателей у нас может быть неограниченное количество, поэтому правильно будет делать отправку циклом (если Вы не в курсе что за "Цыклы" - ознакомьтесь с постом "Rules Loop. Выполняем правила циклично").

Добавляем цикл (важно производить все действия в рамках нашего условия, т.к. иначе действие будет выполняться во всех случаях):

Добавить цикл в рамках условия

В качестве списка для цикла будет выступать наше поле "Получатели (СМС)" (node:field-recipient-sms):

Список получателей СМС

Далее, в цикл добавляем действие:

Добавить действие в цикл

Действием выбираем "Отправить СМС". Это действие предоставляется модулем для отправки SMS, который мы установили в самом начале.

Действие - Отправить СМС

В настройках действия переключаем все текстовые поля на селекторы данных:

Переключение в режим селектора данных

В поле "Телефон" выбираем текущий элемент списка.

В поле "Сообщение" указываем текст сообщения из материала "node:field-message-sms".

Транслитерацию включаем по своему усмотрению, а вот показ сообщений включать не стоит (будет целая куча сообщений, на каждое отправленное СМС).

Скриншот настройки действия.

Принцип создания действия по отправке E-mail - аналогичен отправке СМС. Я небуду его расписывать в подробностях, и так "чтиво" уже долгое, да и Вы уже всему научились. Расскажу в кратце.

Делаем проверку чекбокса "Отправить E-mail", если включен - отправляем письма циклом, всем получателям.

В качестве действия используем "Отправить HTML-письмо", предоставляемое модулем MIME-mail, установленном в начале. Скриншот действия.

В итоге должно получится как на этом скрине.

Создаем планировщик рассылок

Поздравляю! Мы на финишной прямой. Осталось всего-ничего - создать планировщик рассылок. И это будет еще одно правило.

Теперь это будет обычное правило, реагирующее на событие при создании нового материала типа "Рассылка".

Переходим на страницу admin/config/workflow/rules/reaction/add и добавляем правило со следующими настройками:

  • Имя - Планировщик рассылок
  • Машинное имя - gratters_scheluler
  • Реакция на событие - gratters_scheluler
  • Тип материала - Рассылка

Скриншот создания правила.

И здесь все просто - добавляем действие "Запланировать выполнение компонента":

Запланировать выполнение компонента

В качестве компонента выбираем созданный в прошлом шаге:

Выбор компонента

В настройках правила переключаем поле для выбора даты на селектор данных, и выбираем поле "Дата и время рассылки" из материала (node:field-date).

В качестве идентификатора нужно указывать уникальное значение, потому составим это значение из NID материала и условным названием компонента - получим "[node:nid]_gratters_scheluler".

И в качестве ноды выбираем наш материал.

Скриншот действия.

Настраиваем CRON

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

Но, для "правильной" рассылки (вовремя, как указано при создании) нам нужно настроить запуск выполнения регулярных процедур "CRON".

К счастью, это можно сделать, практически на любом хостинге. Рассмотрим пример настройки на распространенной Cpanel, которой управляются большинство сайтов на шаред-хостингах.

Первым делом, заходим на страницу отчетов о состоянии сайта (admin/reports/status), и там смотрим строку "Задачи, выполняемые по сron":

Ключ запуска CRON

Копируем ключ запуска CRON (без адреса сайта).

В CPanel настройки CRON, обычно находятся в блоке дополнительных настроек:

Настройки CRON

Вставляем ключ CRON и выставляем нужный интервал запуска.

Настройка CRON

Теперь мы можем быть уверенны, что наша рассылка будет отправлена вовремя.

Важно! Для отправки сообщений 1-го числа в 00:00 - нужно выставлять дату в материале 31-е число (последний день прошлого месяца) и время, например 23:59:00. По крону выполняются все задачи, которые должны были выполнится по расписанию, на момент запуска, а если программировать на 00:00 - это будет считаться будущей задачей, и будет выполнена только при следующем запуске cron.

Если у Вас возникли вопросы, замечания, предложения или просто благодарность - пишите в комментариях.
Делитесь полезными материалами в социальных сетях.

Комментарии

Хороший, подробный блог! Молодец
Вопрос такой: Например модератор определенной группы может создать E-mail рассылку в пределах данной группы. Учитывая, что модератор обычный user

Если под "группой" имеется ввиду элемент OG, то не готов точно сказать, т.к. работал с ним очень давно, и предпочитаю не связываться в дальнейшем.

В теории, можно использовать какой-нибудь Entity reference для составления списка из представления, в котором соответственно, выводить только пользователей группы модератора.

Еще вариант, если отправлять нужно всем пользователям группы - использовать представление VBO, настроенное на отображение пользователей группы автора (передавать UID в качестве контекстного фильтра), и отправлять циклом.

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

P.S. - Благодарю, за положительную оценку!

Как увязать с organic group?

Для соц.сети кроме og разве есть еще модули?

Добрый день. На меня повесили аналогичную задачу по рассылке писем своим клиентам. Сможете поделиться ссылками на сайты хостинга, с которым вё ровно прошло?

По хостингу нет каких-либо ограничений. Если Друпал работает на сервере, письма отправляет - значит и рассылка работать будет.

Тут есть небольшая подборка хостеров.

Доброго времени суток

Подскажите пожалуйста, а если делать рассылку пользователям, которые давно не заходили на сайт, например 3 месяца, у вас не инструкций?

Инструкция понятна, если все делать как написано, но вот как работают компоненты не очень понятно

Делал так:
1. Создаю компонент:
Рассылка
Машинное имя: rules_sent
Параметр: User (user)

а) В условиях указываю - Сравнение данных
Данные для сравнения - Выбранные данные: user:last-access
Оператор - Значение: is greater than
Значение данных: site:current-date
В - Добавить смещение: Пропустить 1 месяц

б) В Действиях
Conditional -->Если: Сравнение данных ->Параметр: Данные для сравнения: [user:roles], Значение данных: авторизованный пользователь ->Отправить письмо: Параметр: Кому: [user:mail]

2. Создаю правило

Event - Выполняются регулярные задачи cron
Действия - Запланировать выполнение компонента ... и вот тут дальше не знаю как, а и выше кажется мне как-то не так делаю, в пункте (а)

А Вы не планируйте выполнение компонента, а выполняйте его (там внизу есть список существующих компонентов).

У Вас же по крону выполняется, сравнение дат есть в условии. А в примере про то как запланировать выполнение компонента.

Значит сама логика верна? В создании компонента и в том что указываю в нем - в Conditional, в Если: Сравнение данных и в Отправить письмо?

Да, есть возможность выбрать в действии компонент, выбираю, выходит -
User
Селектор данных * и есть
3 варианта для выбора - site:
1. site:current-user
2. site:current-user:
3. site:current-page:
... Что-то вроде ничего не подходит?

Вам нужно получить список юзеров. Посмотрите как Rules работает со списками.

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

По-сути, можно вообще отказаться от компонента, и отправлять письма в цикле, непосредственно из правила.

Также, следите за нагрузкой. Если сервер не самый мощный, а пользователей в списке будет очень много - может возникнуть дефицит скриптового времени. И письма отправятся не всем.

И еще, учитывайте тот факт, что письма будут рассылаться каждый раз, при запуске крона. Вам, желательно, записывать дату последней рассылки, и делать выборку пользователей с учетом какой-либо периодичности (чтоб по несколько писем в день не уходило).

Хорошо, спасибо, буду разбирать

Есть на drupal.org есть хороший модуль, который это делает(и еще много чего умеет), но что-то он не заработал + он делает рассылку как я понял, только один раз, нету возможности повторно отправлять уведомления. модуль Inactive User - ]]>https://www.drupal.org/project/inactive_user]]>

Поэтому решил попробовать реализовать с помощью Rules (как известно, он умеет все)). Сценарий реализации нашел, но не смог понять его. Вот как пишут, что можно реализовать с помощью Rules - ]]>http://drupal.stackexchange.com/questions/60785/how-can-i-send-email-to-...]]>