// ============================================================================ // 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];