import type { IEmailInbox } from '@rocket.chat/core-typings'; import { EmailInbox, EmailMessageHistory } from '@rocket.chat/models'; import { Meteor } from 'meteor/meteor'; import nodemailer from 'nodemailer'; import type Mail from 'nodemailer/lib/mailer'; import { onEmailReceived } from './EmailInbox_Incoming'; import { logger } from './logger'; import { IMAPInterceptor } from '../../email/IMAPInterceptor'; import { settings } from '../../settings'; export type Inbox = { imap: IMAPInterceptor; smtp: Mail; config: IEmailInbox; }; export const inboxes = new Map(); export async function configureEmailInboxes(): Promise { const emailInboxesCursor = EmailInbox.findActive(); logger.info('Clearing old email inbox registrations'); for (const { imap } of inboxes.values()) { imap.stop(); } inboxes.clear(); for await (const emailInboxRecord of emailInboxesCursor) { try { logger.info({ msg: 'Setting up email interceptor', email: emailInboxRecord.email }); const imap = new IMAPInterceptor( { password: emailInboxRecord.imap.password, user: emailInboxRecord.imap.username, host: emailInboxRecord.imap.server, port: emailInboxRecord.imap.port, ...(emailInboxRecord.imap.secure ? { tls: emailInboxRecord.imap.secure, tlsOptions: { rejectUnauthorized: false, }, } : {}), }, { deleteAfterRead: false, filter: [['UNSEEN'], ['SINCE', emailInboxRecord._createdAt]], rejectBeforeTS: emailInboxRecord._createdAt, markSeen: true, maxRetries: emailInboxRecord.imap.maxRetries, }, emailInboxRecord._id, ); imap.on('email', async (email) => { if (!email.messageId) { return; } try { await EmailMessageHistory.create({ _id: email.messageId, email: emailInboxRecord.email }); void onEmailReceived(email, emailInboxRecord.email, emailInboxRecord.department); } catch (err: any) { // In case the email message history has been received by other instance.. logger.error({ err }); } }); await imap.start(); const smtp = nodemailer.createTransport({ host: emailInboxRecord.smtp.server, port: emailInboxRecord.smtp.port, secure: emailInboxRecord.smtp.secure, auth: { user: emailInboxRecord.smtp.username, pass: emailInboxRecord.smtp.password, }, }); inboxes.set(emailInboxRecord.email, { imap, smtp, config: emailInboxRecord }); } catch (err) { logger.error({ msg: 'Error setting up email interceptor', email: emailInboxRecord.email, err }); } } logger.info({ msg: 'Configured a total of inboxes', count: inboxes.size }); } Meteor.startup(() => { settings.watchOnce('Livechat_Routing_Method', (_) => { void configureEmailInboxes(); }); });