mscdex / node-imap

An IMAP client module for node.js.
MIT License
2.14k stars 379 forks source link

Recent and New not working for outlook account #900

Open MadhabaPatra opened 1 year ago

MadhabaPatra commented 1 year ago

I am using node-imap to search for the latest emails in my Outlook account's inbox. The documentation mentions the use of the "recent" or "new" flag. However, it seems to work fine for Gmail but not for Outlook. I have attached my code below. Can someone please suggest a solution?

var Imap = require("imap"); // version :  "^0.8.19",

let config = {
  keepalive: {
    interval: 4000,
    idleInterval: 200000,
    forceNoop: true,
  },
  user: "example@outlook.com",
  password: "xxxxxxxxxxx", // app password
  host: "outlook.office365.com",
  port: 993,
  tls: true,
  tlsOptions: { rejectUnauthorized: false },
};

let imap = new Imap(config);

imap.connect()

imap.once("ready", function () {
  console.log("Email connection established!");

  imap.openBox("INBOX", false, function (err, box) {
    if (err) {
      console.log("Error opening inbox");
    }
  });
});

imap.on("error", function (err) {
  console.log(err);
});

imap.on("close", function (err) {
  console.log("connection closed");
});

imap.on("end", function (err) {
  console.log("connection ended");
});

imap.on("mail", function (newMsgNums) {
  console.log(`${newMsgNums} mails received!`);

 imap.search(["RECENT"], function (error, results) {
    if (!results || results.length == 0) {
      console.log(`No recent email available!`);
      return;
    }

    var fetchQuery = imap.fetch(results, {
      bodies: [""],
      struct: true,
    });

    fetchQuery.on("message", function (msg, seqno) {
      msg.on("body", async function (stream, info) {
        console.log(stream);
      });
      msg.on("attributes", function (attrs) {
        console.log(attrs);
      });
      msg.on("end", function () {});
    });

    fetchQuery.once("error", function (err) {
      console.log(err);
    });
    fetchQuery.on("end", function () {});
  });
});

So here on mail event triggered when mails arrive , and i am searching recent mails on those mails.

erivalo commented 1 year ago

It seems that outlook does not support simple authentication anymore; you can check this sites in order to connect using oAuth2.0:

https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth https://learn.microsoft.com/en-us/answers/questions/875398/read-outlook-mails-via-imap-using-nodejs-and-oauth?page=1

hope this helps...

MadhabaPatra commented 1 year ago

@erivalo

I understand that when it comes to user authentication within an organization, there can be concerns around the scope for a user (like please contact administrators). To address this, I am opting to use Outlook with an app password to use imap service.