@hyperbytes/wappler-imap-manager
Version:
IMAP eMail Management for Wappler
73 lines (58 loc) • 3 kB
JavaScript
const Imap = require('imap');
exports.imapremoveflag = async function (options, name) {
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_usesr, '*', 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 message UIDValidity specified"));
const mailbox = this.parseRequired(options.mailbox, '*', "No mailbox specified");
let flag = this.parseRequired(options.flag, '*', "No Flag specified");
flag = normalizeBackslash(flag);
const config = {
user: IMAP_USER,
password: IMAP_PASSWORD,
host: IMAP_HOST,
port: IMAP_PORT,
tls: IMAP_TLS
};
const removeFlagFromEmail = (uid, flagName, mailboxName, expectedUidValidity) => {
return new Promise((resolve) => {
const imap = new Imap(config);
imap.once('ready', () => {
imap.openBox(mailboxName, false, (err, box) => {
if (err) {
imap.end();
return resolve({ uid: null, mailbox: mailboxName, flag: null, status: 401 });
}
// Validate UIDVALIDITY before proceeding
if (Number(box.uidvalidity) !== Number(expectedUidValidity)) {
imap.end();
return resolve({ uid: null, mailbox: mailboxName, flag: null, status: 401 });
}
imap.delFlags(uid, flagName, (err) => {
if (err) {
imap.end();
return resolve({ uid: uid, mailbox: mailboxName, flag: flagName, status: 401 });
}
console.log(`Successfully removed flag ${flagName} from email UID ${uid} in ${mailboxName}`);
imap.end();
resolve({ uid: uid, mailbox: mailboxName, flag: flagName, status: 200 });
});
});
});
imap.once('error', () => resolve({ uid: null, mailbox: mailboxName, flag: null, status: 401 }));
imap.once('end', () => console.log('IMAP connection closed'));
imap.connect();
});
};
return removeFlagFromEmail(uid, flag, mailbox, uidvalidity);
};
function normalizeBackslash(inputString) {
if (inputString.startsWith("\\\\")) {
return inputString.replace(/^\\\\/, "\\");
}
return inputString;
}