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
JavaScript
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" }
}
});
};