Перейти к содержимому

Приём входящих писем - ящик, разбор, привязка к заказу

Принимаем письма на сайте: ответы клиентов на уведомления, заявки с почты, сообщения от партнёров. Разбираем отдельный ящик, правила обработки и привязку письма к нужной записи.

Решение

Приём почты на сайте устроен совсем иначе, чем её отправка. Сайт сам забирает письма из указанного ящика и прогоняет их через правила обработки, а каждое правило вызывает свой обработчик.

Отделяем служебный ящик от рабочего:

// адрес для приёма писем сайтом, а не общий ящик компании
// правило заберёт письмо и пометит его как обработанное
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; // адрес отправителя не совпал с адресом в заказе
}

Совпадение адреса отправителя с адресом в записи - минимальная проверка. Без неё любой человек, узнавший метку заказа, добавит комментарий от чужого имени.

Вложения писем сохраняют отдельно и обязательно проверяют по типу файла. Письмо с исполняемым файлом внутри - обычное дело для спама, и открывать его сайту нечего.

Ошибки разбора письма пишут в журнал вместе с темой и адресом отправителя. Без такой записи пропавшее письмо невозможно ни найти, ни объяснить клиенту.

Типичные проблемы

Письма забираются, но обработчик не срабатывает.

Правило не отбирает эти письма: не совпал адрес получателя или условие по теме. Условие правила проверяют на реальном пришедшем письме, а вовсе не на ожидаемом.

Из ящика пропадают письма сотрудников.

Для приёма писем используется рабочий ящик отдела продаж. Сайт помечает и перемещает письма, поэтому для него заводят отдельный почтовый адрес.

Ответ клиента привязался к чужому заказу.

Связь ищется по адресу отправителя, а не по метке в теме. Один почтовый адрес часто бывает у нескольких заказов и нескольких клиентов.

В комментарии к заказу попал текст подписи и цитата.

Текст письма сохранён в комментарий целиком. Цитату прежнего письма и подпись отрезают до сохранения, иначе история заказа станет нечитаемой.

Обработчик падает на письме с вложением.

Вложения письма не проверяются по типу и размеру. Их сохраняют отдельным файлом, а исполняемые вложения отбрасывают сразу же.

Частые вопросы

Чем приём писем отличается от отправки?

Отправкой занимается почтовое событие с шаблоном, приёмом - правила обработки входящей почты. Это разные механизмы с разными настройками.

Как связать ответ клиента с заказом?

Меткой в теме исходящего письма, которую клиент сохраняет при ответе. Адрес отправителя для связи ненадёжен: люди отвечают с других ящиков.

Что делать с письмами без привязки?

Складывать в отдельный список для ручного разбора и не удалять. Часть из них - обычные обращения, которые иначе потеряются.

Нужно ли проверять отправителя?

Обязательно, если письмо меняет данные заказа или заявки. Метку в теме несложно подсмотреть, а адрес отправителя даёт хотя бы минимальную проверку.

Как быть с вложениями?

Сохранять отдельно с проверкой типа и размера, а исполняемые файлы отбрасывать. Каталог для таких файлов закрывают от прямого доступа.

Смежное

Первоисточник