Question

how can i monitor multiple email accounts using imap at the same time using node.js?

I have a program to get notifications for single account using node-imap module and parsed emails using mail-parser.

var Imap = require('imap'),
    inspect = require('util').inspect;
var MailParser = require('mailparser').MailParser;
var fs = require('fs');
var imap = new Imap(
{
    user: 'any_email_address',
    password: 'password',
    host: 'imap.host.com',
    port: 993,
    tls: true,
    tlsOptions:
    {
        rejectUnauthorized: false
    }
});

function openInbox(cb)
{
    imap.openBox('INBOX', true, cb);
}

var messages = []

imap.once('ready', function ()
{
    openInbox(function (err, box)
    {
        console.log("open")
        if (err) throw err;
        imap.search(['ALL', []], function (err, results)
        {
            if (err) throw err;
            var f = imap.fetch(results,
            {
                bodies: ''
            });

            f.on('message', function (msg, seqno)
            {
                var mailparser = new MailParser()
                msg.on('body', function (stream, info)
                {
                    stream.pipe(mailparser);
                    mailparser.on("end", function (mail)
                    {
                        fs.writeFile('msg-' + seqno + '-body.html', mail.html, function (err)
                        {
                            if (err) throw err;
                            console.log(seqno + 'saved!');
                        });
                    })
                });
                msg.once('end', function ()
                {
                    console.log(seqno + 'Finished');
                });
            });
            f.once('error', function (err)
            {
                console.log('Fetch error: ' + err);
            });
            f.once('end', function ()
            {
                console.log('Done fetching all messages!');
                imap.end();
            });
        });
    });
});

imap.once('error', function (err)
{
    console.log(err);
});

imap.once('end', function ()
{
    console.log('Connection ended');
});

imap.connect();
Was it helpful?

Solution 2

You have to create separate connections to monitor multiple accounts.

OTHER TIPS

this is simple

first, make a function that makes your connection and Global variable to put your connection on that and handle theme where ever you want

var Connection = []; 

function connectImap(username, password, address, port, tls) {

if (typeof Connection[username]             != typeof undefined &&
    typeof Connection[username].state       == typeof ''        &&
    Connection[username].state              == 'authenticated'  &&
    Connection[username]._config.user       == username         &&
    Connection[username]._config.password   == password) {

    console.log('IMAP-CLIENT-USE-AUTHENTICATED-CONNECTION ' + username);

} else {

    port = port || 993;
    tls = tls || true;

    Connection[username] = new Imap({
        user        : username,
        password    : password,
        host        : address,
        port        : port,
        authTimeout : 10000,
        connTimeout : 10000,
        keepalive   : true,
        tls         : tls
    });

    console.log('IMAP-CLIENT-CONNECTED : ' + username);
}
}

now you have an array of different connection that means you can find the one you wanted.

i hope it helps

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top