Наверх

Новая версия Sendex

На своем сайте для рассылки новых статей я использую компонент Sendex. На данный момент у меня всего 59 подписчиков, но так как хостинг у меня простенький, за один запрос все письма не отправляются. Раньше в кроне стояло задание, по которому раз в 5 минут отправлялись 20 писем. Но мне такая система не очень нравится — я люблю все контролировать сам. Хочу, чтобы можно было сначала отправить письмо себе, потом, если письмо отправилось некорректное, удалить все письма и сгенерировать новую версию.

Поэтому я форкнул Sendex и добавил в табличку писем массовые операции. Василий принял мой Pull Request и теперь в Sendex можно зажать клавишу Shift и выделить сразу несколько писем. Выделенные письма можно удалить или отправить.


Кроме того, в новой версии появились параметры для отслеживания событий. При отправке письма с ссылкой для активации, к адресу страницы приписывается параметр sx_subscribed. Отслеживая этот параметр, вы можете показывать пользователю нужное сообщение.

При подтверждении подписки (при переходе по ссылке из письма), добавляется параметр sx_confirmed, а при отписке — sx_unsubscribed. Пример использования вы можете видеть прямо у меня на сайте:

Ну и еще исправлен баг, когда в админке не отображалось изображение, прикрепленное к рассылке.


32 комментария

  1. Darklelik Darklelik 29 июля 2014, 17:22 # 0
    Приветствую. А подскажите как у Вас сделано уведомление…
    Письмо-подтверждение отправлено на почту. Перейдите по ссылке из письма.
    на jquery просто?
    1. Илья Уткин 30 июля 2014, 12:53 # 0
      Нет, простым сниппетом:
      if ($_GET['sx_subscribed']) {
        return '<div class="alert alert-success">
          Письмо-подтверждение отправлено на почту. Перейдите по ссылке из письма.
        </div>';
      }
      1. Darklelik Darklelik 30 июля 2014, 18:00 # 0
        Спасибо! Я сделал на jquery… но Ваш вариант тоже забрал )))
    2. Михаил 05 августа 2014, 09:25 # 0
      Илья, добрый день! Вопрос небольшой по разработке компонента. Вот все ничего, а как например добавить через сам компонент дополнительные поля в таблицу? Ну или еще создать таблицу при обновлении пакета.
      1. Илья Уткин 19 августа 2014, 06:46 # 0
        Вот в этом уроке Василий приводит такой код:
        <?php
        $manager = $modx->getManager();
        // ...
        // Запоминаем текущий уровень ошибок
        $level = $modx->getLogLevel();
        // Выставляем самый мощный уровень, чтобы не было ругани в логах при попытке создания существующих полей
        $modx->setLogLevel(xPDO::LOG_LEVEL_FATAL);
        
        // Добавляем поле и индекс
        $manager->addField('sxQueue', 'hash');
        $manager->addIndex('sxQueue', 'hash');
        
        // Возвращаем старый уровень логирования
        $modx->setLogLevel($level);
        Думаю, что как-то так и можно создать новые поля.
        1. Михаил 19 августа 2014, 06:50 # 0
          Да, тут разобрался. Просто у меня небольшой косяк был при установке. Видать и не так шло. Сейчас все ок!
      2. Артём 18 июня 2015, 15:46 # 0
        Илья, добрый день!
        Каким образом можно осуществить подписку через форму на сайте для неавторизованных пользователей?
        1. Илья Уткин 19 июня 2015, 08:30 # 0
          Нужно установить Sendex и вызвать его в нужном месте на странице
        2. Саша 07 июля 2015, 18:08 # 0
          Здравствуйте. Посоветуйте адекватное решение для сайт на modx evo 1.0.12
          чтобы организовать рассылку по одному email
          1. Илья Уткин 08 июля 2015, 06:15 # 0
            Либо самостоятельно писать код и отправлять почту с помощью SMTP, либо использовать Unisender или аналоги.
          2. Эрик Байгузин 15 марта 2016, 07:37 # 0
            Илья, здравствуйте. Не знаете случайно как сделать автоматическую подписку пользователя при регистрации? (использую Office)
            1. Илья Уткин 15 марта 2016, 08:03 # 0
              Только если написать плагин, который будет получать через xPDO нужную подписку и выполнять метод Subscribe
              1. Эрик Байгузин 15 марта 2016, 08:08 # 0
                Это решение marabar.ru/blog/snippetyi-modx/121/ может подойти для Office?
                1. Илья Уткин 15 марта 2016, 08:09 # 0
                  Может, почему бы и нет.
                  1. Эрик Байгузин 15 марта 2016, 08:14 # 0
                    Только у меня ощущение, что
                    &postHooks=`subscription`
                    &idnewsletter=`1`
                    
                    не работает в вызове
                    [[!Office ?&action=`Auth`
                    &postHooks=`subscription`
                    &idnewsletter=`1`
                    &groups=`Users`
                    &HybridAuth=`0`
                    &loginResourceId=`1`
                    &logoutResourceId=`2`
                    ]]
            2. Amsterdam 09 августа 2016, 11:34 # 0
              Ок, один вопрос, как сделать отправку не всем подписчикам сразу, а только одному??

              Этот код засылает всем разом.
              $q = $modx->newQuery('sxQueue');
              $queue = $modx->getCollection('sxQueue');
              /** @var sxQueue $email */
              foreach ($queue as $email) {
              	$email->send();
              }
              Нужно вычленить одного и отправить только ему
              1. Илья Уткин 09 августа 2016, 11:42 # 0
                Этого не знаю. По идее, вообще Sendex для этого не нужен. Можно вручную отправить письмо.
                1. Amsterdam 09 августа 2016, 11:49(Комментарий был изменён) # 0
                  Понятно что можно отправить вручную, но делать этого никто не хочет. стоит задача отправить автоматичсеки письмо из рассылки одному подписанному юзеру, который написал письмо с formit.

                  а если вы имели ввиду, что после события отправить одно письмо, да, можно было бы, если бы это требовалось делать каждый раз, после того как юзер заслал письмо. но проблема в том, что сделать это нужно единожды. Сендекс для этого хорошо подходит тем, что после отправки удаляет письмо из очереди
                  1. Amsterdam 09 августа 2016, 12:31 # 0
                    а за определенную сумму, вы сможете узнать? там ну полюбому одна строчка. только надо более менее знать xPDO
                    1. Илья Уткин 09 августа 2016, 13:01 # 0
                      К сожалению, сейчас нет времени. Напишите объявление о работе на modx.pro/work/ — я же не единственный специалист.
                2. nweb 27 сентября 2016, 10:52 # 0
                  Илья, подскажите, пожалуйста: можно ли указывать кастомную тему письма для Sendex? Sendex инициализируется при добавлении тикета в Tickets. Хотелось бы, в тему письма вставлять pagetitle этого тикета.
                  1. Илья Уткин 27 сентября 2016, 15:47 # 0
                    Да, при инициализации что-то типа такого
                    if ($newsletter = $modx->getObject('sxNewsletter', $subscrId)) {
                        $email_subject = $newsletter->get('email_subject');
                        $newsletter->set('email_subject', $resource->get('pagetitle'));
                        $newsletter->save();
                        $response = $newsletter->addQueues();
                        if ($response !== true) {
                            echo $response;die;
                        }
                        $newsletter->set('email_subject', $email_subject);
                        $newsletter->save();
                    }
                  2. nweb 01 октября 2016, 11:05 # 0
                    Спасибо!
                    1. Евгений 22 февраля 2017, 12:50 # 0
                      Здравствуйте, Илья!
                      А не подскажете, как корректно подружить AjaxForm и Sendex?
                      Использовал такую конструкцию
                      [[!AjaxForm?
                      	&snippet=`Sendex`
                              &id=`1`
                             &form = `tpl.Sendex.subscribe.guest`]]
                      
                      форма:
                      <form id="subcsribe" action="" method="post" class="ajax_form">
                      <div class="subscribe-box__content">
                      <div class="subscribe__heading">Подписаться на акции</div>
                      <label for="subsc-email" class="subscribe__label">Введите свой email, будьте в курсе новых акций</label>
                      <input type="email" name="email" id="email"  class="inp"/>
                      </div>
                      <div class="subscribe-box__footer">
                      <input type="hidden" name="sx_action" value="subscribe">
                      <button type="submit" class="btn yellow ">Подписаться</button>
                      </div>
                      </form>
                      Но толку никакого, форма после этого зависает, я так понимаю, что не происходит событие ajax_submit, не могли вы просветить? Отправка на почту при этом работает
                      1. Илья Уткин 27 февраля 2017, 15:45 # 0
                        К сожалению, сам не сталкивался с такой задачей и подсказать не смогу.
                      2. Владимир 22 марта 2017, 12:53(Комментарий был изменён) # 0
                        Здравствуйте, Илья.
                        Подскажите, пожалуйста, в чем может быть причина того, что после подписки с фронтэнда подписчик не добавляется в список пользователей сайта. В связи с этим соответственно не могу его вручную подписать на другую подписку. Раньше на MODX 2.4.2 (сейчас 2.5.5) все работало отлично. Сейчас вроде делаю все так же — в подписку email добавляется, но пользователь не создается.
                        1. Илья Уткин 23 марта 2017, 08:49 # 0
                          По-моему, и раньше пользователь не создавался — в Sendex можно подписывать просто по E-mail. Пользователь подписывается только если он авторизован во время подписки. Если нет — просто создаётся подписчик по E-mail. Пользователя можно создать вручную и подписать его на нужные подписки.
                        2. Кирилл 22 марта 2018, 15:08 # 0
                          Илья, подскажи пожалуйста, я так понимаю что Sendex не поддерживает синтаксис fenom в чанках?? Например чанк tpl.Sendex.activate и плейсхолдер [[+link]] не преобразется в fenom, ни {$link}, ни {$_pls['link']}
                          1. Илья Уткин 23 марта 2018, 09:14 # 0
                            Да, Sendex не поддерживает Fenom. Возможно, заработает, если глобально включить использование Fenom на страницах.
                          2. AX 28 января 2022, 09:33 # 0
                            Не подскажите как исправить такие сообщения об ошибке?
                            PHP warning: Undefined array key "sx_subscribed"
                            PHP warning: Undefined array key "sx_confirmed"
                            PHP warning: Undefined array key "sx_unsubscribed"
                            Появились после перехода на PHP 8
                            1. Илья Уткин 28 января 2022, 11:41 # 0
                              поменять везде if ($_GET['sx_subscribed']) { на if (!empty($_GET['sx_subscribed'])) {
                              1. AX 28 января 2022, 12:22 # 0
                                Спасибо!

                            Авторизация

                            через сервис Loginza:


                            Шаблоны MODX

                            1 2 Дальше »

                            Объектная
                            модель
                            MODX