@hyperbytes/wappler-imap-manager
Version:
IMAP eMail Management for Wappler
86 lines (70 loc) • 4.22 kB
JavaScript
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();
});
};