Как стать автором
Обновить

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

Поделюсь мои решением:
— самописный сервис, которой по крону проверяет ряд целевых ящиков в разных почтовых сервисах, которые были зарегистрированы специально для проверки доставляемости почты. Сервис проверяет почту от известных отправителей (ящики компании), регистрирует попадание в спам.
— все системы, которые должны что то слать на почту, периодически шлют на эти ящики письма.

Сервис соответственно передает информацию о проверках в заббикс.

Таким образом, определяется собственно факт доставки писем, и попадание в спам (это не совсем точное определение, так как все же ящики одни и те же)
В BitrixEnv (BitrixVM) при отправке через sendmail (msmtp) или через функцию custom_mail если происходит ошибка при отправке, то письма в таблице будут отмечены как отправленные. Есть идеи как с этим быть?
Логи мониторить тем же заббиксом, например.
Избавиться от проблемы отправки проще.
Поставил proxmox mail gateway специально для приема писем с битрикс24
Не одного письма с проблемой отправки нет ( на exchange иногда бывали проблемы)
Схемы отправки писем разные бывают. Часто встречается отправка писем через Yandex mail, Gmail и всякие Mailgun и прочие. Отправка через свой почтовый сервер редко встречается.

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

Может я что-то упустил и bitrix учитывает этот момент и письмо пытается отправить повторно?
Не отправляет повторно, и не проверяет доставку.
Потому что отправка идет консольной утилитой.
Для контроля отправки нужен сервер почтовый на битрикс
Перепроверил по коду. При использовании функции custom_mail или при обычном mail (но часто он через консольные утилиты) в функции bxmail проверяет результат отправки и возвращает его и дальше от результата этого флаг успешности отправки выставляется.
если ошибки возникают часто, то, действительно, попытаться поправить используемый или подумать о другом методе отправки.
если редко, то в логах искать неотправленные, и отправлять повторно из битрикса.
и ещё интересно по этой ситуации:
удалось ли отловить упомянутые ошибки отправки?
если да, то
они все однотипные или разных типов?
можете пример(ы) ошибок показать?
Отправка через консольный msmtp через сервер gmail.com

Примеры ошибок в логе:
smtpstatus=550 smtpmsg='550 5.4.5 Daily user sending quota exceeded. m12sm4517206ljc.59 — gsmtp' errormsg='the server does not accept mail data'
exitcode=EX_DATAERR

smtpstatus=553 smtpmsg='553 5.1.3 The recipient address is not a valid RFC-5321 address. z13sm5430019lfd.7 — gsmtp
' errormsg='recipient address a not accepted by the server' exitcode=EX_DATAERR

errormsg='cannot locate host smtp.gmail.com: Name or service not known' exitcode=EX_NOHOST
Понятно. Если на эти письма ставится SUCCESS_EXEC=«Y» в b_event, то на мой взгляд нехорошо это со стороны Битрикса — не проверяя код ответа, ставить успешное завершение.
Если ещё не обращались с этим в ТП Битрикса, то рекомендую.
Нужно собрать всё — логи, скрины и т.п. что показывает проблему.

Я нередко обращался с подобным и по БУС и по Корп.Порталу. Иногда они сразу заводили задачу разработчикам, а бывало приходилось ещё доказывать.
Если вдруг не признают ошибку, то можно им в идею завести это хотя бы пожеланием на голосование.
А может ли это делать скрипт (в т.ч. битриксный)? Ведь та же функция mail не возвращает результата отправки. Согласно доке она возвращает true если письмо принято к доставке. А вот к логам скрипт уже не имеет доступа. Точнее не всегда. Да и логи, собственно, тоже не гарантия доставки.

Как раз тут, на мой взгляд, достаточно правильно все. Я эту таблицу (в которую, кстати, попадает не вся отправляемая почта) воспринимаю так: из Битрикса/php письмо ушло. Значит проблемы связанные с Битрикс и php в целом отметаем и смотрим уже кто отправляет. Тут уже мониторим логи, которые могут быть у всех разные.
Скрипт из статьи точно не сможет отследить это. Стандартный функционал Битрикса этим не занимается — действительно, он только отдаёт на отправку и это считает SUCCESS_EXEC.

Всё так — особенно логи почт. серверов разные.
Если включить лог php mail
и, допустим, будет возможно (хотя бы для нескольких типов почт. серверов), сопоставить логи: php mail и почт. сервера, то придётся какие-нибудь паттерны настраивать и обновлять их — Битрикс вряд ли будет этим заниматься.
Если мы реализуем функцию custom_mail, то мы сами отправляем почту (можно с помощью PHPMailer) и возвращаем в результате boolean.
Это конечно будет полезно, но не позволит избавить полностью от «ручной работы».

Допустим мы отправляем с помощью custom_mail с PHPMailer и получаем ошибку.
Даже если мы каким-то образом получим код ошибки, например, отдельным полем таблицу в b_event, то придётся эти ошибки классифицировать на (условно): «перевысылаемые» и «неперевысылаемые».

Например для ошибки «553 5.1.3 The recipient address is not a valid RFC-5321 address» перевысылка не поможет — сначала нужно вмешаться человеку и поправить адрес на корректный.
Ну да и это не решит проблему с письмами отправляющимися минуя таблицу b_event при помощи sendimmediate.
Я опробовал такой вариант. Написал отправку писем через функцию custom_mail с возвратом результата отправки и логированием ошибок. Отсылаю письма через сервис mailgun. В mailgun вижу лог отправки писем. Если письмо по какой-то причне не уходит, то оно в таблице b_event становится SUCCESS_EXEC = F и можно его повторно поставить на отправку задав SUCCESS_EXEC = N.
В случае использования он же и получается custom :) Тут уж нам карты в руки, на конкретном проекте мы можем все увязать и связать, но вряд ли хорошая идея некое поле добавлять под это дело в коробочную таблицу. Тут уж надо самим либо менять в ней статус, либо, что полагаю правильнее — вести свою таблицу.
Отвечу на свой коммент по обращению в ТП Битрикса с учётом коммента от BXVoral:
В моём видении, Битрикс, даже при желании, не реализует такое решение — разве, что, в b_event добавят поле для более точного сопоставления отправленного письма с логом почт. сервера.
И опять же придётся логи мониторить и сопоставлять их с инфой в Битриксе.
Скрипт интересный. Хотя, я все же сторонник работы через апи — т.е. коннект к базе и запрос к таблице. (но это не кардинально). Только надо учесть в b_event попадают не все письма. Т.е которые при помощи SendImmediate — они сразу на отправку.

кроме того, уж автоматизировать так автоматизировать,
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории