116 lines
3.4 KiB
TypeScript
116 lines
3.4 KiB
TypeScript
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)
|