this snippet takes your IMAP account and fordward all e-mails from a folder into a target email. Useful f.e to import a lot of existing emails into a support system. After forwarding the email get moved to another folder. run this script to process a single email from that folderToProceed variable
const lib = require('lib')({token: process.env.STDLIB_SECRET_TOKEN});
const {ImapFlow} = require('imapflow');
const nodemailer = require('nodemailer');
const simpleParser = require('mailparser').simpleParser;
//#### CONFIG #####
const mailServer = 'imap.example.com';
const mailUser = 'example';
const mailPassword = 'PUTYOURIMAPPASSWORD';
const mailFrom = 'myaccount@example.com';
const mailFromName = 'Mister Example';
const mailTo = 'redirect@toThis.email';
const folderToProceed = "READ_FOLDER";
const folderToMoveInto = "DONE_FOLDER";
let debug = false;
//#### END CONFIG #####
let logger;
if (!debug) {
logger = {
debug: () => {},
info: () => {},
warn: () => {},
error: console.error,
};
}
const client = new ImapFlow({
host: mailServer,
port: 993,
secure: true,
auth: {
user: mailUser,
pass: mailPassword,
},
logger,
});
const main = async () => {
// Wait until client connects and authorizes
await client.connect();
// Select and lock a mailbox. Throws if mailbox does not exist
let lock = await client.getMailboxLock(folderToProceed);
try {
// fetch latest message source
// client.mailbox includes information about currently selected mailbox
// "exists" value is also the largest sequence number available in the mailbox
let message = await client.fetchOne(client.mailbox.exists, {
source: true,
bodyParts: ['1', '2', '3'],
envelope: true,
bodyStructure: true,
});
if (message) {
console.log(`${message.uid}: ${message.envelope.subject}`);
let transporter = nodemailer.createTransport({
host: mailServer,
port: 465,
secure: true,
auth: {
user: mailUser,
pass: mailPassword,
},
});
let {
subject,
text,
html,
from: {
value: [sender],
},
} = await simpleParser(message.source);
console.log(`parsed`, sender, subject);
if (text) {
text =
`---------- forwarded message ----------
Von: "${sender.name}" <${sender.address}>
An: ${mailFromName} <${mailFrom}>
` + text;
}
if (html) {
html = `---------- forwarded message ----------
From: ${sender.name} <${sender.address}>
To: ${mailFromName} <${mailFrom}>
${html}
`;
}
// send mail with defined transport object
let info = await transporter.sendMail({
from: '"' + mailFromName + '" <' + mailFrom + '>',
to: `${mailTo}`, // list of receivers
subject:
'Fwd: ' + message.envelope.subject
? message.envelope.subject
: 'no subject',
text, // plain text body
html, // html body
});
console.log('Message sent: %s', info.messageId);
let moveResult = await client.messageMove(
message.uid.toString(),
folderToMoveInto,
{uid: true}
);
console.log(`success moveResult`, moveResult);
} else {
console.log(`no more messages to proceed`);
}
} finally {
// Make sure lock is released, otherwise next `getMailboxLock()` never returns
lock.release();
}
// log out and close connection
await client.logout();
};
console.log(`lets go`);
await main().catch((err) => console.error(err));