UNPKG

@hyperbytes/wappler-imap-manager

Version:

IMAP eMail Management for Wappler

86 lines (70 loc) 4.22 kB
const Imap = require('imap'); exports.imapmovefolder = async function (options) { const IMAP_HOST = this.parseOptional(options.imap_host, '*', process.env.IMAP_HOST); const IMAP_PASSWORD = this.parseOptional(options.imap_password, '*', process.env.IMAP_PASSWORD); const IMAP_USER = this.parseOptional(options.imap_user, '*', process.env.IMAP_USER); const IMAP_PORT = this.parseOptional(options.imap_port, '*', process.env.IMAP_PORT); const imap_tlsstring = this.parseOptional(options.imap_tls, '*', process.env.IMAP_TLS).toLowerCase(); const IMAP_TLS = (imap_tlsstring == 'true'); const uid = this.parseRequired(options.uid, '*', "No message UID specified"); const uidvalidity = Number(this.parseRequired(options.uidvalidity, '*', "No UIDVALIDITY specified")); const mailbox = this.parseRequired(options.mailbox, '*', "No Mailbox specified"); const dirto = this.parseRequired(options.dirto, '*', "No destination Mailbox specified"); return new Promise((resolve) => { const imap = new Imap({ user: IMAP_USER, password: IMAP_PASSWORD, host: IMAP_HOST, port: IMAP_PORT, tls: IMAP_TLS }); imap.once('ready', () => { console.log(`Connected to IMAP. Opening mailbox: ${mailbox}`); imap.openBox(mailbox, false, (err, box) => { if (err) { imap.end(); return resolve({ uid: null, mailbox: mailbox, destination: dirto, uidValidityDest: "", status: 401 }); } // Validate UIDVALIDITY if (box.uidvalidity !== uidvalidity) { imap.end(); return resolve({ uid: null, mailbox: mailbox, destination: dirto, uidvalidity: "", status: 401 }); } console.log(`Mailbox UIDVALIDITY verified (${uidvalidity}). Searching for UID ${uid}...`); imap.search([['UID', uid]], (searchErr, results) => { if (searchErr || results.length === 0) { imap.end(); return resolve({ uid: null, mailbox: mailbox, destination: dirto, uidvalidity: "", status: 404 }); } console.log(`Found UID ${uid}, moving to ${dirto}...`); imap.move(uid.toString(), dirto, (moveErr) => { if (moveErr) { imap.end(); return resolve({ uid: uid, mailbox: mailbox, destination: dirto, uidvalidity: "", status: 401 }); } // Open the destination mailbox to retrieve the new UID and UIDVALIDITY imap.openBox(dirto, false, (destErr, destBox) => { if (destErr) { imap.end(); return resolve({ uid: null, mailbox: mailbox, destination: dirto, uidvalidity: "", status: 401 }); } const uidValidityDest = destBox.uidvalidity; // Search for the latest message in the destination mailbox imap.search(['ALL'], (searchDestErr, destResults) => { imap.end(); if (searchDestErr || destResults.length === 0) { return resolve({ uid: null, mailbox: mailbox, destination: dirto, uidvalidity: "", status: 404 }); } const newUid = Math.max(...destResults); // Get the highest UID (latest message) resolve({ uid: newUid, mailbox: mailbox, destination: dirto, uidvalidity: uidValidityDest, status: 200 }); }); }); }); }); }); }); imap.once('error', () => resolve({ uid: null, mailbox: mailbox, destination: dirto, uidvalidityDest: "", status: 401 })); imap.once('end', () => console.log('IMAP connection closed.')); imap.connect(); }); };