- Добавлен рабочий код для подготовки бинарных данных и вложений для узла Send email - Реализовано форматирование form_data в читаемый текст с разделами: * Личные данные (с автоматическим расчетом возраста, код документа, серия и номер) * Контактная информация * Страховщик (с телефоном страховой компании) * Банковские реквизиты (с получателем платежа) * Информация о страховом случае * Описание ситуации - Добавлена документация по использованию и устранению неполадок - Созданы альтернативные версии кода (простая версия, Function Node версия)
8.5 KiB
Исправление проблемы с вложениями в узле "Send email" n8n
Проблема
Узел "Send email" выдает ошибку:
The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received undefined
Причина: В поле Attachments передается строка с именами файлов (file_0,file_1,file_2...), но узел ожидает бинарные данные файлов.
Решение
Вариант 1: Использование Code Node для подготовки данных (Рекомендуется)
Шаг 1: Добавьте Code Node перед узлом "Send email"
Код для Code Node:
// Создаем объект для бинарных данных и массив имен файлов
const binary = {};
const attachmentString = [];
const attachmentArray = []; // Массив объектов для поля Attachments
let i = 0;
// Преобразуем все бинарные данные в формат file_0, file_1, etc.
for (const key of Object.keys($binary)) {
const newKey = `file_${i}`;
binary[newKey] = $binary[key];
attachmentString.push(newKey);
// Создаем объект для поля Attachments узла "Send email"
attachmentArray.push({
name: $binary[key].fileName || $binary[key].name || `file_${i}.pdf`,
data: newKey // Ссылка на бинарные данные
});
i++;
}
// Возвращаем данные с бинарными файлами
return [{
json: {
...$json,
attachment_field: attachmentString.join(','),
attachments: attachmentArray
},
binary: binary
}];
Шаг 2: Настройте узел "Send email"
Согласно официальной документации n8n:
"Enter the name of the binary properties that contain data to add as an attachment. Add multiple attachments by entering a comma-separated list of binary properties."
В поле "Attachments" используйте:
✅ ПРАВИЛЬНО (РЕКОМЕНДУЕТСЯ):
{{ $json.attachment_field }}
Это строка с именами бинарных свойств через запятую: "file_0,file_1,file_2,file_3"
Важно понимать:
- Это имена ключей из объекта
binary, а не сами данные - Формат: строка через запятую, НЕ массив
- Узел "Send email" найдет бинарные данные по этим именам в объекте
binary
❌ НЕПРАВИЛЬНО - НЕ ИСПОЛЬЗУЙТЕ:
- Массив объектов:
{{ $json.attachments }} // ❌ Это массив объектов!
- Массив строк:
{{ $json.attachment_keys }} // ❌ Это массив строк!
{{ Object.keys($binary) }} // ❌ Это тоже массив!
⚠️ КРИТИЧНО:
- Используйте СТРОКУ
{{ $json.attachment_field }} - Убедитесь, что бинарные данные переданы в объекте
binaryвыходного значения Code Node - Ключи в объекте
binaryдолжны точно совпадать с именами в строкеattachment_field! - Например: если
attachment_field = "file_0,file_1", то вbinaryдолжны быть ключиfile_0иfile_1
Вариант 2: Прямое использование бинарных данных (Проще)
Если бинарные данные уже есть в правильном формате, просто используйте их напрямую:
В поле Attachments узла "Send email":
{{
Object.keys($binary).map(key => {
const file = $binary[key];
return {
name: file.fileName || file.name || key,
data: file.data || file
};
})
}}
Вариант 3: Использование Function Node (Если Code Node не работает)
Если Code Node не передает бинарные данные правильно, используйте Function Node:
const items = $input.all();
const result = items.map(item => {
const binary = {};
const attachmentArray = [];
let i = 0;
for (const key of Object.keys(item.binary || {})) {
const newKey = `file_${i}`;
binary[newKey] = item.binary[key];
attachmentArray.push({
name: item.binary[key].fileName || item.binary[key].name || `file_${i}.pdf`,
data: newKey
});
i++;
}
return {
json: {
...item.json,
attachments: attachmentArray,
attachment_field: Object.keys(binary).join(',')
},
binary: binary
};
});
return result;
Проверка работы
-
Убедитесь, что бинарные данные передаются:
- В Code/Function Node должен быть объект
binaryв возвращаемом значении - Проверьте в OUTPUT панели, что бинарные данные присутствуют
- В Code/Function Node должен быть объект
-
Проверьте формат данных:
- В поле Attachments должен быть массив объектов или правильная ссылка на бинарные данные
- Каждый объект должен содержать
nameиdata
-
Тестирование:
- Запустите workflow в тестовом режиме
- Проверьте, что email отправляется с вложениями
Частые ошибки
-
Ошибка: "Received undefined"
- Причина: Бинарные данные не переданы в выходном объекте
- Решение: Убедитесь, что объект
binaryвключен в возвращаемое значение Code/Function Node
-
Ошибка: "options.attachments.split is not a function" или "property.split is not a function"
- Причина: В поле Attachments передан массив (объектов или строк) вместо строки. Согласно документации n8n, поле ожидает "comma-separated list of binary properties" (строку через запятую), а не массив.
- Решение:
- ✅ Используйте СТРОКУ с именами бинарных свойств:
{{ $json.attachment_field }} - Формат должен быть:
"file_0,file_1,file_2"(строка), а не["file_0","file_1","file_2"](массив) - ❌ НЕ используйте
{{ $json.attachments }}(это массив объектов) - ❌ НЕ используйте
{{ $json.attachment_keys }}(это массив строк) - ❌ НЕ используйте
{{ Object.keys($binary) }}(это тоже массив)
- ✅ Используйте СТРОКУ с именами бинарных свойств:
-
Ошибка: "Invalid argument type"
- Причина: Неправильный формат данных в поле Attachments
- Решение: Используйте строку с именами бинарных свойств через запятую:
"file_0,file_1,file_2"(строка), а не массив
-
Файлы не прикрепляются
- Причина: Имена файлов не совпадают с ключами в объекте
binary - Решение: Убедитесь, что ключи в массиве Attachments точно соответствуют ключам в объекте
binary
- Причина: Имена файлов не совпадают с ключами в объекте
Пример полного workflow
Webhook → Process Files → Code Node (подготовка) → Send Email
↓
(binary данные)
↓
(attachments массив)
Code Node:
- Вход: бинарные данные из предыдущего узла
- Выход:
{ json: {...}, binary: {...} }с правильными ссылками
Send Email:
- Attachments:
{{ $json.attachments }}или прямое обращение к$binary
Дополнительные ресурсы
- Файл с кодом:
ticket_form/docs/N8N_CODE_PREPARE_EMAIL_ATTACHMENTS.js - Документация n8n: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.email/