diff --git a/backend/services/emailBot.js b/backend/services/emailBot.js index 77b796a..feb8d32 100644 --- a/backend/services/emailBot.js +++ b/backend/services/emailBot.js @@ -5,6 +5,7 @@ const { Pool } = require('pg'); const Imap = require('imap'); const { simpleParser } = require('mailparser'); const { checkMailServer } = require('../utils/checkMail'); +const { sleep, isValidEmail } = require('../utils/helpers'); require('dotenv').config(); class EmailBotService { @@ -67,8 +68,6 @@ class EmailBotService { stack: error.stack }); setTimeout(() => this.initSMTP(), 30000); - } else { - console.log('SMTP сервер готов к отправке сообщений'); } }); @@ -113,7 +112,7 @@ class EmailBotService { try { console.log('Попытка подключения к SMTP...'); await this.transporter.verify(); - console.log('SMTP подключение установлено'); + console.log('SMTP сервер готов к отправке сообщений'); } catch (error) { console.error('Ошибка подключения к SMTP:', { name: error.name, @@ -165,39 +164,48 @@ class EmailBotService { async processEmail(message) { try { + // Очищаем и валидируем email адрес + const cleanEmail = message.from.replace(/[<>]/g, '').trim(); + if (!isValidEmail(cleanEmail)) { + console.log('Некорректный email адрес:', message.from); + return; + } + // Проверяем, не является ли отправитель no-reply адресом - if (message.from.toLowerCase().includes('no-reply') || - message.from.toLowerCase().includes('noreply')) { - console.log('Пропускаем письмо от no-reply адреса:', message.from); + if (cleanEmail.toLowerCase().includes('no-reply') || + cleanEmail.toLowerCase().includes('noreply')) { + console.log('Пропускаем письмо от no-reply адреса:', cleanEmail); return; } // Проверяем валидность домена получателя - const domain = message.from.split('@')[1]; + const domain = cleanEmail.split('@')[1]; try { + console.log(`Проверяем MX записи для домена ${domain}...`); const records = await checkMailServer(domain); if (!records || records.length === 0) { console.log('Пропускаем письмо - домен не найден:', domain); return; } + console.log('Найдены MX записи:', records); } catch (err) { - console.error('Ошибка проверки домена:', err); + console.error('Ошибка при проверке MX записей:', err); return; } // Получаем ответ от Ollama const result = await this.chat.invoke(message.text); - // Формируем и отправляем ответ + // Отправляем ответ await this.transporter.sendMail({ from: process.env.EMAIL_USER, - to: message.from, + to: cleanEmail, subject: `Re: ${message.subject}`, text: result.content }); console.log('Ответ отправлен:', { - to: message.from, + to: cleanEmail, subject: message.subject }); } catch (error) { diff --git a/backend/services/telegramBot.js b/backend/services/telegramBot.js index c20447e..4b936aa 100644 --- a/backend/services/telegramBot.js +++ b/backend/services/telegramBot.js @@ -4,6 +4,8 @@ const axios = require('axios'); const dns = require('dns').promises; require('dotenv').config(); const { sleep } = require('../utils/helpers'); +const util = require('util'); +const exec = util.promisify(require('child_process').exec); class TelegramBotService { constructor(token) { @@ -156,14 +158,17 @@ class TelegramBotService { const addresses = await dns.resolve4('api.telegram.org'); console.log('IP адреса api.telegram.org:', addresses); - // Пинг для проверки доступности - const { exec } = require('child_process'); - exec(`ping -c 1 api.telegram.org`, (error, stdout, stderr) => { + // Пинг для проверки доступности (теперь ждем результат) + try { + const { stdout } = await exec('ping -c 1 api.telegram.org'); console.log('Результат ping:', stdout); - }); + } catch (pingError) { + console.error('Ошибка при выполнении ping:', pingError); + throw new Error('Сервер Telegram недоступен'); + } } catch (error) { - console.error('Ошибка DNS резолвинга:', error); - throw error; // Прерываем инициализацию если DNS недоступен + console.error('Ошибка сетевой проверки:', error); + throw error; } // Затем проверяем API @@ -342,6 +347,19 @@ class TelegramBotService { } } } + + async checkTelegramAvailability() { + const { stdout } = await exec('ping -c 1 api.telegram.org'); + const match = stdout.match(/time=(\d+(\.\d+)?)/); + if (match) { + const pingTime = parseFloat(match[1]); + console.log(`Время отклика Telegram API: ${pingTime}ms`); + if (pingTime > 1000) { // Если пинг больше секунды + console.warn('Внимание: высокая задержка при подключении к Telegram API'); + } + } + return stdout; + } } module.exports = TelegramBotService; \ No newline at end of file diff --git a/backend/utils/helpers.js b/backend/utils/helpers.js index 9175b5d..9d31835 100644 --- a/backend/utils/helpers.js +++ b/backend/utils/helpers.js @@ -3,6 +3,13 @@ function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } +// Функция для валидации email адреса +function isValidEmail(email) { + const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; + return emailRegex.test(email); +} + module.exports = { - sleep + sleep, + isValidEmail }; \ No newline at end of file