UNPKG

node-red-contrib-outlook-imap

Version:

Node-RED node to capture emails from Outlook inbox using IMAP with OAuth2 token

116 lines (100 loc) 5.24 kB
module.exports = function (RED) { "use strict"; const Imap = require('imap'); const simpleParser = require("mailparser").simpleParser; const request = require('request'); function OutlookIMAPNode(config) { RED.nodes.createNode(this, config); const node = this; node.on('input', function (msg) { // Chama a função para obter o token OAuth2 if (!msg.token) { node.error("Não foi enviado o token."); return; } const base64Encoded = Buffer.from([`user=${config.email}`, `auth=Bearer ${token}`, '', ''].join('\x01'), 'utf-8').toString('base64'); // Configuração do IMAP com o token OAuth2 dinâmico retirado do msg.token const imap = new Imap({ xoauth2: base64Encoded, host: 'outlook.office365.com', port: 993, tls: true, debug: console.log, authTimeout: 25000, connTimeout: 30000, tlsOptions: { rejectUnauthorized: false, servername: 'outlook.office365.com' } }); function openInbox(cb) { imap.openBox('INBOX', false, cb); } imap.once('ready', function () { openInbox(function (err, box) { if (err) { node.error("Erro ao abrir a caixa de entrada: " + err); return; } const searchCriteria = ['UNSEEN']; // E-mails não lidos const fetchOptions = { bodies: '', markSeen: true }; imap.search(searchCriteria, function (err, results) { if (err) { node.error("Erro na busca de e-mails: " + err); return; } if (results.length === 0) { node.log("Nenhum e-mail não lido encontrado."); return; } const f = imap.fetch(results, fetchOptions); f.on('message', function (msg, seqno) { let emailBuffer = ''; msg.on('body', function (stream) { stream.on('data', function (chunk) { emailBuffer += chunk.toString('utf8'); }); }); msg.once('end', function () { simpleParser(emailBuffer, (err, mail) => { if (!err) { node.log("E-mail recebido: " + mail.subject); const emailData = { from: mail.from.text, subject: mail.subject, date: mail.date, body: mail.text }; node.send({ payload: emailData, original: mail }); } else { node.error("Erro ao analisar e-mail: " + err); } }); }); }); f.once('error', function (err) { node.error("Erro ao buscar e-mails: " + err); }); f.once('end', function () { node.log('Finalizada a busca de e-mails.'); imap.end(); }); }); }); }); imap.once('error', function (err) { node.error("Erro na conexão IMAP: " + err); }); imap.once('end', function () { node.log('Conexão IMAP encerrada.'); }); // Conectar ao IMAP imap.connect(); }); } RED.nodes.registerType("outlook-imap", OutlookIMAPNode, { credentials: { email: { type: "text" } } }); };