В настройках уведомлений пользователя везде установлены галочки "отправлять по email" (http://cl.ly/Xx56) При новых комментариях или лайках на сайте уведомления появляются, однако почта не приходит. Отправка других email (например, восстановление пароля) работает.
Каким образом добавить обработчик события, который бы отправлял на почту это уведомление? Чтобы обновление ничего не сломало.
Пробовал сделать в init.php примерно такое: [CODE] AddEventHandler('im', "OnAddRatingVote", "OnAfterImHandler" ;) ; function OnAfterImHandler($arFields) { die('Sup'); } [/CODE] Но увы, код внутри коллбека не выполняется. Нашёл пост на форуме без единого ответа от 12 года и только.
Далее, внутри bitrix/modules/im/classes/general/im_mail.php есть метод MailMessageAgent(), внутри которого есть строка: [CODE] $arUnsendMessage = CIMMessage::GetUnsendMessage(); [/CODE] Но она всегда возвращает пустое количество сообщений ибо к моменту данного запроса уведомление новое уже отправлено и установлен флаг успеха.
политика такова, что мыло - крайний канал для отправки уведомлений, когда их не удалось доставить другими способами. и в этом есть своя логика, иначе пользователи могут взвыть из-за количества почтового спама
nukemonk пишет: политика такова, что мыло - крайний канал для отправки уведомлений, когда их не удалось доставить другими способами. и в этом есть своя логика, иначе пользователи могут взвыть из-за количества почтового спама
У пользователей ведь есть настройка, которая позволяет гибко управлять уведомлениями: http://cl.ly/Xx56 Проблема в том, что при установленных флагах (самим пользователем) никаких уведомлений нет. Пробовал найти почему так происходит, однако концов не смог найти, кроме того, что методы из класса CIMMail не вызываются вообще нигде в коде. По этой причине решил добавить на необходимые события обработчик, который бы проверял настройку и, если она включена, отправлял бы письмо). Однако, обработчик события тоже не работает. Теперь я в смятении и необходима помощь более опытных в Битриксе коллег.
nukemonk пишет: ну, я вам объяснил, как действует эта настройка :) только сейчас посмотрел на ваш обработчик. где вы такое событие взяли?
Хорошо. Тогда каким образом переопределить поведение данной настройки?
Событие я взял из двух источников: 1. Документация (http://dev.1c-bitrix.ru/api_help/main/events/#rating) 2. Исходный код (bitrix\modules\im\classes\general\im_event.php, метод \Bitrix\Im\CIMEvent: :o nAddRatingVote() )
Хм, если я неправильно изначально понял логику, то вот другой пример что сделал: 1. В настройках пользователя отключил уведомления по всем направлениям (сайт/приложение и внешние клиенты), оставил только email. 2. Из-под другого пользователя лайкнул комментарий и ответил на него (под загруженной фото). Письмо не пришло.
При лайке отправляется запрос на http://bitrixtest.local/bitrix/components/bitrix/rating.vote/vote.ajax.php Дебаггером выяснил, что запрос проходит через: 1. vote.ajax.php 2. CRatings::AddRatingVote() 3. Внутри него вызывается GetModuleEvents("main", "OnAddRatingVote", true), в котором содержится уже CIMEvent: :o nAddRatingVote() (из модуля 'im') 4. При этом, CIMMail (внутри modules/im/mail/) нигде не вызывается, хотя именно он должен отправлять уведомление по почте, если я правильно понял.
К сожалению, уже запутался.. Есть задача: отправлять уведомления по почте, если пользователь в настройках поставил галочку об этом, но оно не работает. Где ещё посмотреть или что сделать дабы восстановить работоспособность уведомлений по почте?
Насчёт того, что событие модуля main, а не im это верно, спасибо за поправку, я был невнимателен. Коллбек теперь выполняется, да. Однако в $arFields передаётся int (o.0) Подскажите, пожалуйста, каким образом в этом обработчике получить текст уведомления и отправить письмо по почте пользователя? Или где конкретно об этом прочесть, если "из коробки" оно не работает?
поведение настройки не переопределить как-то штатно, только вот на событиях и вам придётся дублировать часть работы метода CIMMail::MailNotifyAgent(), а именно добавление уведомления в почтовую очередь.
было бы гораздо проще, если бы мессенджеру при добавлении уведомления можно было бы передавать параметр отправить в почту немедленно, но я такого не нашёл при беглом просмотре кода, увы.
вообще тут всё не очень хорошо, придётся подумать над реализацией: вам при принудительной постановке уведомления в очередь надо будет избежать повторной постановки в очередь этого же уведомления почтовым агентом мессенжера. надо читать код, чтобы понять как это сделать
так вы не цепляйтесь к событию этому, вам надо цепляться к событию мессенжера OnBeforeNotifyAdd или как там его. или даже на OnAfter..., если не будет нужно по логике модифицировать сообщение
ну смотрите, как всё работает для отсылки почты: 1. добавляется уведомление в мессенжер (при этом два вышеупомянутых события мессенжера вызываются) 2. периодически вызывается агент мессенжера CIMMail::MailNotifyAgent(), который собирает считающиеся недоставленными по каким-то там критериям пользователю уведомления и отправляет их в почтовую очередь, при этом там должен устанавливаться какой-то флаг, который не даст таким уведомлениям попадать в очередь больше одного раза (не читал, посмотрите сами, вам он понадобится)
т.е. вам в вашем обработчике надо будет 1. поставить уведомление немедленно в почтовую очередь 2. предотвратить его повторное туда попадание при отработке почтового агента мессенжера
да, кстати, понял, что есть ещё вариант решения, даже проще: 1. отключаете штатный почтовый агент мессенжера 2. пишете и подключаете свой, который будет ставить уведомления в очередь по вашим критериям (или без агента, в обработчике события сразу ставите в почтовую очередь)
В $message передаётся нужный тест MESSAGE_OUT и остальные параметры. Send() возвращает id нового сообщения и совпадает с добавленной записью в b_event. Через некоторое время (кстати, каким образом оно работает, если я в crontab ничего не писал? И как уменьшить эту задержку?) статус SUCCESS_EXEC обновляется со значением "O" и почта не отправляется.
Подскажите, пожалуйста, почему так происходит и, может, как это исправить? Спасибо.
Вместо & # 9 1 ; и & # 9 3 ; должны быть квадратные скобки, но, к сожалению, я не нашёл способа обойти парсер, который их ломает в коде. Забавно, что вне тега code они не ломаются.
Разобрался, поправил. Но теперь каждое уведомление рассылает письма для нового события и всех предыдущих. Где теперь нужно вставить свой код чтобы проверять данную ситуацию и можно было обновлять Битрикс?
Роман Артурович пишет: Но теперь каждое уведомление рассылает письма для нового события и всех предыдущих.
не понял. рассылает, наверное не оно, а штатный агент мессенжера. я же писал об этом, что при добавлении в почтовую очередь самостоятельно, надо исключить повторное добавление штатным агентом. посмотрите код штатного агента мессенжера CIMMail::MailNotifyAgent(), где-то там должна ставиться отметка, что уже отправлено почтой уведомление (или уведомления). что касается кронтаба - агенты работают либо на кроне, либо на хитах. у вас, очевидно, второе
Спасибо, разобрался как работают эвенты без крона. Если пользователей немного, то быстрых уведомлений ожидать не стоит ):
Насчёт дублей. Как их проверить? В моём коллбеке я делаю CEvent::Send('EMAIL_TEST', $siteId, $message, 'Y', $templateId); (см. скриншот ) и моё письмо приходит раза в два быстрее, чем IM_NEW_NOTIFY. Если закомментировать эту строку (№34), то не приходит вообще ни одно письмо, даже не моё.
К тому же, на некоторые события (например, коммент в задаче) приходит IM_NEW_NOTIFY, а на другие (например, коммент к фото или лайк) приходят только мои и никакие больше. Каким образом узнать пошлёт сам Битрикс письмо или нет внутри моего коллбека?
Более того, IM_NEW_NOTIFY посылает предыдущее письмо. То есть, я добавил коммент с текстом "ааа". Затем добавил коммент "ббб". Тогда пользователю придёт мыло с текстом "Кто-то там добавил комментарий с текстом "ааа"".
Приветствую. Какой день борюсь с уведомлениями, такая же проблема с отправкой писем на почту если уведомление не прочитано.
У меня стоит задача/ Когда новость прокомментировали в веб-мессенджер отправляется уведомление. - http://i.imgur.com/c93i5A4.png (Вот как создается уведомление - http://i.imgur.com/yGLQush.png) Если уведомление не прочитано в течении получаса, требуется отправить на почту письмо
В NOTIFY_TAG я поместил параметры для того чтобы мог вытянуть для формирования ссылки, в обработчике перед отправкой на почту. - http://i.imgur.com/p1h2B1m.png
Уведомление планирую получить - $resGetNotify = CIMNotify::GetNotify($id_notify); но получаю ошибку - http://i.imgur.com/pSx5pQP.png Метод $arCIMNotify = CIMNotify::GetUnsendNotify(); - возвращает массив всех непрочитанных уведомлений. Но и еще стоит обновить страницу то массив становиться пустой. т.е если я только что отправил уведомление, то массив выводиться, а стоит обновить страницу повторно, массив выдает пустым. Хотя уведомления я не просматривал, висит как непрочитанные.
И еще добавились только 4 записи уведомлений, из них 2 то что я прокомментировал, и 2 то что пользователь перестал быть другом. А других нет.
У меня в таблицу b_event в поле MESSAGES_ID ничего не добавилось, поэтому письма не отправились на почту. Что за мистика.