postalsys / imapflow

IMAP Client library for EmailEngine Email API (https://emailengine.app)
https://imapflow.com
Other
363 stars 62 forks source link

[Help Request] Errors setting imapflow on NodeJS server #217

Closed im-kent closed 1 week ago

im-kent commented 1 month ago

Thank you for maintaining this tool. I have implemented this in a server that processes my emails whenever I hit an endpoint on my server. Upon hitting an Express endpoint, the endpoint calls fetchEmails to return a list of emails from a specific sender. This list of emails is then processed later on by other functions.

I have noticed that every now and then when I hit my endpoint, I get one of two errors. I am probably making some sort of novice error, but I am not sure what it might be. Any help would be great!

ERROR 1

Error [ERR_STREAM_WRITE_AFTER_END]: write after end
    at _write (node:internal/streams/writable:481:11)
    at Writable.write (node:internal/streams/writable:502:10)
    at TLSSocket.ondata (node:internal/streams/readable:1007:22)
    at TLSSocket.emit (node:events:518:28)
    at addChunk (node:internal/streams/readable:559:12)
    at readableAddChunkPushByteMode (node:internal/streams/readable:510:3)
    at Readable.push (node:internal/streams/readable:390:5)
    at TLSWrap.onStreamRead (node:internal/stream_base_commons:190:23)
Emitted 'error' event on ImapFlow instance at:
    at ImapFlow.emitError (/opt/render/project/src/node_modules/imapflow/lib/imap-flow.js:307:14)
    at ImapStream.<anonymous> (/opt/render/project/src/node_modules/imapflow/lib/imap-flow.js:302:18)
    at ImapStream.emit (node:events:530:35)
    at emitErrorNT (node:internal/streams/destroy:169:8)
    at emitErrorCloseNT (node:internal/streams/destroy:128:3)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
  code: 'ERR_STREAM_WRITE_AFTER_END'
}

ERROR: 2

/opt/render/project/src/node_modules/imapflow/lib/imap-flow.js:1439
            let err = new Error('Unexpected close');
                      ^
Error: Unexpected close
    at ImapFlow.close (/opt/render/project/src/node_modules/imapflow/lib/imap-flow.js:1439:23)
    at TLSSocket._socketTimeout (/opt/render/project/src/node_modules/imapflow/lib/imap-flow.js:665:26)
    at TLSSocket.emit (node:events:518:28)
    at Socket._onTimeout (node:net:589:8)
    at listOnTimeout (node:internal/timers:573:17)
    at process.processTimers (node:internal/timers:514:7) {
  code: 'ClosedAfterConnectTLS'
}

fetchEmails function:

async function fetchEmails(fromAddress) {
    var listOfEmails = [];

    // Wait until client connects and authorizes
    await mailClient.connect();

    // Select and lock a mailbox. Throws if mailbox does not exist
    let lock = await mailClient.getMailboxLock('INBOX');
    try {
        // Fetch all messages with specified attributes
        for await (let message of mailClient.fetch('1:*', { envelope: true, bodyParts: true, bodyStructure: true, source: true })) {
            let message_preview = await simpleParser(message.source);

            // Check if the email is from the specified address
            if (message.envelope.from[0].address.toLowerCase().includes(fromAddress.toLowerCase())) {
                listOfEmails.push({
                    postId: message.uid,
                    emailFrom: message.envelope.from[0].address,
                    emailTo: message.envelope.to[0].address,
                    emailSubj: message.envelope.subject,
                    createdAt: message.envelope.date,
                    emailBody: message_preview.text,
                    fullText: 'Subj: ' + message.envelope.subject + '\nBody:\n' + message_preview.text,
                });
            }
        }
    } finally {
        // Make sure lock is released, otherwise next `getMailboxLock()` never returns
        lock.release();
        return listOfEmails;
    }

    // Log out and close connection (if needed, uncomment the following line)
    await mailClient.logout();
}
andris9 commented 1 week ago

You need to create a new ImapFlow instance for every IMAP connection