- Добавлен рабочий код для подготовки бинарных данных и вложений для узла Send email - Реализовано форматирование form_data в читаемый текст с разделами: * Личные данные (с автоматическим расчетом возраста, код документа, серия и номер) * Контактная информация * Страховщик (с телефоном страховой компании) * Банковские реквизиты (с получателем платежа) * Информация о страховом случае * Описание ситуации - Добавлена документация по использованию и устранению неполадок - Созданы альтернативные версии кода (простая версия, Function Node версия)
8.6 KiB
Быстрое исправление ошибки с вложениями в n8n "Send email"
✅ РАБОЧЕЕ РЕШЕНИЕ
Используйте код из файла: N8N_CODE_PREPARE_EMAIL_ATTACHMENTS_WORKING.js
В узле "Send email":
-
В поле "Attachments" используйте:
{{ $json.attachment_field }} -
В поле "Text" (или "Body") используйте читаемый текст:
{{ $json.email_body }}Вместо нечитаемого JSON
{{ $('Webhook').item.json.body.form_data }}вы получите красиво отформатированный текст!
Этот код успешно протестирован и работает! ✅
Проблемы, которые решает этот код
- ❌ "options.attachments.split is not a function"
- ❌ "The first argument must be of type string or an instance of Buffer... Received undefined"
- ❌ Бинарные данные не передаются между узлами
- ❌ Файлы не прикрепляются к email
✅ Правильная настройка
1. Code Node (подготовка данных)
✅ РАБОЧАЯ ВЕРСИЯ (РЕКОМЕНДУЕТСЯ):
Используйте код из файла N8N_CODE_PREPARE_EMAIL_ATTACHMENTS_WORKING.js
Этот код:
- ✅ Успешно обработан и протестирован
- ✅ Правильно обрабатывает бинарные данные из webhook
- ✅ Создает правильный
attachment_fieldдля узла "Send email" - ✅ Сохраняет бинарные данные в правильном формате
Альтернативные варианты (если основной не подходит):
Вариант A: Code Node (если бинарные данные нужно переименовать)
Используйте код из файла N8N_CODE_PREPARE_EMAIL_ATTACHMENTS.js
Вариант B: Code Node (простая версия - если бинарные данные уже в правильном формате)
Используйте код из файла N8N_CODE_PREPARE_EMAIL_ATTACHMENTS_SIMPLE.js
Вариант C: Function Node (если Code Node не передает binary)
Используйте код из файла N8N_FUNCTION_PREPARE_EMAIL_ATTACHMENTS.js
2. Узел "Send email"
В поле "Attachments" используйте:
{{ $json.attachment_field }}
⚠️ ВАЖНО: Это должна быть СТРОКА, а не массив!
🔍 Проверка
Шаг 1: Проверьте OUTPUT Code Node
После выполнения Code Node проверьте OUTPUT панель:
-
Должно быть поле
attachment_field(строка):"attachment_field": "file_0,file_1,file_2,file_3" -
Должен быть объект
binaryс бинарными данными:binary: { file_0: { data: ..., fileName: "..." }, file_1: { data: ..., fileName: "..." }, ... }
Шаг 2: Проверьте настройки узла "Send email"
- Откройте узел "Send email"
- Найдите поле "Attachments" (не "Attachment"!)
- Убедитесь, что там указано:
{{ $json.attachment_field }} - НЕ используйте выражения типа:
{{ $json.attachments }}❌{{ $json.attachment_keys }}❌{{ Object.keys($binary) }}❌
Шаг 3: Проверьте передачу бинарных данных
Убедитесь, что бинарные данные передаются между узлами:
-
Code Node должен возвращать:
return [{ json: { ... }, binary: { file_0: ..., file_1: ... } // ⚠️ Это обязательно! }]; -
Узел "Send email" должен быть подключен напрямую к Code Node (без промежуточных узлов, которые могут потерять бинарные данные)
🐛 Если ошибка "Received undefined" все еще возникает
Эта ошибка означает, что бинарные данные не передаются в узел "Send email"!
⚠️ Проблема: Бинарные данные теряются между узлами
Симптомы:
- В OUTPUT Code Node нет раздела "Binary"
- Ошибка: "The first argument must be of type string or an instance of Buffer... Received undefined"
attachment_fieldесть, но файлы не прикрепляются
Решения:
Вариант 1: Используйте Function Node вместо Code Node
Function Node лучше сохраняет бинарные данные:
- Замените Code Node на Function Node
- Используйте код из
N8N_FUNCTION_PREPARE_EMAIL_ATTACHMENTS.js - Проверьте OUTPUT - должен быть раздел "Binary"
Вариант 2: Используйте простую версию кода
Если бинарные данные уже приходят с правильными именами (file_0, file_1, etc.):
- Используйте код из
N8N_CODE_PREPARE_EMAIL_ATTACHMENTS_SIMPLE.js - Этот код просто передает бинарные данные без изменений
Вариант 3: Проверьте цепочку узлов
Убедитесь, что между узлом с бинарными данными и "Send email" нет узлов, которые могут потерять binary:
- ❌ "Set" node может потерять binary
- ❌ "Edit Fields" может потерять binary
- ✅ "Code" / "Function" node сохраняет binary (если правильно настроен)
- ✅ Прямое подключение лучше всего
Вариант 4: Проверьте имя поля в узле "Send email"
В некоторых версиях n8n поле может называться по-другому:
- "Attachments" (множественное число)
- "Attachment" (единственное число)
- "Attachments Field"
Проверьте все варианты.
Вариант 2: Используйте Function Node вместо Code Node
Если Code Node не передает бинарные данные правильно, используйте Function Node:
const items = $input.all();
return items.map(item => {
const binary = {};
const attachmentString = [];
let i = 0;
for (const key of Object.keys(item.binary || {})) {
const newKey = `file_${i}`;
binary[newKey] = item.binary[key];
attachmentString.push(newKey);
i++;
}
return {
json: {
...item.json,
attachment_field: attachmentString.join(',')
},
binary: binary
};
});
Вариант 3: Проверьте версию n8n
В разных версиях n8n узел "Send email" может работать по-разному. Проверьте документацию для вашей версии:
- n8n 1.0+: обычно ожидает строку
- n8n 0.x: может ожидать массив
📝 Пример правильной настройки
Webhook → Process Files → Code Node → Send Email
↓
(attachment_field: "file_0,file_1,...")
↓
(binary: {file_0: {...}, file_1: {...}})
↓
[Send Email: Attachments = {{ $json.attachment_field }}]
❓ Частые вопросы
Q: Почему ошибка "split is not a function"?
A: Узел "Send email" пытается вызвать .split() на поле Attachments, значит он ожидает строку, а получает массив или объект.
Q: Почему файлы не прикрепляются?
A: Проверьте, что:
- Бинарные данные переданы в объекте
binary - Ключи в
binaryсовпадают с именами вattachment_field - Узел "Send email" подключен напрямую к Code Node
Q: Можно ли использовать массив?
A: Нет, узел "Send email" в вашей версии n8n ожидает строку. Используйте {{ $json.attachment_field }}.