imapEmail.js 2.76 KB
const Imap = require('imap');

const imapConfig = {
  user: 'mil2inda@gmail.com',
  password: 'iyiyaqaksbewpclq',
  host: 'imap.gmail.com',
  port: 993,
  tls: true,
  keepalive: {
    forceNoop: true
  },
  tlsOptions: {
    rejectUnauthorized: false // Ignore self-signed certificate error
  }
};

async function watchIncomingEmails() {
  const imap = new Imap(imapConfig);
  let largestUID = 0;

  function openInbox() {
    return new Promise((resolve, reject) => {
      imap.openBox('INBOX', true, (err, box) => {
        if (err) {
          reject(err);
        } else {
          resolve(box);
        }
      });
    });
  }

  function fetchNewMessages() {
    return new Promise((resolve, reject) => {
      let criteria = ['UNSEEN', ['FROM', 'nattaponw@sourcecode.co.th'], ['UID', `${largestUID + 1}:*`]]
      imap.search(criteria, (searchErr, results) => {
        if (searchErr) {
          reject(searchErr);
          return;
        }

        try {
            const fetch = imap.fetch(results, { bodies: '' });
            const messages = [];

            fetch.on('message', (msg, seqno) => {
                let buffer = '';

                msg.on('attributes', (attrs) => {
                    largestUID = attrs.uid
                });

                msg.on('body', (stream, info) => {
                    console.log(info)
                    stream.on('data', (chunk) => buffer += chunk.toString());
                    stream.on('end', () => {
                        messages.push(buffer);
                    });
                });
            });

            fetch.on('end', () => {
                resolve(messages);
            });
        } catch (fetchError) {
            if(fetchError.message == 'Nothing to fetch') {
                console.log('There are no messages to fetch.')
                resolve([])
            } else {
                reject(fetchError)
            }
        }
      });
    });
  }

  imap.once('ready', async () => {
    try {
      const box = await openInbox();
      console.log('Listening for new messages...');
      
      imap.on('mail', async (numNewMsgs) => {
        console.log(`${numNewMsgs} new message(s) received.`);

        const messages = await fetchNewMessages();

        console.log(`Unread messages: ${messages.length} from nattaponw@sourcecode.co.th` )
        
        // messages.forEach((message, index) => {
        //   console.log(`New message ${index + 1}:`, message);
        // });
        console.log('All new messages processed.');
      });
    } catch (error) {
      console.log('Error:', error);
    }
  });

  imap.once('error', (err) => {
    console.error('IMAP error:', err);
  });
  
  imap.once('end', () => {
    console.log('IMAP connection ended.');
  });

  imap.connect();

}

watchIncomingEmails();