diff --git a/packages/nodes-base/nodes/EmailReadImap.node.ts b/packages/nodes-base/nodes/EmailReadImap.node.ts index fed766849..6c9f18bf3 100644 --- a/packages/nodes-base/nodes/EmailReadImap.node.ts +++ b/packages/nodes-base/nodes/EmailReadImap.node.ts @@ -354,35 +354,48 @@ export class EmailReadImap implements INodeType { return newEmails; }; - let connection: ImapSimple; + const establishConnection = (): Promise => { + const config: ImapSimpleOptions = { + imap: { + user: credentials.user as string, + password: credentials.password as string, + host: credentials.host as string, + port: credentials.port as number, + tls: credentials.secure as boolean, + authTimeout: 20000, + }, + onmail: async () => { + if (connection) { + const returnData = await getNewEmails(connection, searchCriteria); - const config: ImapSimpleOptions = { - imap: { - user: credentials.user as string, - password: credentials.password as string, - host: credentials.host as string, - port: credentials.port as number, - tls: credentials.secure as boolean, - authTimeout: 20000, - }, - onmail: async () => { - const returnData = await getNewEmails(connection, searchCriteria); + if (returnData.length) { + this.emit([returnData]); + } + } + }, + }; - if (returnData.length) { - this.emit([returnData]); - } - }, + if (options.allowUnauthorizedCerts === true) { + config.imap.tlsOptions = { + rejectUnauthorized: false, + }; + } + + // Connect to the IMAP server and open the mailbox + // that we get informed whenever a new email arrives + return imapConnect(config).then(async conn => { + conn.on('error', async err => { + if (err.code.toUpperCase() === 'ECONNRESET') { + connection = await establishConnection(); + } + throw err; + }); + return conn; + }); }; - if (options.allowUnauthorizedCerts === true) { - config.imap.tlsOptions = { - rejectUnauthorized: false, - }; - } + let connection: ImapSimple = await establishConnection(); - // Connect to the IMAP server and open the mailbox - // that we get informed whenever a new email arrives - connection = await imapConnect(config); await connection.openBox(mailbox); // When workflow and so node gets set to inactive close the connectoin