const chalk = require('chalk'); const {ImapFlow} = require('imapflow'); const simpleParser = require('mailparser').simpleParser const {Telegraf} = require('telegraf'); require('dotenv').config() const bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN); const POLLING_TIMEOUT = process.env.POLLING_TIMEOUT const MARK_STRING = process.env.MARK_STRING const clientConfig = { host: process.env.EMAIL_IMAP_SERVER, port: process.env.EMAIL_IMAP_SERVER_PORT, secure: true, auth: { user: process.env.EMAIL_ADDRESS, pass: process.env.EMAIL_PASSWORD, } } const main = async () => { const client = new ImapFlow(clientConfig); await client.connect(); // Wait until client connects and authorizes const lock = await client.getMailboxLock('INBOX'); // Open mailbox try { let listSeenMsgId = await client.search({seen: false}); // search only unseen messages console.log('📌', chalk.cyan('UNSEEN LIST:'), listSeenMsgId) for await (let message of client.fetch(listSeenMsgId, { envelope: true, source: true })) { if (message.envelope.subject && message.envelope.subject.includes(MARK_STRING)) { let email = Buffer.from(message.source).toString() const parsed = await simpleParser(email) //console.log('📌', chalk.cyan('Message:'), chalk.yellow(parsed.text)); let messageArr = parsed.text.slice().split('\n').filter((el: string) => el !== '') const title = messageArr[1] .slice() .split(' ') .at(-1) const groupName = messageArr[1] .slice() .replace('В АС СТП на Вашу группу Адлер ', '') .replace(' назначено обращение', '') .split(' ') .slice(0, -1) .join(' ') const user = messageArr[4] const subject = messageArr[6] const estimatedDate = messageArr[7] .slice() .split(' ')[3] const estimatedTime = messageArr[7] .slice() .split(' ')[4] console.log( `📌 Новое обращение: ${title}`, '\n', `Группа: ${groupName}`, '\n', `${user}`, '\n', `${subject}`, '\n', `Время выполнения: ${estimatedDate} ${estimatedTime}`, '\n' ) const preparedMessage = `📌 Новое обращение: ${title}\n` + `Группа: ${groupName}\n` + `${user}\n` + `${subject}\n` + `Время выполнения: ${estimatedDate} ${estimatedTime}\n` if (parsed.text) { bot.telegram.sendMessage(process.env.TELEGRAM_GROUP_ID, preparedMessage) .then() .catch(console.error) } client.messageFlagsAdd(message.seq.toString(), ['\\Seen']) .then((result: any) => console.log('📌', chalk.cyan(`Set seen flag for id-${message.seq}`), result)) .catch(console.error) } } } catch (e) { console.log(e) } finally { lock.release(); // mandatory release mailbox await client.logout(); // log out and close connection console.log('🧡', chalk.cyan('Heartbeat is ok')) } }; //main().then().catch(err => console.error(err)); // start once for development setInterval(async () => { main().then().catch(console.error); }, Number(POLLING_TIMEOUT) * 1000)