UNPKG

mbox-attachment-extract

Version:

Node.js cli tool to extract attachments from .mbox files

70 lines (59 loc) 2.09 kB
/* eslint-disable no-continue */ /* eslint-disable no-restricted-syntax */ const fs = require('fs'); const { simpleParser } = require('mailparser'); const Mbox = require('node-mbox'); const ora = require('ora'); const chalk = require('chalk'); const pEvent = require('p-event'); const writeAttachment = require('./writeAttachment'); module.exports = async (mboxPath, attachmentPath, pattern = false, filenameAsSubject = false) => { const stream = fs.createReadStream(mboxPath); const mbox = new Mbox(stream); const fileFilter = pattern ? new RegExp(pattern) : false; let count = 0; let countFile = 0; const loadingMessage = (emailRead = 0) => `${chalk.bold('mbox-attachment-extract')} ${chalk.cyan('EMAIL:')} ${emailRead} ${chalk.cyan('ATTACHMENTS:')} ${countFile} `; const loader = ora(loadingMessage()); if (!fs.existsSync(attachmentPath)) { fs.mkdirSync(attachmentPath); } const mboxIterator = pEvent.iterator(mbox, 'message', { resolutionEvents: ['finish'], }); mbox.on('error', (err) => { loader.fail(`${chalk.redBright.bold('Error: ')} ${err}`); process.exit(1); }); try { for await (const message of mboxIterator) { count = mbox.messageCount; loader.start(loadingMessage(count)); const parsedMessage = await simpleParser(message); if (parsedMessage.attachments.length === 0) { continue; } const attachment = parsedMessage.attachments.filter((att) => { if (!fileFilter) return !!att.filename; const canBeExtracted = att.filename && att.filename.match(fileFilter); return canBeExtracted; }); if (attachment.length === 0) { continue; } attachment.forEach(writeAttachment(parsedMessage, attachmentPath, filenameAsSubject)); countFile += attachment.length; continue; } } catch (err) { mbox.emit('error', err); process.exit(1); } loader.succeed(`${chalk.green.bold('All files extracted!')} Total email parsed: ${chalk.bold(count)} Total files extracted: ${chalk.bold(countFile)} `); };