Files
crm.clientright.ru/ticket_form/docs/N8N_EMAIL_ATTACHMENTS_QUICK_FIX.md
Fedor ea0edafba5 Добавлена обработка бинарных данных и форматирование email для n8n workflow
- Добавлен рабочий код для подготовки бинарных данных и вложений для узла Send email
- Реализовано форматирование form_data в читаемый текст с разделами:
  * Личные данные (с автоматическим расчетом возраста, код документа, серия и номер)
  * Контактная информация
  * Страховщик (с телефоном страховой компании)
  * Банковские реквизиты (с получателем платежа)
  * Информация о страховом случае
  * Описание ситуации
- Добавлена документация по использованию и устранению неполадок
- Созданы альтернативные версии кода (простая версия, Function Node версия)
2025-12-26 14:51:58 +03:00

8.6 KiB
Raw Blame History

Быстрое исправление ошибки с вложениями в n8n "Send email"

РАБОЧЕЕ РЕШЕНИЕ

Используйте код из файла: N8N_CODE_PREPARE_EMAIL_ATTACHMENTS_WORKING.js

В узле "Send email":

  1. В поле "Attachments" используйте:

    {{ $json.attachment_field }}
    
  2. В поле "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 панель:

  1. Должно быть поле attachment_field (строка):

    "attachment_field": "file_0,file_1,file_2,file_3"
    
  2. Должен быть объект binary с бинарными данными:

    binary: {
      file_0: { data: ..., fileName: "..." },
      file_1: { data: ..., fileName: "..." },
      ...
    }
    

Шаг 2: Проверьте настройки узла "Send email"

  1. Откройте узел "Send email"
  2. Найдите поле "Attachments" (не "Attachment"!)
  3. Убедитесь, что там указано: {{ $json.attachment_field }}
  4. НЕ используйте выражения типа:
    • {{ $json.attachments }}
    • {{ $json.attachment_keys }}
    • {{ Object.keys($binary) }}

Шаг 3: Проверьте передачу бинарных данных

Убедитесь, что бинарные данные передаются между узлами:

  1. Code Node должен возвращать:

    return [{
      json: { ... },
      binary: { file_0: ..., file_1: ... }  // ⚠️ Это обязательно!
    }];
    
  2. Узел "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 лучше сохраняет бинарные данные:

  1. Замените Code Node на Function Node
  2. Используйте код из N8N_FUNCTION_PREPARE_EMAIL_ATTACHMENTS.js
  3. Проверьте OUTPUT - должен быть раздел "Binary"

Вариант 2: Используйте простую версию кода

Если бинарные данные уже приходят с правильными именами (file_0, file_1, etc.):

  1. Используйте код из N8N_CODE_PREPARE_EMAIL_ATTACHMENTS_SIMPLE.js
  2. Этот код просто передает бинарные данные без изменений

Вариант 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: Проверьте, что:

  1. Бинарные данные переданы в объекте binary
  2. Ключи в binary совпадают с именами в attachment_field
  3. Узел "Send email" подключен напрямую к Code Node

Q: Можно ли использовать массив?
A: Нет, узел "Send email" в вашей версии n8n ожидает строку. Используйте {{ $json.attachment_field }}.