Описание изменений
This commit is contained in:
@@ -5,6 +5,7 @@ const { Pool } = require('pg');
|
|||||||
const Imap = require('imap');
|
const Imap = require('imap');
|
||||||
const { simpleParser } = require('mailparser');
|
const { simpleParser } = require('mailparser');
|
||||||
const { checkMailServer } = require('../utils/checkMail');
|
const { checkMailServer } = require('../utils/checkMail');
|
||||||
|
const { sleep, isValidEmail } = require('../utils/helpers');
|
||||||
require('dotenv').config();
|
require('dotenv').config();
|
||||||
|
|
||||||
class EmailBotService {
|
class EmailBotService {
|
||||||
@@ -67,8 +68,6 @@ class EmailBotService {
|
|||||||
stack: error.stack
|
stack: error.stack
|
||||||
});
|
});
|
||||||
setTimeout(() => this.initSMTP(), 30000);
|
setTimeout(() => this.initSMTP(), 30000);
|
||||||
} else {
|
|
||||||
console.log('SMTP сервер готов к отправке сообщений');
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -113,7 +112,7 @@ class EmailBotService {
|
|||||||
try {
|
try {
|
||||||
console.log('Попытка подключения к SMTP...');
|
console.log('Попытка подключения к SMTP...');
|
||||||
await this.transporter.verify();
|
await this.transporter.verify();
|
||||||
console.log('SMTP подключение установлено');
|
console.log('SMTP сервер готов к отправке сообщений');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Ошибка подключения к SMTP:', {
|
console.error('Ошибка подключения к SMTP:', {
|
||||||
name: error.name,
|
name: error.name,
|
||||||
@@ -165,39 +164,48 @@ class EmailBotService {
|
|||||||
|
|
||||||
async processEmail(message) {
|
async processEmail(message) {
|
||||||
try {
|
try {
|
||||||
|
// Очищаем и валидируем email адрес
|
||||||
|
const cleanEmail = message.from.replace(/[<>]/g, '').trim();
|
||||||
|
if (!isValidEmail(cleanEmail)) {
|
||||||
|
console.log('Некорректный email адрес:', message.from);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Проверяем, не является ли отправитель no-reply адресом
|
// Проверяем, не является ли отправитель no-reply адресом
|
||||||
if (message.from.toLowerCase().includes('no-reply') ||
|
if (cleanEmail.toLowerCase().includes('no-reply') ||
|
||||||
message.from.toLowerCase().includes('noreply')) {
|
cleanEmail.toLowerCase().includes('noreply')) {
|
||||||
console.log('Пропускаем письмо от no-reply адреса:', message.from);
|
console.log('Пропускаем письмо от no-reply адреса:', cleanEmail);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Проверяем валидность домена получателя
|
// Проверяем валидность домена получателя
|
||||||
const domain = message.from.split('@')[1];
|
const domain = cleanEmail.split('@')[1];
|
||||||
try {
|
try {
|
||||||
|
console.log(`Проверяем MX записи для домена ${domain}...`);
|
||||||
const records = await checkMailServer(domain);
|
const records = await checkMailServer(domain);
|
||||||
if (!records || records.length === 0) {
|
if (!records || records.length === 0) {
|
||||||
console.log('Пропускаем письмо - домен не найден:', domain);
|
console.log('Пропускаем письмо - домен не найден:', domain);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
console.log('Найдены MX записи:', records);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Ошибка проверки домена:', err);
|
console.error('Ошибка при проверке MX записей:', err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Получаем ответ от Ollama
|
// Получаем ответ от Ollama
|
||||||
const result = await this.chat.invoke(message.text);
|
const result = await this.chat.invoke(message.text);
|
||||||
|
|
||||||
// Формируем и отправляем ответ
|
// Отправляем ответ
|
||||||
await this.transporter.sendMail({
|
await this.transporter.sendMail({
|
||||||
from: process.env.EMAIL_USER,
|
from: process.env.EMAIL_USER,
|
||||||
to: message.from,
|
to: cleanEmail,
|
||||||
subject: `Re: ${message.subject}`,
|
subject: `Re: ${message.subject}`,
|
||||||
text: result.content
|
text: result.content
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log('Ответ отправлен:', {
|
console.log('Ответ отправлен:', {
|
||||||
to: message.from,
|
to: cleanEmail,
|
||||||
subject: message.subject
|
subject: message.subject
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ const axios = require('axios');
|
|||||||
const dns = require('dns').promises;
|
const dns = require('dns').promises;
|
||||||
require('dotenv').config();
|
require('dotenv').config();
|
||||||
const { sleep } = require('../utils/helpers');
|
const { sleep } = require('../utils/helpers');
|
||||||
|
const util = require('util');
|
||||||
|
const exec = util.promisify(require('child_process').exec);
|
||||||
|
|
||||||
class TelegramBotService {
|
class TelegramBotService {
|
||||||
constructor(token) {
|
constructor(token) {
|
||||||
@@ -156,14 +158,17 @@ class TelegramBotService {
|
|||||||
const addresses = await dns.resolve4('api.telegram.org');
|
const addresses = await dns.resolve4('api.telegram.org');
|
||||||
console.log('IP адреса api.telegram.org:', addresses);
|
console.log('IP адреса api.telegram.org:', addresses);
|
||||||
|
|
||||||
// Пинг для проверки доступности
|
// Пинг для проверки доступности (теперь ждем результат)
|
||||||
const { exec } = require('child_process');
|
try {
|
||||||
exec(`ping -c 1 api.telegram.org`, (error, stdout, stderr) => {
|
const { stdout } = await exec('ping -c 1 api.telegram.org');
|
||||||
console.log('Результат ping:', stdout);
|
console.log('Результат ping:', stdout);
|
||||||
});
|
} catch (pingError) {
|
||||||
|
console.error('Ошибка при выполнении ping:', pingError);
|
||||||
|
throw new Error('Сервер Telegram недоступен');
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Ошибка DNS резолвинга:', error);
|
console.error('Ошибка сетевой проверки:', error);
|
||||||
throw error; // Прерываем инициализацию если DNS недоступен
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Затем проверяем API
|
// Затем проверяем 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;
|
module.exports = TelegramBotService;
|
||||||
@@ -3,6 +3,13 @@ function sleep(ms) {
|
|||||||
return new Promise(resolve => setTimeout(resolve, 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 = {
|
module.exports = {
|
||||||
sleep
|
sleep,
|
||||||
|
isValidEmail
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user