Введение
В первой части мы рассмотрели архитектуру решения и преимущества использования n8n для обработки форм на статических сайтах. Теперь перейдем к практической части — созданию рабочего workflow, который будет принимать данные из формы, валидировать их, отправлять email, уведомлять в Telegram и сохранять в базу данных.
Лучший способ понять n8n — создать свой первый workflow. — Опыт разработчика
Регистрация в n8n.cloud
- Регистрация: Перейдите на n8n.io и создайте аккаунт
- Преимущества: Автоматические обновления, резервное копирование, HTTPS
Создание workflow
Шаг 1: Новый workflow
- Войдите в n8n
- Нажмите “Workflows” → “New workflow”
- Дайте название: “Contact Form Processing”
- Сохраните workflow
Шаг 2: Добавление Webhook узла
Webhook узел будет принимать данные из формы контактов.
1
2
3
4
5
6
|
Тип: Webhook
HTTP Method: POST
Path: /webhook/form-contact
Response Mode: Respond to Webhook
Options:
- CORS: * (для тестирования разрешает все)
|
Важные настройки:
- Path: Уникальный путь для вашего webhook
- Response Mode: “Respond to Webhook” позволяет контролировать ответ клиенту в n8n
- CORS: Необходимо ограничить до домена в продакшене
Шаг 3: Добавление Edit Fields узла
Узел преобразует входящие данные в удобный формат.
1
2
3
4
5
6
7
8
9
10
|
Values to Set:
name: {{ $json.body.name }}
email: {{ $json.body.email }}
topic: {{ $json.body.topic }}
message: {{ $json.body.message }}
agreement: {{ $json.body.agreement }}
timestamp: {{ $now }}
ip: {{ $json.headers["x-real-ip"] }}
userAgent: {{ $json.headers["user-agent"] }}
website: {{ $json.body.website }}
|
Шаг 4: Добавление Code узла для валидации
Для валидации используем Code node с языком программирования javascript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
// Получаем данные из предыдущего узла
const { name, email, topic, message, agreement, website } = $json;
// Объект для хранения ошибок
const errors = {};
// Проверка имени
if (!name || name.trim() === '') {
errors.name = "Имя обязательно";
}
// Проверка email с regex
const emailRegex = /^[^@]+@[^@]+\.[^@]+$/;
if (!email || !emailRegex.test(email)) {
errors.email = "Некорректный email";
}
// Проверка темы
if (!topic || topic.trim() === '') {
errors.topic = "Выберите тему";
}
// Проверка сообщения
if (!message || message.trim() === '') {
errors.message = "Сообщение обязательно";
}
// Проверка согласия (checkbox возвращает "on" или true)
const isAgreed = agreement === true || agreement === "on" || agreement === "1";
if (!isAgreed) {
errors.agreement = "Необходимо согласие на обработку данных";
}
// Проверка honeypot поля (должно быть пустым)
if (website && website.trim() !== '') {
errors.honeypot = "Спам обнаружен";
}
// Проверяем, есть ли ошибки
const hasErrors = Object.keys(errors).length > 0;
// Возвращаем результат
if (hasErrors) {
// Получаем первую ошибку
const firstErrorKey = Object.keys(errors)[0];
const firstErrorMessage = errors[firstErrorKey];
return {
success: false,
error: firstErrorMessage,
field: firstErrorKey,
allErrors: errors,
// Отправляем в выход "false" для обработки ошибок
__$output: "false"
};
} else {
// Все проверки пройдены
return {
success: true,
data: $json,
// Отправляем в выход "true" для продолжения обработки
__$output: "true"
};
}
|
Шаг 5: Добавление IF узла для настройки выходов из Code node
- Выход “true” → дальнейшая обработка (Email, Telegram)
- Выход “false” → Error Response
Шаг 6: Настройка Email узла
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
Тип: Email
Connection: SMTP
Настройки SMTP:
Host: smtp.yandex.ru
Port: 465 (SSL) или 587 (TLS)
User: your-email@yandex.ru
Password: [app-specific password]
Secure: true (для порта 465)
Параметры письма:
From: your-email@yandex.ru
To: your-email@yandex.ru
Subject: Новая заявка: {{ $json.data.topic }}
Body Format: HTML
Body:
<h3>Новая заявка с сайта</h3>
<p><strong>Имя:</strong> {{ $json.data.name }}</p>
<p><strong>Email:</strong> {{ $json.data.email }}</p>
<p><strong>Тема:</strong> {{ $json.data.topic }}</p>
<p><strong>Сообщение:</strong><br>{{ $json.data.message }}</p>
<p><strong>Время:</strong> {{ $json.data.timestamp }}</p>
<p><strong>IP:</strong> {{ $json.data.ip }}</p>
<p><strong>User Agent:</strong> {{ $json.data.userAgent }}</p>
|
Шаг 6: Настройка Telegram узла
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Тип: Telegram
Resource: Bot
Operation: Send Message
Chat ID: ваш Telegram ID
Текст:
📨 Новая заявка с сайта
👤 Имя: {{ $json.data.name }}
📧 Email: {{ $json.data.email }}
📝 Тема: {{ $json.data.topic }}
⏰ Время: {{ $json.data.timestamp }}
🌐 IP: {{ $json.data.ip }}
💬 Сообщение:
{{ $json.data.message }}
|
Как получить Chat ID в Telegram:
- Создайте бота через @BotFather
- Включить “Show Peer IDs in Profile” в Settings -> Advanced -> Expremental settings
- В профиле Бота посмотреть id
Шаг 7: Настройка Response узлов
Успешный Response
1
2
3
4
5
6
7
8
9
10
11
|
Тип: Response
Response Code: 200
Headers:
Content-Type: application/json
Access-Control-Allow-Origin: *
Body:
{
"success": true,
"message": "Заявка успешно отправлена",
"timestamp": "{{ $now }}"
}
|
Ошибка валидации
1
2
3
4
5
6
7
8
9
10
11
|
Тип: Response
Response Code: 400
Headers:
Content-Type: application/json
Access-Control-Allow-Origin: *
Body:
{
"success": false,
"error": "{{ $json.error }}",
"field": "{{ $json.field }}"
}
|
Соединение узлов
Соберите workflow в следующем порядке:
1
2
3
4
5
6
7
8
9
10
11
12
|
1. Webhook
↓
2. Edit Fields
↓
3. Code (валидация)
├─── Выход "true" ───▶ 4. Email
│ ↓
│ 5. Telegram
│ ↓
│ 6. Success Response
│
└─── Выход "false" ──▶ 7. Error Response
|
Тестирование workflow
Тест 1: Проверка webhook
1
2
3
4
5
6
7
8
9
10
|
curl -X POST https://domain.app.n8n.cloud/webhook-test/form-contact \
-H "Content-Type: application/json" \
-d '{
"name": "Тестовый пользователь",
"email": "test@example.com",
"topic": "Вопрос по интеграции",
"message": "Тестовое сообщение",
"agreement": true,
"website": ""
}'
|
Тест 2: Проверка ошибок валидации
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# Пустое имя
curl -X POST https://domain.app.n8n.cloud/webhook-test/form-contact \
-H "Content-Type: application/json" \
-d '{"name": "", "email": "test@example.com"}'
# Некорректный email
curl -X POST https://domain.app.n8n.cloud/webhook-test/form-contact \
-H "Content-Type: application/json" \
-d '{"name": "Тест", "email": "invalid-email"}'
# Заполненное honeypot поле
curl -X POST https://domain.app.n8n.cloud/webhook-test/form-contact \
-H "Content-Type: application/json" \
-d '{"name": "Тест", "email": "test@example.com", "website": "spam"}'
|
Тест 3: Использование Execution History
- Отправьте тестовые данные
- Перейдите в “Executions” в n8n
- Найдите ваше выполнение
- Просмотрите данные на каждом узле
- Проверьте ошибки, если они есть
Оптимизация workflow
Добавление Rate Limiting в 1 узле (Webhook)
1
2
3
|
Тип: Webhook
Limit: 5 запросов
Duration: 60 секунд
|
Включи Retry On Fail в Webhook.
Проблемы с которыми столкнулся
Проблема: “No Respond to Webhook node found in the workflow”
Решение: Послеь включения Webhook в режиме Respond to Webhook,необходимо в конце workflow добавить завершающий узел Webhook Response Node.
Проблема: Email не отправляется
Решение: Проверьте SMTP настройки, используйте app-specific password для почтовых сервисов.
Заключение
В итоге создали полнофункциональный n8n workflow для обработки форм контактов. Workflow включает:
- Прием данных через webhook
- Валидацию с проверкой всех полей и honeypot защиты
- Отправку email с деталями заявки
- Уведомление в Telegram для мгновенного оповещения
- Ответ клиенту с информацией об успехе или ошибке
Ключевые моменты:
- Использование Code node для сложной валидации
- Тестированиие workflow через Execution History
- Добавление Rate Limiting для защиты от DDoS атак
В следующей статье мы обновим фронтенд — модифицируем HTML форму, добавим JavaScript обработку и CSS стили для улучшения пользовательского опыта.
Что дальше?
В следующих статьях этой серии мы подробно рассмотрим:
- Часть 3: Обновление фронтенда — модификация HTML формы, добавление JavaScript, CSS стили
- Часть 4: Безопасность и тестирование — защита от спама, rate limiting, тестовые сценарии
*Это вторая статья из серии по интеграции n8n. В следующих частях мы перейдем к практической реализации.