Приём входящих писем - ящик, разбор, привязка к заказу
Принимаем письма на сайте: ответы клиентов на уведомления, заявки с почты, сообщения от партнёров. Разбираем отдельный ящик, правила обработки и привязку письма к нужной записи.
Решение
Приём почты на сайте устроен совсем иначе, чем её отправка. Сайт сам забирает письма из указанного ящика и прогоняет их через правила обработки, а каждое правило вызывает свой обработчик.
Отделяем служебный ящик от рабочего:
// адрес для приёма писем сайтом, а не общий ящик компании// правило заберёт письмо и пометит его как обработанноеprintf("ящик приёма: %s\n", COption::GetOptionString('main', 'vendor_inbox', ''));Ящик для приёма писем сайтом заводят отдельный. Общий ящик отдела продаж для этого не годится: сайт помечает и перемещает письма, а люди в это же время читают их вручную.
Отбираем нужные письма правилом:
// правило обработки почты: отбор по адресу получателя и теме// в теме уведомлений оставляют метку вида [ORDER-1234]$subject = 'Ваш заказ [ORDER-1234] отправлен';preg_match('/\[ORDER-(\d+)\]/', $subject, $m);$orderId = (int)($m[1] ?? 0); // ноль означает письмо без привязкиМетка в теме - самый надёжный способ связать ответ с записью. Адрес отправителя для этого не годится: люди отвечают с других ящиков, а один адрес бывает у нескольких клиентов.
Разбираем письмо в обработчике:
function handleIncomingMail(array $fields): bool{ $from = (string)($fields['FROM'] ?? ''); $body = (string)($fields['BODY'] ?? ''); \Bitrix\Main\Diag\Debug::writeToFile([$from, mb_substr($body, 0, 200)], 'письмо', 'mail.log'); return true; // письмо обработано, дальше по правилам оно не идёт}Обработчик получает разобранное письмо: адреса, тему, текст и вложения. Возврат признака обработки говорит платформе, что письмо дальше по цепочке правил не пойдёт.
Защищаемся от чужих писем:
$known = \Bitrix\Sale\Order::load($orderId);if (!$known || mb_strtolower($from) !== mb_strtolower($known->getField('USER_EMAIL'))) { return false; // адрес отправителя не совпал с адресом в заказе}Совпадение адреса отправителя с адресом в записи - минимальная проверка. Без неё любой человек, узнавший метку заказа, добавит комментарий от чужого имени.
Вложения писем сохраняют отдельно и обязательно проверяют по типу файла. Письмо с исполняемым файлом внутри - обычное дело для спама, и открывать его сайту нечего.
Ошибки разбора письма пишут в журнал вместе с темой и адресом отправителя. Без такой записи пропавшее письмо невозможно ни найти, ни объяснить клиенту.
Типичные проблемы
Письма забираются, но обработчик не срабатывает.
Правило не отбирает эти письма: не совпал адрес получателя или условие по теме. Условие правила проверяют на реальном пришедшем письме, а вовсе не на ожидаемом.
Из ящика пропадают письма сотрудников.
Для приёма писем используется рабочий ящик отдела продаж. Сайт помечает и перемещает письма, поэтому для него заводят отдельный почтовый адрес.
Ответ клиента привязался к чужому заказу.
Связь ищется по адресу отправителя, а не по метке в теме. Один почтовый адрес часто бывает у нескольких заказов и нескольких клиентов.
В комментарии к заказу попал текст подписи и цитата.
Текст письма сохранён в комментарий целиком. Цитату прежнего письма и подпись отрезают до сохранения, иначе история заказа станет нечитаемой.
Обработчик падает на письме с вложением.
Вложения письма не проверяются по типу и размеру. Их сохраняют отдельным файлом, а исполняемые вложения отбрасывают сразу же.
Частые вопросы
Чем приём писем отличается от отправки?
Отправкой занимается почтовое событие с шаблоном, приёмом - правила обработки входящей почты. Это разные механизмы с разными настройками.
Как связать ответ клиента с заказом?
Меткой в теме исходящего письма, которую клиент сохраняет при ответе. Адрес отправителя для связи ненадёжен: люди отвечают с других ящиков.
Что делать с письмами без привязки?
Складывать в отдельный список для ручного разбора и не удалять. Часть из них - обычные обращения, которые иначе потеряются.
Нужно ли проверять отправителя?
Обязательно, если письмо меняет данные заказа или заявки. Метку в теме несложно подсмотреть, а адрес отправителя даёт хотя бы минимальную проверку.
Как быть с вложениями?
Сохранять отдельно с проверкой типа и размера, а исполняемые файлы отбрасывать. Каталог для таких файлов закрывают от прямого доступа.
Смежное
- Почта и рассылки - оглавление подтемы
- Своё письмо с сайта: тип события, шаблон, поля - исходящие письма и метка в теме
- Письма с сайта не доходят: разбор причин по убыванию частоты - разбор доставки исходящих
- Заявки с сайта: хранение, дубли, передача в CRM - куда складывать обращения
- Отдача файла с проверкой прав: закрытые каталоги, заголовки, ссылки - хранение вложений
- Статусы заказов: смена из кода, события и сопоставление с 1С - когда письмо меняет заказ
- Инфраструктура и хостинг - устройство площадки целиком