Отвечает на письмо так же, как кнопка «Ответить» в почтовой программе: на адрес из Reply-To или отправителю, в ту же цепочку, с темой «Re: …» и цитатой. Письмо, на которое ответили, помечается «отвечено». Подходит письмо из любой папки, в том числе то, которого не было в уведомлениях.
| Запрос | POST /waInstance{idInstance}/replyEmail/{apiTokenInstance} |
| Тело | JSON |
| Каналы | почта |
Параметры
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
folder + uid, idMessage или messageId |
да, одно из | письмо, на которое отвечаете, — см. Почта через API | |
chatId |
string | нет | адрес собеседника — вместе с idMessage |
message |
string | нет* | текст ответа |
html |
string | нет* | своя html-версия |
files |
array | нет* | вложения: [{"urlFile": "…", "fileName": "…"}] |
replyAll |
boolean | нет | «ответить всем»: в копию все из «Кому» и «Копии» письма, кроме вас. Не задан — emailReplyAll |
quote |
boolean | нет | процитировать письмо. Не задан — emailQuote |
to, cc, bcc |
array, string | нет | ещё получатели, копия, скрытая копия |
subject |
string | нет | своя тема вместо «Re: …» |
signature |
string | нет | подпись; "" — без подписи. Не задана — emailSignature |
replyTo, readReceipt, priority, headers |
нет | как в sendEmail | |
clientMessageId |
string | нет | ключ от дублей |
* Нужен хотя бы один из message, html, files.
Кому уйдёт ответ: на адрес из Reply-To письма, без него — отправителю. На своё письмо — его первому получателю.
Пример запроса
Ответ на письмо Марии из уведомления:
curl
curl -X POST "$GRATIO_URL/waInstance$GRATIO_ID/replyEmail/$GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"idMessage": "c62b698304229a98aad3",
"chatId": "maria@client.ru",
"message": "Мария, записали вас на субботу, 11:00.",
"clientMessageId": "reply-1532"
}'
Python
import os
import requests
BASE = f"{os.environ['GRATIO_URL']}/waInstance{os.environ['GRATIO_ID']}"
TOKEN = os.environ["GRATIO_TOKEN"]
url = f"{BASE}/replyEmail/{TOKEN}"
payload = {
"idMessage": "c62b698304229a98aad3",
"chatId": "maria@client.ru",
"message": "Мария, записали вас на субботу, 11:00.",
"clientMessageId": "reply-1532",
}
response = requests.post(url, json=payload, timeout=60)
print(response.status_code, response.json())
Node.js
const { GRATIO_URL, GRATIO_ID, GRATIO_TOKEN } = process.env;
const base = `${GRATIO_URL}/waInstance${GRATIO_ID}`;
const url = `${base}/replyEmail/${GRATIO_TOKEN}`;
const payload = {
idMessage: "c62b698304229a98aad3",
chatId: "maria@client.ru",
message: "Мария, записали вас на субботу, 11:00.",
clientMessageId: "reply-1532",
};
const response = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
console.log(response.status, await response.json());
PHP
<?php
$base = getenv('GRATIO_URL') . '/waInstance' . getenv('GRATIO_ID');
$url = $base . '/replyEmail/' . getenv('GRATIO_TOKEN');
$payload = [
'idMessage' => 'c62b698304229a98aad3',
'chatId' => 'maria@client.ru',
'message' => 'Мария, записали вас на субботу, 11:00.',
'clientMessageId' => 'reply-1532',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$response = json_decode(curl_exec($ch), true);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), PHP_EOL;
print_r($response);
Пример ответа
Ответ 200 OK:
{
"idMessage": "db93a4558705f5b8ef5b",
"emailMessageData": {
"subject": "Re: Запись на пробное",
"messageId": "gr.ztme4rgc2femufilbicvmeimbh@school.ru",
"threadId": "c62b698304229a98aad3",
"inReplyTo": "CAF1xQm7v2k@mail.gmail.com",
"to": ["maria@client.ru"],
"cc": [],
"bcc": [],
"refused": {}
}
}
Поля — как у sendEmail.
Ещё примеры
Ответить всем
Мария написала, а папа был в копии её письма — ответ уйдёт Марии, папа получит его в копии:
curl -X POST "$GRATIO_URL/waInstance$GRATIO_ID/replyEmail/$GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"folder": "inbox",
"uid": 1541,
"message": "Ждём вас обоих в субботу.",
"replyAll": true
}'
Ответ с файлом, без цитаты
curl -X POST "$GRATIO_URL/waInstance$GRATIO_ID/replyEmail/$GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"folder": "inbox",
"uid": 1540,
"message": "Спасибо! Анкету получили, договор — во вложении.",
"files": [
{
"urlFile": "https://api.gratio.net/upload/7100000001/c41a…/dogovor.pdf",
"fileName": "Договор.pdf"
}
],
"quote": false
}'
Как выглядит ответ
- Тема — «Re: » и тема письма, без накопления «Re: Re:».
- Заголовки In-Reply-To и References связывают ответ с цепочкой — почтовые программы покажут его в той же переписке.
- Под текстом — подпись, ниже — цитата письма собеседника. На своё письмо цитаты нет.
- Письмо, на которое ответили, помечается «отвечено» (
\Answered).
Ошибки
| Код | code |
Когда | Что делать |
|---|---|---|---|
400 |
validation |
не указано письмо; нет ни message, ни html, ни files |
исправить запрос |
400 |
not_found |
письма нет | указать folder и uid из getMessages |
400 |
folder_not_found |
нет папки folder |
проверить getFolders |
400 |
no_account |
у письма нет адреса для ответа | ответить методом sendEmail на нужный адрес |
400 |
bad_address, too_large, rejected, auth_failed и другие |
отказ почты | см. sendEmail |
402 |
payment_required |
канал на паузе за неоплату | продлить канал в кабинете |
409 |
idempotency_conflict |
тот же clientMessageId с другим ответом |
новый ключ для нового письма |
429 |
daily_limit, too_frequent |
предел ящика за сутки или почта просит подождать | повторить после Retry-After |
501 |
not_supported |
канал — не почта | вызвать у канала «Почта» |
503 |
outcome_unknown |
связь оборвалась посреди отправки | повторить с тем же clientMessageId |
Общие правила — в статье Ответы и ошибки.
Что дальше
- getThread — вся цепочка с ответом.
- forwardEmail — переслать письмо коллеге.
- Настройки ящика — «ответить всем» и цитата по умолчанию.
