Files
crm.clientright.ru/ticket_form/docs/N8N_CODE_PREPARE_EMAIL_ATTACHMENTS.js

114 lines
5.3 KiB
JavaScript
Raw Normal View History

// ============================================================================
// n8n Code Node: Подготовка бинарных данных для отправки email с вложениями
// ============================================================================
// Согласно документации n8n, поле "Attachments" в узле "Send email" ожидает:
// "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"
//
// ИСПОЛЬЗОВАНИЕ В УЗЛЕ "Send email":
// В поле "Attachments" используйте: {{ $json.attachment_field }}
//
// Это строка с именами бинарных свойств через запятую, например:
// "file_0,file_1,file_2,file_3"
//
// ⚠️ ВАЖНО:
// - Это должны быть ИМЕНА бинарных свойств (ключи из объекта binary), а не сами данные
// - Формат: строка через запятую, НЕ массив
// - Бинарные данные должны быть в объекте binary с соответствующими ключами
//
// ❌ НЕ используйте:
// - {{ $json.attachments }} (это массив объектов!)
// - {{ $json.attachment_keys }} (это массив строк!)
// - {{ Object.keys($binary) }} (это массив!)
// ============================================================================
// Проверяем наличие бинарных данных
// В n8n бинарные данные доступны через $binary или $input.item.binary
// Пробуем разные способы доступа к бинарным данным
let inputBinary = $binary;
if (!inputBinary || Object.keys(inputBinary).length === 0) {
// Пробуем через $input
try {
inputBinary = $input.item?.binary || $input?.binary || $binary;
} catch (e) {
inputBinary = $binary;
}
}
if (!inputBinary || Object.keys(inputBinary).length === 0) {
// Если бинарных данных нет, возвращаем данные без изменений
return [{
json: {
...$json,
attachment_field: '',
attachments: [],
attachment_keys: [],
error: 'No binary data found',
debug: {
binaryKeys: Object.keys(inputBinary || {}),
hasBinary: !!inputBinary,
hasDollarBinary: !!$binary,
dollarBinaryKeys: Object.keys($binary || {})
}
}
}];
}
// Создаем объект для бинарных данных и массивы для разных форматов
const binary = {};
const attachmentString = [];
const attachmentArray = []; // Массив объектов для поля Attachments
const attachmentKeys = []; // Простой массив ключей (альтернативный формат)
let i = 0;
// Преобразуем все бинарные данные в формат file_0, file_1, etc.
for (const key of Object.keys(inputBinary)) {
const newKey = `file_${i}`;
const fileData = inputBinary[key];
// Копируем бинарные данные с сохранением всех свойств
binary[newKey] = {
...fileData,
fileName: fileData.fileName || fileData.name || `file_${i}.pdf`,
name: fileData.name || fileData.fileName || `file_${i}.pdf`
};
attachmentString.push(newKey);
attachmentKeys.push(newKey);
// Создаем объект для поля Attachments узла "Send email"
// ВАЖНО: data должен быть строкой с ключом, а не объектом
attachmentArray.push({
name: fileData.fileName || fileData.name || `file_${i}.pdf`,
data: newKey // Строка-ключ для ссылки на бинарные данные
});
i++;
}
// ⚠️ КРИТИЧНО: Бинарные данные должны быть переданы в объекте binary
// Ключи в binary должны совпадать с именами в attachment_field!
// В n8n Code Node нужно явно указать binary в возвращаемом объекте
const result = {
json: {
...$json,
// ⚠️ ВАЖНО: Строка с именами бинарных свойств через запятую БЕЗ ПРОБЕЛОВ
// Это именно то, что ожидает узел "Send email" согласно документации:
// "Enter the name of the binary properties... comma-separated list of binary properties"
// Формат: "file_0,file_1,file_2" - имена ключей из объекта binary
// ⚠️ Убираем все пробелы, чтобы имена точно совпадали с ключами в binary
attachment_field: attachmentString.join(',').replace(/\s+/g, ''),
// Массив объектов (для других целей, если нужно)
attachments: attachmentArray,
// Простой массив ключей (для отладки или других целей)
attachment_keys: attachmentKeys
},
// ⚠️ КРИТИЧНО: Бинарные данные должны быть переданы в объекте binary
binary: binary
};
// Возвращаем данные с бинарными файлами
return [result];