Создаем e-mail рассылку в Drupal, используя модули почты и Simplenews

У Друпала есть огромный пласт модулей, специально предназначенный для рассылки, настройки e-mail почты и так далее. В этой статье я постараюсь рассказать подробно о том, как настроить на своем сайте хорошую рассылку e-mail писем, которые можно оформлять с помощью html кода (т.е. вставлять картинки, красиво оформлять и т.д.)

В первую очередь, установим сам модуль Simplenews: http://drupal.org/project/simplenews

Заходим в его настройки, и в разделе "Подписки" admin/settings/simplenews/subscription надо выставить нормальные сообщения, которые будут отправляться пользователям, когда они будут подписываться/отписываться от рассылки. Я добавил такие:

Текст содержания электронного письма при подписке:

Вы подписались на рассылку "[simplenews-newsletters-name]" на сайте [site-name] по адресу [site-url]. Для подтверждения подписки, пожалуйста, пройдите по ссылке, которая указана ниже.
 
[simplenews-subscribe-url]
 
Мы обещаем, что ваш e-mail останется в тайне, и в ваш ящик не будут сыпаться тонны спама. Мы будем присылать сообщения максимум 1-2 раза в месяц.
 
Приятного вам дня!

Текст содержания для уже подписанного посетителя:

Вы подписались на рассылку "[simplenews-newsletters-name]" на сайте [site-name] по адресу [site-url]. Для подтверждения подписки, пожалуйста, пройдите по ссылке, которая указана ниже.
 
[simplenews-subscribe-url]
 
Мы обещаем, что ваш e-mail останется в тайне, и в ваш ящик не будут сыпаться тонны спама. Мы будем присылать сообщения максимум 1-2 раза в месяц.
 
Приятного вам дня!

Текст содержания электронного письма для отказа от подписки:

Мы получили запрос на отказ от подписки "[simplenews-receiver-mail]" с вашего e-mail на сайте [site-name] [site-url]. Для подтверждения этого, пожалуйста, пройдите по ссылке, указанной ниже.
 
[simplenews-unsubscribe-url]

Текст письма для ещё не подписавшегося посетителя:

Мы получили запрос на отказ от подписки "[simplenews-receiver-mail]" с вашего e-mail на сайте [site-name] [site-url]. Однако, такого e-mail'a нет в списке нашей рассылки. Если вы хотите подписаться на рассылку, зайдите на сайт и заполните форму снова [site-url].

Далее надо настроить саму рассылку - заходим в admin/content/simplenews/types/list и изменяем единственную рассылку на то, как вам надо - название и т.д.
Так же здесь /admin/settings/simplenews/newsletter нужно настроить тестовый адрес, по которому будет отсылаться пробное письмо рассылки.

Теперь уже можно протестировать! Создаем новый материал с типом "Рассылка" /node/add/simplenews
Сохраняем, заходим по вкладке "Рассылка" (рядом со вкладкой "изменить"), там отсылаем тестовую рассылку (отошлется на адрес, который вы указывали в админке всего сайта). Проверяем, если устраивает - это супер. Но скорее всего этого мало - ведь это просто текстовое письмо, а нам хочется красивостей в виде html-письма.

(Кстати, чтобы пользователи могли подписываться на рассылку, есть страница /newsletter/subscriptions, а так же блок "Подписка на newsletter")

Итак, чтобы рассылать именно html-письма, устанавливаем еще дополнительные модуль http://drupal.org/project/mimemail

После этого заходим в настройки рассылок /admin/settings/simplenews/newsletter и теперь в "Настройки рассылок по умолчанию" есть возможность выставить Формат = html.

В принципе все. Теперь можно опять отправить тестовую рассылку (как описано выше, только теперь можете писать html-код, например вставлять картинки, и выставить "формат ввода" материала = html), только на вкладке "Рассылка" при отправлении тестового письма надо обязательно проверить раскрывающееся меню "Настройки e-mail" -> Формат должен стоять html.

Если вам нужно будет изменять внешний вид рассылок по определенным правилам, вам понадобится модуль http://drupal.org/project/htmlmail - он позволяет применить шаблон оформления к html-письмам. Но об этом уже в другой раз.

Drupal 7

Комментарии

Сергей 03.06.2014 - 17:31

Спасибо вам большое за статью! Но я я для рассылки емаил использую специальный сервис Юнисендер!

Nikita Petrov 03.06.2014 - 18:27

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

Алекс 07.08.2014 - 12:01

Народ, такая ситуация. Есть база емейлов, примерно так миллионов на 5. Как по ней сделать рассылку? Дайте инструкцию или совет, где ее можно посмотреть. Если совет будет рабочий, базу дам безвозмездно. Свои советы шлите на почту 485333449@mail.ru Заранее спасибо

Nikita Petrov 13.10.2014 - 11:38

Алексей, или разберитесь сами как делать рассылку в drupal, или разместите заказ на фрилансе, только будьте готовы, что программистам ваша база будет не нужна и они попросят денег за свою работу.

Раиль 18.10.2014 - 19:16

Спасибо за статью, отличное руководство. А не знаете, такая рассылка какую нагрузку создает для хостинга, сервера, скажем, если за один раз отправить 50 000 подписчикам? База белая, это не спам, а плановая рассылка раз в неделю.

Nikita Petrov 18.10.2014 - 20:21

Для хостинга-то нагрузка не большая, вот только вас сразу в чёрный список все email-провайдеры добавят - 100%. Сам стараюсь отправлять не больше 50 писем в час - да, получается долго, зато наверняка. Есть опыт, что рассылали по 100 писем каждые 10 минут, ip сервера попал везде в бан как спамщик.

Раиль 18.10.2014 - 20:48

Ясно, спасибо. Тогда лучше буду использовать Смартреспондер. А то хотелось совсем бесплатно:)

Влад 20.10.2014 - 12:04

Добрый день! Два вопроса:
1. Я установил модули: Simplenews, Mime Mail, HTML Mail и заметил проблему на странице рассылки нет выпадающего меню "Настройки e-mail". Как решить эту проблему?
2. Как поменять е-mail с которого рассылается, а то высвечивается email хостинга?

Nikita Petrov 20.10.2014 - 19:46

Быстро сказать не могу, разбираться нет времени. Постарайтесь решить проблему сами.

Олег 09.11.2014 - 15:05

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

Nikita Petrov 27.11.2014 - 18:29

Могу, но с помощью рулсов это делать - большой гемор. Если только в качестве тренировочного задания, чтобы размять свой мозг, я вам отвечу, но ни за что не реализовывйте это, ибо это неправильно:
мне бы пришлось создать кастомный код, который добавляет галочку в форму комментариев "Подписаться на ответы в этой теме", затем альтерить обработчик сабмита этой формы и делать запись в базе данных о том, что конкретный email подписан на эту конкретную тему (т.е. пришлось бы создать кастомную таблицу, ибо друпаловскими полями это вообще делать мега глупо), затем создал бы правило, которое тригерится при изменении ноды конкретного типа, в action выбрал бы php-код или лучше бы написал свой action для rules, в котором как параметр передается измененная нода, и в этой функции мы изем по нашей кастомной таблице нашу измененную ноду и получаем всех подписчиков на неё, и затем уже рассылаем всем уведомления - опять же лучше это делать не моментально а через крон, для этого тоже надо написать небольшой код.
В общем и целом, вам пришлось бы практически переписать модуль comment_notify - зачем вам это нужно?? Если в comment_notify нет функционала отсылки подпписчиками именно при изменении ноды, гораздо правильнее просто дописать этот модуль и выложить для всех патч, чем заниматься бредовым гемороем (в этом случае) с рулсами.

Олег 27.11.2014 - 21:11

Никита спасибо за подробный ответ. У меня установлен модуль рулес и модуль флаг, с помощью них я бы хотел создать несколько правил, но пока никак не удается, вроде бы и логика правильная, но все эти селекторы и т.д. для меня непонятны. Близких примеров к моим проблемам в интернете тоже найти не могу. Если вдруг у вас появится время, то напишите как сделать функцию подписки в связке с этими модулями, на этом примере можно создавать и другие правила, потому, что присутствует связка с флагом и отправкой сообщений.
P.S. На вашем сайте ни одно сообщение не остается без ответа. Вам за это отдельное спасибо..

Nikita Petrov 28.11.2014 - 10:49

Дело в том, что я считаю, что вообще ваша идея с флагом неправильная. Вы собираетесь добавлять КАЖДОМУ юзеру по одному флагу за КАЖДЫЙ материал у вас на сайте? It is insane! Если у вас будет один флаг у одного юзера, и при чекине его юзер будет получать уведомления о каждом изменении всех материалов - это тоже неправильно, я бы на месте такого пользователя быстрее отписался бы от спамного сайта. В общем, вам надо забыть про идею с флагом, разве что только вы знаете что-то о своем задании, чего не знаю я.

Яков 12.12.2014 - 03:45

Добрый день, стоят и mimemail, и htmlmail. Добавляю хтмл код, но! на ящики приходят искареженные хтмл письма, с растянутым на весь экран шаблоном, адскими-кривыми шрифтами (при этом я задавал в коде шрифты нормальные-стандартные). Я бы согласился, что проблема в хтмл коде, но я ставлю этот же самый код в тело письма обычного почтовика Mozzilla Thunderbird и всё приходит красиво. В чем мб проблема?

Дизайнер 25.03.2016 - 18:50

Сделай сайт нормальным. Читать невозможно текст на полупрозрачном фоне.

Стас 01.11.2016 - 10:58

Спасибо большое за статью. Очень помогло. Хотя, видимо, в новых версиях немного по-другому сделано и ссылки не работали, но нашел и так где это. Главное - принцип понял. Но есть проблема другая. Я лишь в рамках школы знаком с программированием, сразу говорю. Так что если есть время ответить, прошу поподробнее (если вообще такое возможно).
На сайте 600 подписчиков. Если высылать письма одному-двум всё нормально. Поставил по 100, а запуск "корн" поставил раз в час (было раз в 3. не знаю не вредно ли было уменьшать до часа). Не доходит. Но на самом почтовом сервере пишут, что строгих ограничений у них нет. Советуют ставить отправку по 1 письму в 10 секунд (это 360 в час, что было бы просто отлично). Вопрос в том, как это сделать? Годится ли для этого модуль simplenews, нужно искать другой или влезать в сами файлы и что-то там менять? Если последнее, то сам simplenews возможно окажется вообще не нужен? На сайте есть модуль "личные сообщения" который позволяет отправлять лс с уведомлением на почту как отдельному пользователю, так и всем пользователям по их роли. Но во втором случае вообще нет никаких настроек задержки и сайт пытается отправить все 600 писем за раз.
Вот... Извините что отвлекаю. Просто именно на Вашем сайте я нашел всё то, что теперь знаю о друпале и если с остальным более-менее разобрался сам, то теперь застрял намертво, а рассылка нужна обязательно. Прежде чем беспокоить искал на других сайтах ответ, но не нашел (может плохо искал).

Nikita Petrov 01.11.2016 - 16:26

Стас, добрый день! Очень приятно получать такие грамотные развёрнутые комментарии, спасибо. У меня есть три идеи по этому поводу:
1. Для друпала есть такая command-line утилита под названием drush. С ее помощью модули реализуют некоторые свои функции чтобы это можно было не делать мышкой через UI. Я посмотрел модуль simplenews, у него есть несколько реализованных команд: http://www.rit.edu/drupal/api/drupal/sites!all!modules!simplenews!simple...
Скорее всего если запустить какую-то команду наподобии drush simplenews spool send или drush simplenews_spool_send (или еще как-то поиграться с поиском запускаемой команды) из терминала по ssh, то отправятся сразу все емейлы которые висят в очереди на отправление. Если запустить команду с параметром, например drush simplenews spool send 10 , то отправится только 10 емейлов. Теперь осталось лишь настроить на сервере крон с запуском этой команды каждые 10 секунд (*/10 * * * * *) и тогда проблема будет решена.
2. Если никак с первым вариантом не получается, то можно настроить выполнение друпал крона каждые 10 секунд. Но боюсь это приведет к жутким тормозам сайта и могут сыпаться ошибки.
3. Можно написать свой модуль которые через hook_menu реализует свою страничку, на которой будет выполнять какие-то php команды для отправки текущих емейлов из очереди simplenews. Надо будет покопать исходный код модуля simplenews чтобы понять какие функции там есть для этого. И затем создать новую крон задачу для запуска именно вашей новой ссылки, т.е. конкретно вашего скрипта, а не всего друпал крона, и частоту опять поставить 10 секунд.
Надеюсь один из них поможет. Удачи!

Viktor 10.05.2017 - 20:39

Спасибо за хорошее решение. Простая реализация, понятная работа модуля.
Был бы благодарен, если бы Вы помогли хотя бы советом на следующую задачу:
Есть форма подписки которая состоит из 2 полей Name и Email (которые вводят пользователи, реализация webform). Но при нажатии кнопки Submit пользователю (анонимному) на указанную почту (а не на почту админа, как в webform) уходит ссылка на скачивание файла, или сам прикрепленный файл. А указанный email записывается куда-либо, чтобы можно было легко просмотреть. Поможет ли в этом связки Simplenews и htmlmail? Думал в этом может помочь webform, но видимо к нему нужно еще прикрутить какой-то модуль, не подскажите какой?
Заранее спасибо! (замучился искать) Еще раз спасибо за совет.

Nikita Petrov 11.05.2017 - 11:42

Я думаю что у вас слишком узкая задача чтобы был большой шанс найти прямо готовый модуль для этого. Я бы сделал так: оставил бы вашу webform, потому что там можно посмотреть список submissions (т.е. все данные, которые когда-либо были введены в вашу форму на сайте). Это решает вашу первую проблему с сохранением емейлов, чтобы их потом можно было легко просмотреть. Дальше нужно создать новый пустой друпал-модуль (http://xandeadx.ru/blog/drupal/256), использовать хук form_alter для того, чтобы добавить выполнение кода при нажатии кнопки "Сохранить" на вашей вебформе.
Пример кода:

function mymodule_form_node_form_alter(&$form,&$form_state,$form_id)
{
     if($form['#node']->type=="my_content_type")
     {
          $form['actions']['submit']['#submit'][]='my_callback_function';
     }
}
 
function my_callback_function($form, &$form_state)
{
     //my code here!!
     //execute after the user submit the node form
     //and then redirect user to another place,after executing the code above
 
}

via
Затем в этой вашей функции сформировать емейл и отправить его на почту пользователя. Почта пользователя будет доступна через переменную $form_state['values']. Отправить на почту можно без модуля simplenews, а через встроенный в ядро друпала метод drupal_mail (вот описание на английском с примером)
Желаю вам успехов в изучении Друпала!

Viktor 15.05.2017 - 10:11

Здравствуйте. Третий день изобретаю велосипед.

Создал веб-форму с помощью модуля webform с двумя полями name и email, также кнопка "Отправить". Далее как Вы указали создал пустой модуль с названием "sub" и содержит два файла: sub.info и sub.module (делал все как указано в ссылке по созданию). Далее в файле sub.module вставил следующий код:

function sub_form_node_form_alter(&$form,&$form_state,$form_id)
{
if($form['#node:10']->type=="webform")
{
$form['actions']['submit']['#submit'][]='callback';
}
}

function callback($form, &$form_state)
{
drupal_mail(
'sub',
'mail',
'$form_state['values']['submitted-email']',
language_default(),

array(
'context' => array(
'subject' => 'There will be an email subject',
'message' => 'There will be an email text',
)
));
}

Использую хук form_alter для того чтобы добавить выполнение кода, после нажатия кнопки "Сохранить". Указываю номер ноды веб-формы и тип контента (указание номер ноды и типа контента на случай, если webform на сайте будет несколько, я правильно понял?). Далее должна выполняться сформированная функция callback, которая отправляет письмо через drupal_mail (где я указываю модуль, идентификатор письмо, адрес получателя через переменную $form_state['values'], и язык письма). И собственно сформированное тело письма через массив который содержит "Тема" и "Сообщение". Так как я только начинающий, еще не разобрался как можно приложить к письму вложенный файл txt, то ссылку на него указываю просто в "Сообщение".
Но письмо не доходит по тому адресу которое ввел в форму. Видимо я что-то не так делаю? Большое спасибо.

Nikita Petrov 15.05.2017 - 13:32

Ну во-первых надо проверить, точно ли выполняется ваша функция callback. (Кстати я бы лучше не использовал такие распространенные имена функций, мало ли, вдруг уже есть такая. Надо как минимум назвать sub_callback, а лучше sub_contact_webform_callback ну это не сильно важно). Для этого включите модуль devel, и внутри функции напишите что-то типа krumo('ok'); или можно dpm('ok');
Заполните вебформу, нажмите сохранить, должно появиться белая страница с надписью ok. Если это так, то все нормально, попробуйте тогда вместо $form_state['values']['submitted-email'] написать свой емейл вручную сразу. Ааааа ну вот и ошибка видна - у вас это строка, т.е. $form_state['values']['submitted-email'] находится в кавычках. Должно быть

drupal_mail(
'sub',
'mail',
$form_state['values']['submitted-email'],
language_default(),
Viktor 15.05.2017 - 21:38

Большое спасибо. Все выполнил, решил я все это проверить на хостинге, причем с dpm('ok') внутри функции, для простоты проверки. Создавал модуль по всем правилам, проверил чтобы имена сходились и файлы были UTF-8 without BOM. Перекинул на хостинг sites/all/modules/mymodule и такой вариант пробовал sites/all/modules/custom/mymodule. Не включается, после нажатия "save" перекидывает на "Страница недоступна"! Думал проблема в правах доступа на хостинге, но все нормально 755. Кэш чистил. Даже ума теперь не приложу в чем может быть загвоздка, ведь включение модуля не зависит от функций, которые внутри файла mymodule.module.

Viktor 16.05.2017 - 09:08

Попробовал подключить модуль, когда файл mymodule.module пустой (есть только строка "<?php"). включается и сохраняет конфигурацию.
Я конечно слабо понимаю обращение функции к форме, но "function mymodule_form_node_form_alter(&$form,&$form_state,$form_id)" вроде используется в drupal 8, а в 7.x system.api.php hook_form_alter(&$form, &$form_state, $form_id).

Nikita Petrov 16.05.2017 - 14:17

Я не использую амперсанд, т.е. &$form и $form будут работать одинаково, не знаю, в этом ли проблема. Пробуйте возвращать код по частям, т.е. вернуть сначала пустую функцию, потом вернуть первую строчку этой функции и каждый раз включать модуль. После какой строчки появится ошибка - ее и разбирать.

Viktor 11.05.2017 - 20:18

Спасибо огромное за столь развернутый ответ. Суть реализации мне понятна, буду стараться воплотить ее.
Благодарю!

Добавить комментарий