Рассылка поздравлений с днями рождений
Подскажите существуют ли компоненты для рассылки поздравлений с днём рождения пользователям, которые берут дату из профиля в modx? Пытаюсь найти и нашла только birthReminder, но это скорее личный календарь для оповещения. Не может же быть, что за столько лет не появилось такого функционала? Может кто видел подходящие решения?
Комментарии: 19
Сделайте сниппет, который будет пробегаться по юзерам, получать ДР и, если день/месяц совпадают с текущим, то слать письмо.
Поставьте CronManager и запускайте каждое утро.
Поставьте CronManager и запускайте каждое утро.
Если б всё было так просто…
Дни рождения хранятся в формате Unix Timestamp и как в этом случае сравнивать ещё придумать надо.
Просто так слать письмо не получиться, вдруг сегодня 100 именинников, значит надо организовывать очередь рассылки. И скорее всего ещё что-нибудь выплывет. Поэтому искала готовое решение, думала, что существует что-то.
Дни рождения хранятся в формате Unix Timestamp и как в этом случае сравнивать ещё придумать надо.
Просто так слать письмо не получиться, вдруг сегодня 100 именинников, значит надо организовывать очередь рассылки. И скорее всего ещё что-нибудь выплывет. Поэтому искала готовое решение, думала, что существует что-то.
1) Отформатировать дату в какой-нибудь формат это как бы вообще не проблема. Достаточно привести к виду дд/мм и сравнивать их например.
2) Для отправки очереди писем, чтобы хостинг не подумал, что через него спам рассылают можно подключить API какого-нибудь сервиса рассылок, типа Unisender. Там письма довольно легко отправлять.
2) Для отправки очереди писем, чтобы хостинг не подумал, что через него спам рассылают можно подключить API какого-нибудь сервиса рассылок, типа Unisender. Там письма довольно легко отправлять.
Берём modHelpers и чирикаем
users()
->profile()
->where('modUser.active = 1 AND DAYOFMONTH(FROM_UNIXTIME(Profile.dob)) = DAYOFMONTH(now()) AND MONTH(FROM_UNIXTIME(Profile.dob)) = MONTH(now())')
->each(function($user, $idx) {
if (is_email($user['email'])) {
email()->to($user['email'])->subject('Поздравляем с Днём рождения!')->tpl('chunkName', $user)->send();
}
});
Вызывать через cron.
Спасибо. Только что узнала о существовании modHelpers. Интересная утилита.
Можно пару уточнений? Здесь очередь рассылки никак не учитывается? То есть если будет 100 пользователей с ДР, то сразу отправится 100 писем? Cron надо запускать раз в сутки если не ошибаюсь? (иначе будет рассылать повторно?)
Кстати, именно для рассылки наткнулась на очень интересное приложение goodnews, может кому пригодится.
Можно пару уточнений? Здесь очередь рассылки никак не учитывается? То есть если будет 100 пользователей с ДР, то сразу отправится 100 писем? Cron надо запускать раз в сутки если не ошибаюсь? (иначе будет рассылать повторно?)
Кстати, именно для рассылки наткнулась на очень интересное приложение goodnews, может кому пригодится.
Очередь нужно организовать самостоятельно. Вариантов несколько. Я бы предложил использовать кэш.
Шаг 1. Отдельным скриптом сохранять письма в кэш.
Шаг 2. Другим скриптом зачитывайте кэш, например, раз 10 минут в течение часа.
Шаг 1. Отдельным скриптом сохранять письма в кэш.
users()
->profile()
->where('modUser.active = 1 AND DAYOFMONTH(FROM_UNIXTIME(Profile.dob)) = DAYOFMONTH(now()) AND MONTH(FROM_UNIXTIME(Profile.dob)) = MONTH(now())')
->save('birthdays');
В папке core/cache/queue появится файл birthdays.cache.php с массивом писем. У метода save() есть второй параметр, который отвечает за режим работы: true — пересоздать файл, false — дописать данные. По умолчанию, false. Т.е. очередь дописывается.Шаг 2. Другим скриптом зачитывайте кэш, например, раз 10 минут в течение часа.
$emails = cache('birthdays', 'queue');
Бейте массив на 2 части. По первой части работаете (функция email), а вторую опять сохраняете в кэш.cache()->set('birthdays', $emails, 'queue');
Здравствуйте, Сергей! Что-то не так «чирикается». Первому пользователю письмо приходит как надо (учитывается верстка письма и отправитель), а следующим всё приходит в виде текста (со всеми div, br и т.д. в печатном виде) да и с адреса, указанного в настройках сервера, а не modx. (отправляла вручную пока, без cron, но вряд ли это влияет) Поможете?
Сбросьте доступы в личку, гляну.
С доступами сложно… Сделала копию на modhost, правда там функция mail отключена, но сделала вывод в лог, вроде всё идентично.
Так и должно быть, что при 2м проходе в array указано два email? Если так и должно быть поищу хостинг где можно сделать копию с рабочей функцией mail.
Так и должно быть, что при 2м проходе в array указано два email? Если так и должно быть поищу хостинг где можно сделать копию с рабочей функцией mail.
Array
(
[sender] => admin@s13574.h10.modhost.pro
[from] => admin@s13574.h10.modhost.pro
[fromName] => MODX Revolution
[setHTML] => 1
[to] => Array
(
[0] => 1@mail.com
)
[subject] => Поздравляем с Днём рождения!
[tpl] => Array
(
[name] => email
[data] => Array
(
[id] => 2
[username] => user1
[password] => ypnyTP15I2wEXrPw7NSykSmXp21POXOiRPr9IRgL56A=
[cachepwd] =>
[class_key] => modUser
[active] => 1
[remote_key] =>
[remote_data] =>
[hash_class] => hashing.modPBKDF2
[salt] => b47e3229aafa83301fb7f659731a8f0b
[primary_group] => 0
[session_stale] =>
[sudo] => 0
[createdon] => 1523295667
[internalKey] => 2
[fullname] =>
[email] =>1@mail.com
[phone] =>
[mobilephone] =>
[blocked] => 0
[blockeduntil] => 0
[blockedafter] => 0
[logincount] => 0
[lastlogin] => 0
[thislogin] => 0
[failedlogincount] => 0
[sessionid] =>
[dob] => 1523221200
[gender] => 0
[address] =>
[country] =>
[city] =>
[state] =>
[zip] =>
[fax] =>
[photo] =>
[comment] =>
[website] =>
[extended] => []
)
)
[content] => Поздравляем с Днём рождения!
)
[2018-04-09 21:11:37] (DEBUG @ /home/s13574/www/core/components/modhelpers/classes/Mailer.php: 444) Array
(
[sender] => admin@s13574.h10.modhost.pro
[from] => admin@s13574.h10.modhost.pro
[fromName] => MODX Revolution
[setHTML] => 1
[to] => Array
(
[0] => 1@mail.com
[1] => 2@mail.com
)
[subject] => Поздравляем с Днём рождения!
[tpl] => Array
(
[name] => email
[data] => Array
(
[id] => 3
[username] => user2
[password] => mtOJWSyxaSy2wZBFN2h34kFdltdGX4qZvxRMa3xnc+4=
[cachepwd] =>
[class_key] => modUser
[active] => 1
[remote_key] =>
[remote_data] =>
[hash_class] => hashing.modPBKDF2
[salt] => d289198fee7c610d6212d2e3314f3771
[primary_group] => 0
[session_stale] =>
[sudo] => 0
[createdon] => 1523295710
[internalKey] => 3
[fullname] =>
[email] => 2@mail.com
[phone] =>
[mobilephone] =>
[blocked] => 0
[blockeduntil] => 0
[blockedafter] => 0
[logincount] => 0
[lastlogin] => 0
[thislogin] => 0
[failedlogincount] => 0
[sessionid] =>
[dob] => 1523221200
[gender] => 0
[address] =>
[country] =>
[city] =>
[state] =>
[zip] =>
[fax] =>
[photo] =>
[comment] =>
[website] =>
[extended] => []
)
)
[content] => Поздравляем с Днём рождения!
)
Не должно быть. Это баг. Завтра поправлю.
П.С. Я бы ещё посоветовал ограничить список полей через select(). Не зачем ненужные поля выводить.
П.С. Я бы ещё посоветовал ограничить список полей через select(). Не зачем ненужные поля выводить.
посоветовал ограничить список полей через select()пример бы очень пригодился
Читайте документацию.
Я её уже всю прочитала, но без примеров сложно.
Я так понимаю, надо добавить строку
Я так понимаю, надо добавить строку
->select('id')
, но как выбрать сразу несколько полей ->select('id,email,dob')
так будет работать?
Ну в самом первом примере есть же select().
Добавил пример в описание метода select.
Добавил пример в описание метода select.
так будет работать?А попробовать?
Через cron то же самое. Все, кроме первого письма, отправляются не с ящика указанного в настройках сайта, а с не существующего ящика «владельца» сервера user_owner@site.com и без форматирования. Похоже, что настройки подхватываются только для первого письма (пользователя) из массива.
Можно ещё вопрос? Такое ощущение, что количество операций с массивом ограничено 2 двумя
например в сниппете
(то есть работают любые 2 операции после where и всё )
Это так и должно быть или я что-то не так делаю?
например в сниппете
users()
->members('ru')
->members('work')
->profile()
->select('id,email,dob')
->profile()
->where('modUser.active = 1 AND DAYOFMONTH(FROM_UNIXTIME(Profile.dob)) = DAYOFMONTH(now()) AND MONTH(FROM_UNIXTIME(Profile.dob)) = MONTH(now())')
->leaveGroup(4)
->leaveGroup(12)
->joinGroup(5,2)
->each(function($user, $idx) {
if (is_email($user['email'])) {
email()->to($user['email'])->subject('Поздравляем с Днём рождения!')->tpl('chunkRuName', $user)->send();
}
});
последней операцией будет leaveGroup(12)
и дальше ничего происходить не будет. Ошибок в журналах тоже нет. (Если убрать любые пару строк про группы, например ->leaveGroup(12)
->joinGroup(5,2))
то весь сниппет отработает.(то есть работают любые 2 операции после where и всё )
Это так и должно быть или я что-то не так делаю?
Опытным путём выяснила, что это происходит из-за того, что в начале идёт выборка по 2м группам.
Такой сниппет работает
->members('ru')
->members('work')
Если выбирать по одной группе, то сниппет отрабатывает нормально. Но мне надо выбирать по двум группам, есть какое-то решение для данной ситуации?Такой сниппет работает
users()
->members('ru')
->profile()
->where('modUser.active = 1 AND DAYOFMONTH(FROM_UNIXTIME(Profile.dob)) = DAYOFMONTH(now()) AND MONTH(FROM_UNIXTIME(Profile.dob)) = MONTH(now())')
->leaveGroup(4)
->leaveGroup(12)
->joinGroup(5,2)
->each(function($user, $idx) {
if (is_email($user['email'])) {
email()->to($user['email'])->subject('Поздравляем с Днём рождения!')->tpl('chunkRuName', $user)->send();
}
});
а такой выполняет только две операции и отваливаетсяusers()
->members('ru')
->members('work')
->profile()
->where('modUser.active = 1 AND DAYOFMONTH(FROM_UNIXTIME(Profile.dob)) = DAYOFMONTH(now()) AND MONTH(FROM_UNIXTIME(Profile.dob)) = MONTH(now())')
->leaveGroup(4)
->leaveGroup(12)
->joinGroup(5,2)
->each(function($user, $idx) {
if (is_email($user['email'])) {
email()->to($user['email'])->subject('Поздравляем с Днём рождения!')->tpl('chunkRuName', $user)->send();
}
});
вопрос решился заменой на
->members(10,12)
(причем с названиями групп не работало, заработало только с id)
Функция members принимает только один аргумент.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.