Marshal Erikson
Marshal Erikson

Reputation: 21

How to get all the emails sent to and received from an email Id?

I'm trying to implement node-imap and I need to get all the emails received from and sent to an email id.

I've been able to use https://developers.google.com/oauthplayground to generate a refresh token but it expires in an hour so I need a method to generate it directly from the code and In the search request response I'm not getting any message subject or anything.

let Imap = require("imap"),
  inspect = require("util").inspect,
  config = require('lt-config'),
  xoauth2 = require("xoauth2"),
  xoauth2gen,imap;
  
xoauth2gen = xoauth2.createXOAuth2Generator({
    user: "mymailid",
    clientId: config.MAIL_GOOGLE_CLIENT_ID,
    clientSecret: config.MAIL_GOOGLE_CLIENT_SECRET,
    refreshToken: config.MAIL_REFRESH_TOKEN,
    accessToken: config.MAIL_ACCESS_TOKEN
});
function getAuthorizedImap() {
    return new Promise((resolve, reject) => {
        xoauth2gen.getToken(function(err, token) {
            if (err) {
              return console.log(err);
            }
            console.log("AUTH XOAUTH2 " + token);
            config.xoauth2 = token;
            imap = new Imap({
                user: "[email protected]",
                xoauth2: token,
                host: "imap.gmail.com",
                port: 993,
                tls: true
              });
              imap.once("ready", function() {
                resolve(imap);
              });
              
              imap.once("error", function(err) {
                console.log(err);
              });
              
              imap.once("end", function() {
                console.log("Connection ended");
              });
              
              imap.connect();
        });
        setTimeout(() => reject('Timeout get token process'), 6000);
    })
}



function filterMails(emailId) {
  return new Promise(async resolve => {
      try {
        imap = await getAuthorizedImap();
        openInbox(function(err, box) {
          if (err) throw err;
          imap.search([ ['HEADER', 'FROM', emailId] ], function(err, results) {
            if (err) throw err;
            console.log("results", results);
            var f = imap.fetch(results, { bodies: "HEADER.FIELDS (FROM TO SUBJECT DATE)" });
            f.on("message", function(msg, seqno) {
              console.log("Message #%d", seqno);
              var prefix = "(#" + seqno + ") ";
              msg.on("body", function(stream, info) {
                console.log(prefix + "Body");
                console.log("Body received", info);                
              });
              msg.once("attributes", function(attrs) {
                console.log(
                  prefix + "Attributes: %s",
                  inspect(attrs, false, 8)
                );
              });
              msg.once("end", function() {
                console.log(prefix + "Finished");
              });
            });
            f.once("error", function(err) {
              console.log("Fetch error: " + err);
            });
            f.once("end", function() {
              console.log("Done fetching all messages!");
              imap.end();
            });
          });
        });
      } catch(e) {
          console.log("Errror while getting emails from GMAIL ====>>", e);
      }
      
  });
}

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

module.exports = filterMails;

I want a JSON response from search and to generate a refresh token dynamically. Any help will be appericiated.

Upvotes: 2

Views: 445

Answers (0)

Related Questions