Рассылка поздравлений с днями рождений

Подскажите существуют ли компоненты для рассылки поздравлений с днём рождения пользователям, которые берут дату из профиля в modx? Пытаюсь найти и нашла только birthReminder, но это скорее личный календарь для оповещения. Не может же быть, что за столько лет не появилось такого функционала? Может кто видел подходящие решения?
Ксения
05 апреля 2018, 06:25
modx.pro
2
2 105
0

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

Павел Романов
05 апреля 2018, 10:44
0
Сделайте сниппет, который будет пробегаться по юзерам, получать ДР и, если день/месяц совпадают с текущим, то слать письмо.
Поставьте CronManager и запускайте каждое утро.
    Ксения
    05 апреля 2018, 12:03
    0
    Если б всё было так просто…
    Дни рождения хранятся в формате Unix Timestamp и как в этом случае сравнивать ещё придумать надо.
    Просто так слать письмо не получиться, вдруг сегодня 100 именинников, значит надо организовывать очередь рассылки. И скорее всего ещё что-нибудь выплывет. Поэтому искала готовое решение, думала, что существует что-то.
      Дмитрий
      05 апреля 2018, 12:21
      0
      1) Отформатировать дату в какой-нибудь формат это как бы вообще не проблема. Достаточно привести к виду дд/мм и сравнивать их например.
      2) Для отправки очереди писем, чтобы хостинг не подумал, что через него спам рассылают можно подключить API какого-нибудь сервиса рассылок, типа Unisender. Там письма довольно легко отправлять.
    Сергей Шлоков
    05 апреля 2018, 16:35
    +5
    Берём 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.
      Ксения
      05 апреля 2018, 18:10
      0
      Спасибо. Только что узнала о существовании modHelpers. Интересная утилита.
      Можно пару уточнений? Здесь очередь рассылки никак не учитывается? То есть если будет 100 пользователей с ДР, то сразу отправится 100 писем? Cron надо запускать раз в сутки если не ошибаюсь? (иначе будет рассылать повторно?)

      Кстати, именно для рассылки наткнулась на очень интересное приложение goodnews, может кому пригодится.
        Сергей Шлоков
        06 апреля 2018, 07:27
        +1
        Очередь нужно организовать самостоятельно. Вариантов несколько. Я бы предложил использовать кэш.
        Шаг 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');
        Ксения
        09 апреля 2018, 11:58
        0
        Здравствуйте, Сергей! Что-то не так «чирикается». Первому пользователю письмо приходит как надо (учитывается верстка письма и отправитель), а следующим всё приходит в виде текста (со всеми div, br и т.д. в печатном виде) да и с адреса, указанного в настройках сервера, а не modx. (отправляла вручную пока, без cron, но вряд ли это влияет) Поможете?
          Сергей Шлоков
          09 апреля 2018, 20:24
          0
          Сбросьте доступы в личку, гляну.
            Ксения
            09 апреля 2018, 21:21
            0
            С доступами сложно… Сделала копию на modhost, правда там функция 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] => Поздравляем с Днём рождения!

            )
              Сергей Шлоков
              09 апреля 2018, 21:46
              0
              Не должно быть. Это баг. Завтра поправлю.

              П.С. Я бы ещё посоветовал ограничить список полей через select(). Не зачем ненужные поля выводить.
                Ксения
                09 апреля 2018, 22:07
                0
                посоветовал ограничить список полей через select()
                пример бы очень пригодился
                  Сергей Шлоков
                  09 апреля 2018, 22:13
                  0
                  Читайте документацию.
                    Ксения
                    09 апреля 2018, 22:19
                    0
                    Я её уже всю прочитала, но без примеров сложно.
                    Я так понимаю, надо добавить строку
                    ->select('id')
                    , но как выбрать сразу несколько полей
                    ->select('id,email,dob')
                    так будет работать?
                      Сергей Шлоков
                      09 апреля 2018, 22:30
                      0
                      Ну в самом первом примере есть же select().

                      Добавил пример в описание метода select.

                      так будет работать?
                      А попробовать?
          Ксения
          09 апреля 2018, 17:08
          0
          Через cron то же самое. Все, кроме первого письма, отправляются не с ящика указанного в настройках сайта, а с не существующего ящика «владельца» сервера user_owner@site.com и без форматирования. Похоже, что настройки подхватываются только для первого письма (пользователя) из массива.
            Ксения
            01 мая 2018, 16:49
            0
            Можно ещё вопрос? Такое ощущение, что количество операций с массивом ограничено 2 двумя
            например в сниппете
            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 и всё )

            Это так и должно быть или я что-то не так делаю?
              Ксения
              01 мая 2018, 20:30
              0
              Опытным путём выяснила, что это происходит из-за того, что в начале идёт выборка по 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();
                      }
                  });
                Ксения
                01 мая 2018, 20:55
                0
                вопрос решился заменой на
                ->members(10,12)
                (причем с названиями групп не работало, заработало только с id)
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          19