Skip to content
IMAP client module for Node.js, extracted from NodemailerApp
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
assets added favicon for documentation page Feb 2, 2020
examples v1.0.7 Jan 31, 2020
lib v1.0.18 Feb 18, 2020
test initial import Jan 14, 2020
.eslintrc initial import Jan 14, 2020
.gitignore initial import Jan 14, 2020
.npmignore Fixed eternal loop when breaking IDLE after connection is closed Jan 28, 2020
.prettierrc.js initial import Jan 14, 2020 v1.0.16 Feb 15, 2020
Gruntfile.js initial import Jan 14, 2020 updated README Feb 2, 2020
jsdoc.json search Jan 30, 2020
package.json v1.0.18 Feb 18, 2020
types.js vv1.0.6 Jan 30, 2020


IMAP Client for Node.js extracted from the NodemailerApp project.

The focus for ImapFlow is to provide easy to use API over IMAP. Using ImapFlow does not expect knowledge about specific IMAP details, general understanding is good enough.

IMAP extensions are handled in the background, so for example you can always request labels value from a {@link FetchQueryObject|fetch()} call but if the IMAP server does not support X-GM-EXT1 extension, then labels value is not included in the response.


Source code is available from Github.


First install the module from npm:

$ npm install imapflow

next import the ImapFlow class into your script:

const { ImapFlow } = require('imapflow');

All ImapFlow methods use Promises, so you need to wait using await or wait for the then() method to fire until you get the response.

const { ImapFlow } = require('imapflow');
const client = new ImapFlow({
    host: '',
    port: 993,
    secure: true,
    auth: {
        user: '',
        pass: 'mW6e4wWWnEd3H4hT5B'

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('INBOX');
    try {
        // fetch latest message source
        let message = await client.fetchOne('*', { source: true });

        // list subjects for all messages
        // uid value is always included in FETCH response, envelope strings are in unicode.
        for await (let message of client.fetch('1:*', { envelope: true })) {
            console.log(`${message.uid}: ${message.envelope.subject}`);
    } finally {
        // Make sure lock is released, otherwise next `getMailboxLock()` never returns

    // log out and close connection
    await client.logout();

main().catch(err => console.error(err));


API reference.

ImapFlow has TS typings set for compatible editors.


© 2020 Andris Reinman

Licensed for evaluation use only

You can’t perform that action at this time.