114 lines
5.3 KiB
JavaScript
114 lines
5.3 KiB
JavaScript
|
|
// ============================================================================
|
|||
|
|
// 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];
|
|||
|
|
|