Интеграция Email, IMAP и Gmail в n8n: парсинг писем, вложения и задачи ¶
Обновлено: 2026-05-30
Импортируйте JSON в n8n, замените credentials, URL API, IDs, папки, каналы, лимиты и правила под вашу инфраструктуру.
Проблема: Письма остаются главным входом для заявок, счетов и обращений, но простая обработка inbox в n8n быстро создаёт дубли, ловит автоответы и теряет вложения.
Решение: Надёжная email-интеграция через n8n фильтрует inbox по label/folder, использует Message-ID как idempotency key, парсит тему и тело, сохраняет вложения и создаёт задачу, лид или ticket только один раз.
Проблема: почему простая интеграция создаёт дубли и ручной хаос ¶
Email выглядит простым источником данных, пока не появляются пересылки, треды, автоответчики, подписи, HTML-тело, вложения, одинаковые темы и письма от no-reply. Поэтому workflow должен работать не с “последним письмом”, а с устойчивым контрактом: message_id, from, subject, body_text, attachments и thread context.
Для Gmail лучше использовать Gmail API/labels, когда нужны стабильные IDs и вложения. Для общего почтового ящика подойдёт IMAP, но тогда особенно важны folder, seen/unseen state и журнал обработанных Message-ID.
Архитектура workflow для n8n ¶
| Блок | Задача | Production-проверка |
|---|---|---|
| Email/Gmail trigger | читает новые письма из label/folder | правильный label, query, unseen state |
| Normalize message | готовит from, subject, text, html и message_id | нет автоответов и no-reply |
| Parse intent | выделяет тип письма: заявка, счёт, support, спам | правила до создания задачи |
| Handle attachments | сохраняет PDF/CSV/изображения в облако | проверка размера и типа |
| Check idempotency | не обрабатывает Message-ID повторно | уникальный ключ mailbox+message_id |
| Create task/ticket | создаёт задачу, лид или ticket | ссылка на письмо и вложения |
Email workflow должен сначала решить, надо ли письмо обрабатывать вообще. Создавать задачу до фильтров — значит переносить мусор из inbox в CRM.
Контракт входных данных ¶
{
"mailbox": "support@example.ru",
"message_id": "<CA+n8n-demo-10492@example.ru>",
"from": "client@example.ru",
"subject": "Счет и договор по проекту n8n",
"body_text": "Добрый день, отправляю счет и договор во вложении.",
"attachments": [
{
"filename": "invoice-10492.pdf",
"mime_type": "application/pdf",
"size_bytes": 284112
},
{
"filename": "contract.docx",
"mime_type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"size_bytes": 491230
}
],
"received_at": "2026-05-30T10:15:00Z"
}Контракт нужен для тестов и повторного запуска. Даже если источник — Gmail Trigger, внутри workflow лучше привести письмо к единому виду: message_id, sender, subject, body_text, attachments.
Code Node: нормализация, mapping и guard-условия ¶
const src = $json.body ?? $json;
const headers = src.headers ?? {};
const messageId = String(src.message_id ?? headers['message-id'] ?? src.id ?? '').trim();
if (!messageId) throw new Error('No email Message-ID or provider id');
const from = String(src.from ?? '').toLowerCase();
const subject = String(src.subject ?? '').trim();
const body = String(src.body_text ?? src.text ?? '').trim();
const ignored = /(auto.?reply|out of office|delivery status|mailer-daemon|no-reply)/i;
if (ignored.test(from) || ignored.test(subject)) {
return [{ json: { action: 'ignore', reason: 'auto_or_system_email', from, subject } }];
}
const attachments = Array.isArray(src.attachments) ? src.attachments.filter(a => {
const size = Number(a.size_bytes ?? 0);
const name = String(a.filename ?? '').toLowerCase();
return size > 0 && size < 25 * 1024 * 1024 && !name.endsWith('.exe');
}) : [];
const intent = /счет|invoice|оплат/i.test(subject + ' ' + body) ? 'invoice' : /договор|contract/i.test(subject + ' ' + body) ? 'contract' : 'support_request';
return [{ json: {
action: 'create_task_or_ticket',
idempotency_key: `email:${src.mailbox ?? 'default'}:${messageId}`.toLowerCase(),
from, subject, intent,
body_preview: body.slice(0, 600),
attachment_count: attachments.length,
attachments,
received_at: src.received_at ?? new Date().toISOString()
}}];
Gmail API или IMAP: что выбрать
Gmail API удобнее для Gmail/Google Workspace: стабильные message ids, labels и отдельный attachments.get. IMAP универсальнее для любого ящика, но требует аккуратного управления folder, seen/unseen и повторной обработкой.
Готовый workflow JSON: скачать и импортировать ¶
Скачать готовый workflow JSON Скачать тестовый payload
{
"name": "Nodbot - Email IMAP Gmail parser with attachments",
"nodes": [
{
"name": "Email or Gmail Trigger",
"type": "n8n-nodes-base.webhook",
"purpose": "Получить новое письмо"
},
{
"name": "Normalize message",
"type": "n8n-nodes-base.code",
"purpose": "Собрать единый контракт письма"
},
{
"name": "Classify email intent",
"type": "n8n-nodes-base.code",
"purpose": "Определить заявку, счёт или support"
},
{
"name": "Check Message-ID dedupe",
"type": "n8n-nodes-base.postgres",
"purpose": "Не обработать письмо повторно"
},
{
"name": "Save attachments",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Сохранить вложения в облако"
},
{
"name": "Create task or ticket",
"type": "n8n-nodes-base.httpRequest",
"purpose": "Создать задачу/тикет/лид"
}
],
"connections": "Email or Gmail Trigger → Normalize message → Classify email intent → Check Message-ID dedupe → Save attachments → Create task or ticket"
}
Пошаговая настройка связки ¶
- Выберите источник: Gmail API для Google Workspace или IMAP для общего ящика.
- Настройте label/folder только для писем, которые должны попадать в автоматизацию.
- Импортируйте workflow JSON и замените credentials.
- Добавьте idempotency storage по mailbox+message_id.
- Протестируйте письмо с вложением, письмо без вложений и автоответ.
Тесты перед production ¶
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/integration-email-imap-gmail-n8n-parser" \
-H "Content-Type: application/json" \
--data @integration-email-imap-gmail-n8n-parser-payload.json- Повторный payload не создаёт дубль и возвращает тот же output key.
- Некорректный mapping останавливается до запроса к внешнему API.
- Пустые необязательные поля не ломают workflow.
- Ошибка API уходит в alert или DLQ с безопасным payload.
- Execution data не содержит секретов, токенов и лишних персональных данных.
Production-риски ¶
- Обрабатывается весь inbox. Workflow создаст задачи из рассылок, автоответов и системных писем.
- Нет Message-ID dedupe. Пересылка или повторный trigger создаст второй ticket.
- HTML тело парсится как plain text. В задачу попадает мусор из подписи и стилей.
- Вложения не проверяются. Большие или опасные файлы ломают execution.
- Нет ссылки на исходное письмо. Менеджер не может быстро восстановить контекст.
Полезные ссылки и смежные материалы ¶
- Gmail API messages
- Gmail API attachments.get
- Gmail и n8n
- Создать задачу Битрикс24 из email
- Gmail attachments to cloud disk
- Dropbox и n8n
Критерии готовности ¶
- Источник ограничен label/folder/query, а не всем inbox.
- Message-ID или provider id сохраняется как idempotency key.
- Автоответы, no-reply и delivery status отфильтрованы.
- Вложения проверяются по размеру, типу и имени.
- Созданная задача содержит ссылку на письмо, preview и файлы.
Nodbot настроит Email/IMAP/Gmail + n8n: фильтры, Message-ID idempotency, парсинг тела, вложения, облачное хранение и создание задач в CRM/helpdesk.
Обсудить email-автоматизацию