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

В свете приближающихся праздников, возникает потребность высылать "кучу" поздравлений - коллегам, родственникам-знакомым или клиентам.
Похоже нас ждет море работы.
Вот бы у нас был мульти-инструмент, позволяющий это все автоматизировать...
СТОП! Drupal - именно такой инструмент!
Давайте рассмотрим пример создания простой рассылки, которая облегчит нам жизнь и автоматически отправит все поздравительные СМС и E-mail, словно в сказке, по 12-му бою курантов.
Легенда
После наших манипуляций, наш сайт будет иметь функционал небольшой CRM.
Мы сможем создавать рассылки, с помощью которых будут автоматически отправляться нужные нам сообщения - нужным нам получателям.
Итак, нам понадобятся следующие модули:
- Rules
- Conditional Rules
- Date
- Mime Mail (для отправки E-mail'ов)
- Модуль для отправки SMS
Устанавливаем все, и вот что нам нужно включить:
- 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 (без адреса сайта).
В CPanel настройки CRON, обычно находятся в блоке дополнительных настроек:

Вставляем ключ CRON и выставляем нужный интервал запуска.
Теперь мы можем быть уверенны, что наша рассылка будет отправлена вовремя.
Важно! Для отправки сообщений 1-го числа в 00:00 - нужно выставлять дату в материале 31-е число (последний день прошлого месяца) и время, например 23:59:00. По крону выполняются все задачи, которые должны были выполнится по расписанию, на момент запуска, а если программировать на 00:00 - это будет считаться будущей задачей, и будет выполнена только при следующем запуске cron.
Комментарии
Хороший, подробный блог! Молодец
Вопрос такой: Например модератор определенной группы может создать E-mail рассылку в пределах данной группы. Учитывая, что модератор обычный user
Если под "группой" имеется ввиду элемент OG, то не готов точно сказать, т.к. работал с ним очень давно, и предпочитаю не связываться в дальнейшем.
В теории, можно использовать какой-нибудь Entity reference для составления списка из представления, в котором соответственно, выводить только пользователей группы модератора.
Еще вариант, если отправлять нужно всем пользователям группы - использовать представление VBO, настроенное на отображение пользователей группы автора (передавать UID в качестве контекстного фильтра), и отправлять циклом.
Но правильнее всего, если позволяют возможности - сделать небольшой модулек реализующий необходимый функционал.
Как увязать с 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-...]]>