Входящая почта¶
Когда входящая почта включена, клиенты и сотрудники отвечают на письма Helpdesk Pro, просто отвечая на них, а новое письмо на адрес поддержки открывает заявку. Эта страница описывает приёмники, адреса ответа, то, как письмо находит свою заявку, как очищаются ответы, и журнал входящей почты.
Перед началом¶
- Входящей почте нужен плагин Email 5.3.0 или новее. Со старым плагином Email всё остальное продолжает работать: Operations → Email говорит «Inbound email needs Email plugin 5.3.0 or later», а webhook отвечает
503, чтобы провайдеры сохраняли письмо и повторяли попытку. - Исходящая почта работает, и
email.support_addressзадан. - Cron запускает планировщик Grav (см. Задания и cron).
Настройка входящей почты¶
- Установите
email.support_addressв адрес, на который пишут клиенты, илиinbound.address, когда почта приходит на другой адрес (см. Какой адрес). Без любого из них письмо на адрес поддержки не распознаётся как письмо самой службы поддержки. - На странице настроек плагина откройте Email & Notifications → Inbound Email. Включите
inbound.enabledи выберите приёмник (inbound.receiver, ниже). - Установите
inbound.secretв не менее чем 32 случайных символа, например выводopenssl rand -hex 24. Секрет — часть адреса webhook и единственное, что его защищает, поэтому обращайтесь с ним как с паролем. - В рабочей области откройте Operations → Email, скопируйте адрес webhook и вставьте его в настройки входящей почты провайдера, следуя шагам рядом.
- Отправьте письмо на адрес поддержки. Оно появляется в Operations → Inbound log через секунды и открывает заявку.
Чтобы Helpdesk Pro читал почтовый ящик вместо получения webhook, установите приёмник imap и см. Чтение ящика по IMAP.
Приёмники¶
inbound.receiver |
Откуда приходит почта | Что её проверяет |
|---|---|---|
generic |
Всё, что вы запускаете сами: скрипт-конвейер MTA, ретранслятор, тест через curl. Он отправляет исходное письмо с подписью. |
Подписанный исходный формат плагина Email: X-Grav-Signature: t={unix},v1={hex} (HMAC-SHA256 по {t}.{body} с inbound.signing_secret, допуск пять минут), а также необязательные заголовки X-Grav-Envelope-To и X-Grav-Envelope-From. |
cloudflare |
Cloudflare Email Routing с небольшим Email Worker. Бесплатно и не требует почтового сервера. | Тот же подписанный формат. Руководство Cloudflare плагина Email содержит исходник Worker и каждый шаг. |
postmark, mailgun, sendgrid, ses, resend, mailersend |
Входящий webhook этого провайдера. Нужен плагин Email провайдера (например, Email Postmark) версии с поддержкой входящей почты. | Собственная проверка провайдера, настроенная в настройках плагина провайдера. |
imap |
Ящик, который читает Helpdesk Pro. | Вход на ваш почтовый сервер. |
generic и cloudflare всегда принимаются по адресу webhook наряду с выбранным приёмником, поэтому тест через curl работает с любым провайдером. inbound.signing_secret — их секрет HMAC; если оставить пустым, используется inbound.secret. Секрет подписи короче 32 символов указывается как проблема, и приёмник отказывает каждому запросу, пока он не станет длиннее или не будет очищен.
Адрес webhook¶
Адрес — {site}{inbound.route}/{receiver}/{inbound.secret}, например https://example.com/_helpdesk/inbound/postmark/9f6c…. Он отвечает раньше, чем Grav строит страницу, поэтому остаётся быстрым на загруженном сайте.
| Статус | Когда |
|---|---|
200 |
Письмо сохранено (обработка идёт после ответа), было сохранено раньше (повтор провайдера) или нечитаемо и записано как rejected, поэтому провайдер перестаёт повторять. |
401 |
Подпись или учётные данные провайдера отклонены. Записывается не чаще раза в десять минут на приёмник. |
404 |
Входящая почта выключена, приёмник не принадлежит этому сайту или секрет неверен. Без тела. |
405 |
Это не POST. |
413 |
Больше inbound.max_bytes. |
429 |
Больше 300 запросов в минуту с одного IP-адреса. |
503 |
У плагина Email нет поддержки входящей почты или письмо не удалось сохранить (диск заполнен). Провайдер сохраняет его и повторяет попытку. |
- Mailgun: используйте адрес, заканчивающийся на
/mime(Operations → Email показывает его так). Маршрут Mailgun, пересылающий на URL, заканчивающийся наmime, отправляет всё исходное письмо, что сохраняет вложения и заголовки группировки точно как отправлено. - Amazon SES через SNS: подтверждение подписки запрашивается автоматически (только с хоста Amazon), а письмо, которое SES помечает как содержащее вирус, отклоняется до чтения. Сообщение, сохранённое SES в S3, забирается позже заданием
inbound.fetch. - Resend: его webhook несёт только id, поэтому сообщение забирается позже заданием
inbound.fetch.
Строка запроса никогда не участвует в сопоставлении, поэтому провайдер, добавляющий свои параметры, всё равно доходит до эндпоинта.
Тестовое письмо через curl¶
Подпишите исходное письмо через SignedRawReceiver::sign() плагина Email:
use Grav\Plugin\Email\Providers\Inbound\Receivers\SignedRawReceiver;
$raw = file_get_contents('reply.eml');
$signature = SignedRawReceiver::sign($raw, $signingSecret); // "t=…,v1=…"
curl -X POST "https://example.com/_helpdesk/inbound/generic/$SECRET" \
-H "Content-Type: message/rfc822" \
-H "X-Grav-Signature: $SIGNATURE" \
-H "X-Grav-Envelope-To: support+t8f2k@example.com" \
--data-binary @reply.eml
Try an email в рабочей области (ниже) выполняет пробный запуск, ничего не отправляя.
Со своего почтового сервера¶
Псевдоним Postfix или Exim может передавать каждое письмо прямо в inbound:feed, который читает его из стандартного ввода:
support: "|/var/www/example.com/bin/plugin helpdesk-pro inbound:feed --no-process --to support@example.com"
inbound:feed завершается с 75 (временный сбой), когда письмо не удалось сохранить или плагин Email слишком старый, чтобы почтовый сервер сохранил письмо и повторил попытку. См. CLI.
Чтение ящика по IMAP¶
Когда у вашего почтового провайдера нет входящего webhook, Helpdesk Pro может сам читать ящик: Gmail или Google Workspace с паролем приложения, Fastmail, iCloud или ящик, прилагавшийся к хостингу. Новая почта идёт через тот же конвейер, что и почта из webhook, поэтому группировка, защита от циклов, токены ответа сотрудников и журнал входящей почты работают одинаково.
Webhook — лучший выбор, когда он есть: он доставляет за секунды и не требует хранить пароль на сайте. IMAP — простой путь для небольшого сайта с существующим ящиком.
- Используйте ящик, который читает только служба поддержки, например
support@example.com. Helpdesk Pro помечает импортированное как прочитанное, поэтому человек, читающий тот же ящик, пропустит почту. - Создайте для него пароль приложения. Gmail и Google Workspace сначала требуют двухэтапную проверку, затем Google Account → Security → App passwords. У Fastmail и iCloud то же самое в настройках безопасности.
- В Email & Notifications → Inbound Email включите
inbound.enabledи установитеinbound.receiverвimap. - В разделе IMAP Mailbox заполните
inbound.imap.host(imap.gmail.com),inbound.imap.username(полный адрес) иinbound.imap.password(пароль приложения). - Запустите
bin/plugin helpdesk-pro imap:poll --workодин раз. Он читает ящик сейчас, обрабатывает найденное и печатает результат или ошибку сервера.
Опрос — повторяющееся задание imap.poll, назначаемое каждые inbound.imap.interval_seconds, пока входящая почта включена, приёмник — imap и задан хост. Адреса с плюсом (support+t8f2k@example.com) доставляются в тот же ящик Gmail, Fastmail, iCloud и большинством хостов, а токен сохраняется в заголовке To:.
Как работает опрос:
- Забирается только почта, пришедшая после первого опроса. Первый опрос берёт непрочитанную почту, а каждый следующий — каждое сообщение новее последнего импортированного, до 50 за раз.
- Каждое письмо сохраняется, затем помечается прочитанным и перемещается в
inbound.imap.processed_folder, когда он задан (папка создаётся, если её нет). Сбой повторяет не более одного письма, и оно распознаётся как уже полученное. - Если сервер перенумеровывает ящик (после некоторых миграций), опрос снова начинается с непрочитанной почты, а уже полученные письма пропускаются.
- Письмо больше
inbound.max_bytesне скачивается. Оно записывается какrejected(too_large) и помечается прочитанным. - Неудача подключения или входа ждёт 15 минут до следующей попытки. После третьей неудачи подряд администраторы получают уведомление
imap_failedв колокольчике. Следующий успешный опрос сбрасывает счётчик.
Клиент IMAP — собственный клиент плагина Email (чистый PHP, без ext-imap). Он проверяет сертификат сервера, а с starttls никогда не откатывается к простому тексту.
Что происходит с письмом¶
Webhook, IMAP и inbound:feed заканчивают в одном месте. Каждое письмо сначала сохраняется (его исходные байты и строка в журнале входящей почты), а затем обрабатывается заданием inbound.process, обычно в ту же секунду.
Одно и то же письмо, пришедшее дважды (повтор провайдера, одно письмо на два ваших адреса, повторно полученное сообщение IMAP), сохраняется один раз и распознаётся по Message-ID, id провайдера или байтам. Обработку тоже безопасно повторять.
Обработка выполняет эти шаги по порядку, и первый, который принимает решение о письме, её заканчивает:
- Защита от циклов отбрасывает почту, которую не написал человек.
- Адрес отписки (
support+u{token}@…) отписывает отправителя. - Отправитель находится, и сотрудники отличаются от клиентов.
- Заявка находится или открывается новая.
- Ответ очищается (см. Как очищаются ответы).
- Сообщение добавляется через те же сервисы, что использует ответ в рабочей области или портале, поэтому активность, уведомления, обновления в реальном времени и письма клиентам идут как обычно.
Защита от циклов¶
Автоматическая почта никогда не добавляется в заявку и никогда не получает ответа, поэтому два автоответчика никогда не смогут переписываться вечно.
| Причина | Состояние | Что ловит |
|---|---|---|
virus |
rejected | Принимающий провайдер сообщил о вирусе. |
own_mail |
ignored | Почта с одного из ваших адресов (адреса поддержки, адреса From, почтового псевдонима проекта). |
bounce |
ignored | Пустой отправитель конверта, отчёт о доставке или письмо от mailer-daemon или postmaster. |
auto_submitted |
ignored | Auto-Submitted со значением, отличным от no (ответы «вне офиса», уведомления об отпуске). |
precedence |
ignored | Precedence: bulk, junk, list или auto_reply. |
auto_reply |
ignored | X-Autoreply, X-Autorespond или X-Autogenerated. |
mailing_list |
ignored | List-Id или List-Unsubscribe, если это не ответ в одной из ваших переписок от известного человека. |
rate |
rejected | Больше inbound.per_sender_per_hour писем с одного адреса в час. |
Кто отправил¶
Отправитель — адрес From письма.
- Адрес, которого Helpdesk Pro никогда не видел, — новый клиент. Запись человека создаётся, только если для него открывается заявка.
- Почта заблокированного человека отклоняется (
blocked). - Сотрудники остаются сотрудниками только со своим токеном ответа. Письма-уведомления сотрудникам несут адрес ответа, выданный этому сотруднику. Письмо на него от этого сотрудника публикуется от его имени: публичный ответ, когда уведомление было об ответе или заявке, и внутренняя заметка, когда оно было о заметке. Любое другое письмо от сотрудника обрабатывается как письмо клиента, поэтому клиент никогда не сможет добавить внутреннюю заметку по почте.
- Ответ сотрудника, отправителя которого не удалось проверить (DMARC не прошёл или при отсутствии результата DMARC не прошли ни DKIM, ни SPF), удерживается (
unverified_staff) вместо публикации. Администратор отпускает его из журнала входящей почты, когда убедится, что оно настоящее. - Неизвестный отправитель, пишущий на адрес заметки сотрудника, отклоняется (
token_mismatch).
Какая заявка¶
| Путь | Как |
|---|---|
in_reply_to |
Заголовок In-Reply-To называет одно из ваших писем. |
references |
Заголовок References называет одно из ваших писем, начиная с новейшего. |
root_id |
Запись References — корень переписки заявки (hd.{ticket}.root@…). |
token |
Адрес несёт токен ответа (support+t{token}@…). Переживает почтовые приложения, отбрасывающие заголовки группировки. |
ref |
Невидимый маркер ref:{ticket}.{signature} в ваших HTML-письмах. Подпись проверяется, поэтому его нельзя угадать. |
new |
Ничего из перечисленного: новая заявка. |
Совпадение используется, только когда отправитель может добавить в эту заявку: он её заявитель или копия, токен выдан ему или (при inbound.cc_join) вы писали ему об этом. Любой другой, пишущий в переписку (пересланное письмо, человек, никогда в ней не участвовавший), открывает собственную новую заявку. Почта объединённой заявки идёт в заявку, с которой её объединили; удалённая заявка не совпадает ни с чем.
Ответ на решённую заявку открывает её снова. Ответ на закрытую заявку открывает новую, чья первая активность ссылается на закрытую. Ответ сотрудника на заявку, к которой у него больше нет доступа, отклоняется (no_access); ответ клиента становится новой заявкой.
Новые заявки по почте¶
Новая заявка идёт в проект, чей почтовый псевдоним (Setup → Projects) есть в To, Cc или конверте письма, иначе в inbound.default_project (слаг проекта), иначе в первый проект. Один адрес может открыть не более inbound.new_tickets_per_sender_per_hour заявок по почте в час (new_ticket_rate). При inbound.cc_join другие люди из To и Cc письма становятся копиями новой заявки. Клиент получает подтверждение client-received, пока включён email.acknowledge_email_tickets.
Обязательные пользовательские поля не проверяются для заявок, пришедших по почте.
Вложения и встроенные изображения¶
Вложения следуют тем же правилам, что загрузки (attachments.enabled, разрешённые расширения и attachments.max_mb, см. Вложения), не более inbound.max_attachments из одного письма. winmail.dat (обёртка TNEF Outlook) и небольшие встроенные изображения, которые сохранённый текст не показывает (логотипы подписи меньше 2 КБ), пропускаются. Каждый пропущенный файл и причина перечислены в журнале входящей почты.
Подтверждение client-received для обращения, открытого по почте, говорит, какие файлы пришли и почему каждый непринятый файл не сохранён: «too large (limit 25 MB)», «that file type isn't accepted», «too many files (limit 20)», «files aren't accepted by email» или «the file couldn't be read».
Изображение, вставленное в письмо (встроенное вложение cid:), сохраняется со своим content id и показывается на месте сообщения в рабочей области и портале через те же маршруты файлов с проверкой доступа, что и любой файл. Никто никогда не видит адрес cid:. Читатель, которому нельзя открыть файл, видит только его имя.
Адреса ответа¶
Пока входящая почта включена и может принимать, каждое письмо Helpdesk Pro о заявке просит отвечать на адрес, сделанный для этого получателя и заявки:
Reply-To: support+t4k2qz7mfa9xw3hb@example.com
List-Unsubscribe: <https://example.com/help/unsubscribe?p=…>, <mailto:support+u4k2qz7mfa9xw3hb@example.com?subject=unsubscribe>
Часть после +t — токен ответа: 16 случайных букв и цифр, выдаваемых при первом письме человеку о заявке и повторно используемых во всех дальнейших письмах о ней. Один токен находит заявку и человека, поэтому ответ совпадает, даже когда почтовое приложение отбросило заголовки группировки. Он же делает ответ сотрудника ответом сотрудника.
| Письмо | Аудитория токена | Чем становится ответ на него |
|---|---|---|
Письмо клиенту (client-reply, client-received, client-resolved, client-triage) |
client |
Публичный ответ клиента. |
| Уведомление сотруднику об одной заявке | staff |
Публичный ответ этого сотрудника, отправленный клиенту как любой ответ. |
| То же, когда оно показывает внутреннюю заметку | note |
Внутренняя заметка. Быстрый ответ на письмо с заметкой никогда не попадёт клиенту по ошибке. |
| Дайджесты, пакеты о нескольких заявках и тестовое письмо | digest (один на сотрудника, без заявки) |
Ничего. Письмо записывается как ignored (reply_to_digest). |
Чтобы ответить на заявку из дайджеста, откройте её и ответьте там или ответьте на собственное уведомление этой заявки. Токены staff, note и digest выдаются только сотрудникам с учётной записью на сайте. Клиент всегда получает только токен client.
Почта на адрес +u{token} отписывает своего человека: токен клиента останавливает письма об этом обращении, а токен сотрудника выключает всю почту Helpdesk этого сотрудника.
Какой адрес¶
Адрес, в который попадает токен, — первый из заданных:
inbound.address: задайте его, когда почта приходит на другой адрес, чем тот, с которого вы отправляете, например на адрес Cloudflare Email Routing или отдельный входящий домен.- Почтовый псевдоним проекта заявки, поэтому ответы о заявке Billing идут на
billing+t…@. email.support_address.- Адрес, с которого отправляется почта (
email.from_address, затем From плагина Email).
Ваш провайдер или почтовый сервер должен доставлять почту для {local}+anything@{domain} туда же, куда {local}@{domain}:
- Cloudflare Email Routing: включите субадресацию (Email Routing → Settings). Тогда
support+t…@example.comследует правилуsupport@example.com. - Amazon SES: получатель правила получения
support@example.comтакже совпадает сsupport+anything@example.com. - Входящие webhook других провайдеров: направьте на webhook весь входящий домен или маршрут, совпадающий с формой с плюсом.
- Свой почтовый сервер или ящик IMAP: убедитесь, что
+detailдоставляется в основной ящик (Postfixrecipient_delimiter = +; большинство хостинговых ящиков делает это по умолчанию).
Без адресации с плюсом¶
Почтовая система, отклоняющая или удаляющая адреса +detail, не может нести токен. Установите inbound.plus_addressing в false, и Helpdesk Pro не будет помещать токен ни в один адрес. Ответы всё равно находят заявку через заголовки группировки и скрытый маркер ref:, чего достаточно почти для любого почтового приложения.
Что вы теряете: ответ из приложения, отбрасывающего оба, не находит заявку и открывает новую, ответы сотрудников по почте обрабатываются как письма клиентов, а отписки по почте нет.
Когда ничего не меняется¶
При выключенном inbound.enabled, плагине Email старше 5.3.0 или отсутствии способа получить почту (нет секрета webhook длиной 32 символа или больше либо приёмник imap без хоста) почта отправляется точно так, как если бы входящей не существовало: без Reply-To, без отписки по mailto, без выданных токенов, а письмо клиенту говорит «View or reply to your request».
Как очищаются ответы¶
Ответ по почте несёт больше, чем новые слова: предыдущую переписку, цитируемую ниже, подпись, «Sent from my iPhone». Helpdesk Pro сохраняет только то, что человек написал на этот раз, поэтому заявка читается как переписка. Сообщение точно в том виде, в каком оно пришло, тоже всегда сохраняется за Show original.
Helpdesk Pro использует текстовую часть, когда в ней есть слова, поскольку обычный текст уже является допустимым Markdown. Он прибирает остатки ссылок Apple Mail (https://example.com <https://example.com/> становится одной ссылкой) и превращает его невидимые метки изображений во встроенные изображения. Когда пригодной текстовой части нет, HTML-часть преобразуется в Markdown.
Преобразование никогда не сохраняет ничего, что читатель не мог бы увидеть или что обратилось бы к другому серверу: <style>, <script>, <head> и скрытые элементы отбрасываются; ссылка javascript: сохраняет только свой текст; изображения, загружаемые из сети, сохраняют только alt-текст, поэтому отслеживающее изображение из письма клиента никогда не запрашивается, когда сотрудники читают заявку; изображения 1×1 отбрасываются.
Что отрезается¶
Helpdesk Pro отрезает по первому найденному из этого, затем удаляет подпись и телефонный подвал из оставшегося:
| Правило | Что находит |
|---|---|
gmail_quote |
Цитируемую историю Gmail в HTML-письмах |
apple_cite |
Цитату Apple Mail (blockquote type="cite") |
outlook_reply, outlook_append, outlook_mac |
Заголовок ответа и цитату Outlook в HTML-письмах |
yahoo_quoted |
Цитату Yahoo Mail |
thunderbird_cite |
«On … wrote:» и цитату Thunderbird |
protonmail_quote |
Цитату Proton Mail |
quote_header |
«On Mon, 22 Sep 2026 at 10:15, Jane wrote:» в обычном тексте, в том числе развёрнутое на две строки, на английском, немецком, французском, испанском, нидерландском, итальянском, португальском, шведском, датском, норвежском, польском и японском |
original_message |
-----Original Message----- и его переводы |
outlook_header |
Блок Outlook From: … Sent: … To: … Subject: |
quoted_block |
Строки, начинающиеся с >, в конце сообщения, со строкой «Jane wrote:» над ними |
signature |
Всё после строки -- и помеченные подписи Gmail и Thunderbird |
mobile_footer |
«Sent from my iPhone», «Get Outlook for iOS» и подобное, с распространёнными переводами |
Правило, которое отрезало, записывается вместе с сообщением, поэтому журнал входящей почты показывает, почему ответ выглядит короче письма.
Кое-что никогда не отрезается:
- Пустой результат. Если после отрезания ничего не осталось и цитата не найдена (тело, состоящее только из подписи), сохраняется полный текст.
- Пересланная почта. Сообщение, пересылающее другое («---------- Forwarded message ---------», «Begin forwarded message:» или тема, начинающаяся с «Fwd:» или «FW:»), сохраняется целиком.
Примечание
Некоторые люди отвечают, вписывая текст между строками цитируемого письма. Helpdesk Pro сохраняет написанное над первой цитатой и отрезает остальное, включая ответы ниже. Полное письмо в одном щелчке за Show original.
Ответ без нового текста¶
Некоторые ответы ничего не добавляют: человек нажал Reply и Send или переслал уведомление обратно, ничего не написав. Такое сообщение сохраняется как «Replied without adding any text.» с цитатой, свёрнутой под Show quoted text.
Оно тихо присоединяется к переписке: не меняет статус заявки, не считается чьим-либо ответом, и никто не получает о нём уведомление или письмо. В закрытую заявку или заявку, на которую отправитель больше не может ответить, оно ничего не добавляет и не открывает новую (записывается как ignored, no_new_text).
Экран Email¶
Operations → Email (#/setup/email, только для администраторов) говорит, как почта доходит до рабочей области. Сверху: принимается ли входящая почта, приёмник, когда пришло последнее письмо и сколько писем не удалось или удерживается. Всё, что мешает почте приходить, перечислено предложением («No secret set, or it is shorter than 32 characters», «No support address is set») со ссылкой на вкладку настроек, где это исправляется.
- Webhook address: адрес для вставки провайдеру, с секретом, скрытым до Reveal, и Copy. Отдельный секрет подписи следует за ним со своими Reveal и Copy, а также шаги настройки приёмника.
- Mailbox (приёмник
imap): сервер и папка, когда ящик читали последний раз и когда прочитают в следующий. - Replies: адрес ответа, на который просит отвечать ваше письмо, с примером токена, строкой на каждый проект, чей почтовый псевдоним его перехватывает, и напоминанием, что провайдер должен доставлять
support+anything@туда же. - Try an email: вставьте целое письмо (файл
.emlили «Show original» из почтового приложения) и посмотрите, что рабочая область сделала бы с ним: защиту от циклов, кто отправил, в какую заявку оно пойдёт и какие слова сохранит. Оно ничего не сохраняет и никому не пишет.
Журнал входящей почты¶
Каждое полученное письмо получает строку в журнале входящей почты, что бы с ним ни случилось, поэтому у «I emailed you and nothing happened» всегда есть ответ. Администраторы видят его в Operations → Inbound log (#/setup/inbound-log). Счётчик рядом в боковом меню — его неудачные и удерживаемые письма.
| Состояние | Значение |
|---|---|
received |
Сохранено, ждёт задания inbound.process. |
processing |
Обрабатывается сейчас. |
appended |
Добавлено к существующей заявке. |
created |
Открыло новую заявку. |
held |
Ответ сотрудника, который не удалось проверить, ждёт, пока администратор его отпустит. |
ignored |
Автоматическая почта, отписка (unsubscribed), ответ на дайджест (reply_to_digest) или ответ без нового текста в закрытую заявку (no_new_text). |
rejected |
Отклонено: virus, rate, blocked, no_sender, token_mismatch, no_access, new_ticket_rate, no_project, too_large или unreadable. |
failed |
Обработка трижды выбросила ошибку. Администраторы получают уведомление в колокольчике. |
Фильтруйте список по состоянию или ищите по отправителю, теме или Message-ID. Открытие письма показывает каждый выполненный шаг обработки (защиту от циклов, отправителя и почему он был удержан или отклонён, как найдена его заявка, что отрезала очистка), сообщение, которым оно стало, каждое сохранённое или пропущенное вложение, заголовки с результатами DMARC, DKIM и SPF и Show original.
- Retry обрабатывает письмо
failedснова. - Process again повторно запускает письмо
ignoredилиrejectedпосле того, как вы исправили настройку, разблокировали отправителя или добавили псевдоним проекта. - Release пропускает удерживаемый ответ сотрудника, публикуя его от имени этого сотрудника.
Process again и Release могут опубликовать сообщение в заявке, поэтому сначала спрашивают.
Исходная копия, которую хранит журнал, удаляется через privacy.inbound_raw_days дней (по умолчанию 90; 0 хранит её). Сообщение хранит собственный оригинал, пока существует, поэтому Show original в заявке продолжает работать.
Маршруты и инструменты MCP¶
Под /api/v1. Всему, кроме оригинала сообщения, нужно helpdesk-pro.settings.
| Маршрут | Тело или запрос | Отвечает | Инструмент MCP |
|---|---|---|---|
GET /helpdesk-pro/inbound/log |
state, q, page, per_page |
Строки, начиная с новых | list_inbound_log |
GET /helpdesk-pro/inbound/log/{id} |
Строка с detail, match, headers и message |
get_inbound_entry |
|
GET /helpdesk-pro/inbound/log/{id}/original |
{headers, text, size, format}; 404, когда исходная копия удалена |
get_inbound_original |
|
POST /helpdesk-pro/inbound/log/{id}/retry |
Строку, снова в состоянии received; 409 для письма, уже находящегося в заявке или удерживаемого |
retry_inbound |
|
POST /helpdesk-pro/inbound/log/{id}/release |
Строку с released: true; 409, если оно не удерживается |
release_inbound |
|
GET /helpdesk-pro/inbound/status |
enabled, available, receiver, webhook_url (содержит секрет), steps, imap, counts, failed, held, last_received_at, problems и replies |
get_inbound_status |
|
POST /helpdesk-pro/inbound/test |
{raw}: целое письмо текстом |
Пробный запуск. Ничего не записывает. | test_inbound |
GET /helpdesk-pro/messages/{id}/original |
Исходное письмо за сообщением для сотрудников, которые видят внутреннюю сторону заявки (helpdesk-pro.desk) |
get_message_original |
Задания и уведомления¶
| Задание | Что делает |
|---|---|
inbound.process |
Обрабатывает одно сохранённое письмо. Три попытки; после последней администраторы получают уведомление inbound_failed в колокольчике. |
inbound.fetch |
Забирает письмо, на которое провайдер прислал только ссылку (Amazon SES в S3, Resend), затем ставит в очередь inbound.process. |
imap.poll |
Читает ящик IMAP каждые inbound.imap.interval_seconds, пока приёмник — imap. |
Уведомления inbound_failed и imap_failed в колокольчике только для администраторов, никогда не отправляются по почте и ссылаются на журнал входящей почты.
Настройки¶
На вкладках Email & Notifications → Inbound Email, IMAP Mailbox и Reply Addresses:
| Ключ | По умолчанию | Что делает |
|---|---|---|
inbound.enabled |
false |
Принимать почту. Также переключает письма клиентам на «Reply to this email or view your request». |
inbound.receiver |
'' |
generic, cloudflare, imap или провайдер плагина Email (postmark, mailgun, sendgrid, ses, resend, mailersend). |
inbound.route |
/_helpdesk/inbound |
Начало адреса webhook. |
inbound.secret |
'' |
Секрет URL в адресе webhook. Не менее 32 случайных символов, иначе webhook остаётся закрытым. |
inbound.signing_secret |
'' |
Секрет HMAC, который проверяют приёмники generic и cloudflare. Пусто использует inbound.secret. |
inbound.default_project |
support |
Слаг проекта, куда идут новые заявки, когда ни один почтовый псевдоним не совпал. |
inbound.max_bytes |
26214400 |
Наибольшее принимаемое письмо (25 МБ). |
inbound.max_attachments |
20 |
Сколько файлов сохраняется из одного письма. |
inbound.per_sender_per_hour |
20 |
Больше этого числа писем с одного адреса в час отклоняется. |
inbound.new_tickets_per_sender_per_hour |
5 |
Сколько новых заявок один адрес может открыть по почте в час. |
inbound.cc_join |
true |
Люди из To и Cc письма клиента становятся копиями новой заявки, а тот, кому вы писали о заявке, может на неё ответить. |
inbound.address |
'' |
Куда идут ответы на вашу почту с добавленным токеном. Пусто использует почтовый псевдоним проекта, затем email.support_address, затем адрес From. |
inbound.plus_addressing |
true |
Помещать токен ответа в адрес. Выключайте, только когда ваша почтовая система отклоняет или удаляет +detail. |
inbound.imap.host |
'' |
Сервер IMAP, например imap.gmail.com. |
inbound.imap.port |
993 |
993 для ssl, обычно 143 для starttls. |
inbound.imap.encryption |
ssl |
ssl, starttls или none (только для локального тестового сервера). |
inbound.imap.username |
'' |
Имя пользователя ящика, обычно полный адрес. |
inbound.imap.password |
'' |
Пароль приложения. Никогда не показывается в состоянии или журнале. |
inbound.imap.folder |
INBOX |
Папка, из которой читается новая почта. |
inbound.imap.processed_folder |
'' |
Перемещать сюда импортированную почту. Пусто помечает её прочитанной и оставляет на месте. |
inbound.imap.interval_seconds |
120 |
Как часто читается ящик (не реже 60). |
privacy.inbound_raw_days |
90 |
Сколько дней журнал входящей почты хранит исходную копию каждого письма. |