Канал «Почта» работает с ящиком компании по IMAP и SMTP — как почтовая программа. Новые письма приходят уведомлениями, а методы ящика дают всё остальное: папки, поиск, письмо целиком, флаги, перенос, ответы в цепочку, пересылку и черновики. Общие методы — sendMessage, история, контакты — работают и у почты.
Все методы почты — POST с телом JSON, адрес как у остальных методов: https://api.gratio.net/waInstance{idInstance}/{метод}/{apiTokenInstance}. У каналов MAX, Telegram и WhatsApp методы почты отвечают 501.
Подключить ящик — в кабинете, см. Почта, или из своего приложения методом connectMailbox.
Чат и цепочка
| Что это | Пример | |
|---|---|---|
Чат — chatId |
переписка с одним адресом | "maria@client.ru" |
Цепочка — threadId |
письма одной темы, связанные ответами | "c62b698304229a98aad3" |
chatId— адрес собеседника в нижнем регистре, домен — юникодом:"info@пример.рф". Входящее письмо попадает в чат адреса из Reply-To, а без него — отправителя. Своё письмо — в чат первого получателя.- Свои адреса — адрес ящика и адреса из настройки
emailAliases. Письма с них считаются своими, см. Настройки ящика. threadId—idMessageпервого письма цепочки. В чате бывает несколько цепочек, а в цепочке — несколько адресатов.chatIdу почты — только адрес. Номер телефона79991234567@c.usу почты не работает.
Три письма — один чат и две цепочки:
Мария → «Запись на пробное» чат maria@client.ru, цепочка c62b…
Школа → «Re: Запись на пробное» тот же чат, та же цепочка
Мария → «Вопрос по оплате» тот же чат, новая цепочка
Как указать письмо
Методы, которые работают с одним письмом, принимают его одним из способов:
| Поля | Пример | Когда подходит |
|---|---|---|
folder + uid |
{"folder": "inbox", "uid": 1532} |
всегда: номер письма в папке, как в IMAP |
idMessage |
{"idMessage": "c62b698304229a98aad3"} |
Gratio уже видел письмо: в уведомлении, списке, поиске |
idMessage + chatId |
{"idMessage": "c62b698304229a98aad3", "chatId": "maria@client.ru"} |
письмо из уведомления или отправленное через API: найдётся по журналу канала |
messageId |
{"messageId": "CAF1xQm7v2k@mail.gmail.com"} |
заголовок Message-ID, с угловыми скобками или без |
idMessage— 20 hex-знаков от Message-ID. Он одинаков у письма в любой папке: копия вашего письма в «Отправленных» имеет тот жеidMessage, что вернула отправка.- По
messageIdGratio ищет письмо в папкеfolder, если она задана, затем во «Входящих», «Отправленных», «Архиве», «Вся почта», «Черновиках», «Спаме» и «Корзине». uidменяется, когда письмо переносят в другую папку: новый номер — в ответе moveMessages. Если у папки сменилсяuidValidity, старыеuidэтой папки больше не действуют — перечитайте её.- Письма нет —
400 not_found.
Несколько писем
markMessages, setMessageFlags, moveMessages, copyMessages и deleteMessages принимают до 500 писем:
| Поля | Пример |
|---|---|
messages |
{"messages": [{"folder": "inbox", "uid": 1532}, {"idMessage": "7877cd439c05bc16617b"}]} |
folder + uids |
{"folder": "inbox", "uids": [1532, 1540]} |
idMessages |
{"idMessages": ["c62b698304229a98aad3", "7877cd439c05bc16617b"]} |
Одно письмо можно указать и как в остальных методах: folder + uid, idMessage или messageId.
Как указать папку
Папку в полях folder, to и parent указывают ролью, именем на сервере или названием:
| Способ | Пример |
|---|---|
| роль | "inbox", "sent", "archive" |
| имя на сервере | "INBOX", "Sent", "&BBcEMARPBDIEOgQ4-" |
| название | "Отправленные", "Заявки" |
| Роль | Папка |
|---|---|
inbox |
«Входящие» |
sent |
«Отправленные» |
drafts |
«Черновики» |
trash |
«Корзина» |
spam |
«Спам» |
archive |
«Архив» |
all |
«Вся почта» — есть у Gmail |
Роль Gratio определяет по флагам папок (SPECIAL-USE), без них — по привычным именам: Sent, «Отправленные», Trash, «Корзина». Какие роли нашлись в ящике — в getMailboxInfo, все папки — в getFolders. Папки нет — 400 folder_not_found.
Конверт письма
Конверт — письмо без тела: где лежит, от кого, кому, тема, флаги. Его возвращают getMessages, searchMessages и getThread, а getEmail — конверт вместе с телом.
Письмо Марии во «Входящих»:
{
"idMessage": "c62b698304229a98aad3",
"folder": "INBOX",
"uid": 1532,
"uidValidity": 1700000000,
"chatId": "maria@client.ru",
"messageId": "CAF1xQm7v2k@mail.gmail.com",
"threadId": "c62b698304229a98aad3",
"inReplyTo": null,
"references": [],
"timestamp": 1791823658,
"internalDate": 1791823661,
"from": {"address": "maria@client.ru", "name": "Мария"},
"to": [{"address": "info@school.ru", "name": ""}],
"cc": [],
"replyTo": [],
"subject": "Запись на пробное",
"flags": ["\\Seen"],
"seen": true,
"flagged": false,
"answered": false,
"draft": false,
"size": 4821,
"hasAttachments": false
}
| Поле | Тип | Описание |
|---|---|---|
idMessage |
string | id письма: 20 hex-знаков от Message-ID |
folder, uid |
string, integer | где письмо лежит: имя папки на сервере и номер письма в ней |
uidValidity |
integer | версия нумерации папки: сменилась — старые uid не действуют |
chatId |
string | чат письма: Reply-To или отправитель, у своего письма — первый получатель |
messageId |
string | заголовок Message-ID без угловых скобок |
threadId |
string | цепочка письма |
inReplyTo |
string | на какое письмо это ответ — его Message-ID; null — не ответ |
references |
array | Message-ID писем цепочки до этого |
timestamp |
integer | дата из письма, время Unix |
internalDate |
integer | когда письмо легло в ящик |
from |
object | отправитель: {"address", "name"} |
to, cc, replyTo |
array | «Кому», «Копия» и Reply-To — объекты {"address", "name"} |
subject |
string | тема |
flags |
array | флаги как на сервере: \Seen, \Flagged, свои ключевые слова |
seen, flagged, answered, draft |
boolean | прочитано, отмечено флажком, отвечено, черновик |
size |
integer | размер письма в байтах |
hasAttachments |
boolean | в письме есть вложения |
В JSON обратная косая черта удваивается: флаг \Seen записывается как "\\Seen".
Общие методы у почты
| Метод | У почты |
|---|---|
| sendMessage | письмо-ответ в цепочку: на quotedMessageId или на последнее письмо переписки не старше 30 дней, иначе новое письмо. Тема — «Re: …», у нового письма — emailSubject или первая строка текста. typingTime — просто пауза |
| sendFileByUpload, sendFileByUrl | письмо с файлом, caption — текст письма |
| forwardMessages | письма из messages уходят на адрес chatId, каждое — отдельной пересылкой |
| readChat | письмо idMessage или все непрочитанные письма собеседника во «Входящих» — прочитанными в ящике |
| getChatHistory, getMessage, downloadFile | переписка с адресом во «Входящих» и «Отправленных», до 200 писем |
| getChats, getContacts, getContactInfo | собеседники последних писем «Входящих» и «Отправленных» |
| sendTyping | {} и ничего не делает: «печатает» у почты нет |
| getAvatar | {"urlAvatar": "", "available": false} |
checkAccount, editMessage, deleteMessage, реакции, геопозиция, контакт, опрос, архив и закрепы, группы, сообщества, звонки, истории |
501 not_supported. Удалить письмо в ящике — deleteMessages |
Пределы
| Что | Предел | Если больше |
|---|---|---|
| Письмо с вложениями | 20 МБ | 400 too_large |
| Писем в сутки с ящика | 300: все отправки — sendMessage, файлы, sendEmail, ответы, пересылки, отправка черновиков |
429 daily_limit, Retry-After: 3600 |
| Пауза между письмами | 2 секунды | отказа нет: запрос подождёт |
| Писем в одном ответе списка | 500 | limit больше 500 считается как 500, остальное — следующей страницей |
| Писем в одном запросе флагов, переноса, удаления | 500 | 400 validation |
Сутки считаются по UTC. Сколько писем ушло сегодня — sentToday в getMailboxInfo.
Что Gratio меняет в ящике
Gratio читает письма, не помечая их прочитанными. Ящик меняется только по вашим вызовам: флаги, перенос, удаление, папки, черновики. Отправка меняет ещё две вещи: копия письма ложится в «Отправленные», если сервер не кладёт её сам, а письмо, на которое ответили через replyEmail, помечается «отвечено». Все изменения сразу видны сотрудникам в их почтовых программах.
Что дальше
- connectMailbox — подключить ящик из своего приложения.
- getMessages — письма папки страницами.
- sendEmail — письмо со всеми полями.
- Письмо — уведомление о новом письме.
