UNPKG

@hyperbytes/wappler-imap-manager

Version:

IMAP eMail Management for Wappler

119 lines (101 loc) 4.58 kB
const Imap = require('imap'); const { simpleParser } = require('mailparser'); exports.imapmailcontent = async function (options, name) { return new Promise((resolve, reject) => { const IMAP_USER = process.env.IMAP_USER; const IMAP_PASSWORD = process.env.IMAP_PASSWORD; const IMAP_HOST = process.env.IMAP_HOST; const IMAP_PORT = process.env.IMAP_PORT; const uid = this.parseRequired(options.uid, '*', "No message UID specified"); const mailbox = this.parseOptional(options.mailbox, '*', 'INBOX'); // Capture mailbox from options const uidvalidity = this.parseRequired(options.uidvalidity, '*', "No message UIDValidity specified"); const imapConfig = { user: IMAP_USER, password: IMAP_PASSWORD, host: IMAP_HOST, port: IMAP_PORT, tls: true, tlsOptions: { rejectUnauthorized: process.env.IMAP_CERTIFICATE_OVERRIDE === '1' ? false : true } }; const imap = new Imap(imapConfig); imap.once('ready', () => { imap.openBox(mailbox, false, (err, box) => { if (err) { imap.end(); return resolve({ uid: null, headers: {}, body: '', attachments: [], uidvalidity: null, mailbox: null, uidKey: null, status: 401 }); } const fetch = imap.fetch(uid, { bodies: "", struct: true }); fetch.on('message', (msg) => { let buffer = ''; let headers = {}; let messageUID = null; // Capture UID separately let uidvalidity = box.uidvalidity; // Capture UIDVALIDITY msg.on('body', (stream) => { stream.on('data', (chunk) => buffer += chunk.toString('utf8')); stream.on('end', async () => { try { const parsed = await simpleParser(buffer); headers = { from: parsed.headers.get('from'), to: parsed.headers.get('to'), cc: parsed.headers.get('cc') || '', // Added CC field bcc: parsed.headers.get('bcc') || '', // Added BCC field subject: parsed.headers.get('subject'), date: parsed.headers.get('date'), 'message-id': parsed.headers.get('message-id') }; resolve({ uid: messageUID, headers: headers, body: parsed.html || parsed.text, attachments: parsed.attachments.map(att => ({ filename: att.filename, contentType: att.contentType, size: att.size, data: att.content.toString('base64') })), uidvalidity: uidvalidity, mailbox: mailbox, uidKey: `${uidvalidity}:${messageUID}`, status: 200 }); } catch (parseError) { reject(parseError); } }); }); msg.once('attributes', (attrs) => { messageUID = attrs.uid; }); }); fetch.once('end', () => { imap.end(); }); }); }); imap.once('error', () => { resolve({ uid: null, headers: {}, body: '', attachments: [], uidvalidity: null, mailbox: null, uidKey: null, status: 401 }); }); imap.connect(); }); };