diff --git a/social/email/61-email.html b/social/email/61-email.html index 3d3bdd8f..1d9a8459 100644 --- a/social/email/61-email.html +++ b/social/email/61-email.html @@ -146,7 +146,6 @@ @@ -160,7 +159,7 @@
@@ -260,7 +259,8 @@ useSSL: {value: true}, autotls: {value: "never"}, port: {value:"993",required:true}, - authentication: {value: "BASIC", required:true}, + authtype: {value: "BASIC"}, + token: {value: "oauth2Response.access_token"}, box: {value:"INBOX"}, // For IMAP, The mailbox to process disposition: { value: "Read" }, // For IMAP, the disposition of the read email criteria: {value: "UNSEEN"}, @@ -271,7 +271,6 @@ credentials: { userid: {type:"text"}, password: {type: "password"}, - token: {type:"text"}, global: { type:"boolean"} }, inputs: 0, @@ -322,6 +321,10 @@ $("#node-input-fetch").change(); } }); + $("#node-input-token").typedInput({ + type:'msg', + types:['msg'] + }); } }); })(); diff --git a/social/email/61-email.js b/social/email/61-email.js index b7ef9f77..aecb4977 100644 --- a/social/email/61-email.js +++ b/social/email/61-email.js @@ -197,9 +197,11 @@ module.exports = function(RED) { this.box = n.box || "INBOX"; this.useSSL= n.useSSL; this.autotls= n.autotls; + this.token = n.token || "oAuth2Response.access_token"; this.protocol = n.protocol || "IMAP"; this.disposition = n.disposition || "None"; // "None", "Delete", "Read" this.criteria = n.criteria || "UNSEEN"; // "ALL", "ANSWERED", "FLAGGED", "SEEN", "UNANSWERED", "UNFLAGGED", "UNSEEN" + this.authtype = n.authtype || "BASIC"; var flag = false; @@ -367,6 +369,45 @@ module.exports = function(RED) { var s = false; var ss = false; function checkIMAP(msg,send,done) { + var tout = (node.repeat > 0) ? node.repeat - 500 : 15000; + var saslxoauth2 = ""; + if(node.authtype == "XOAUTH2") { + var value = RED.util.getMessageProperty(msg,node.token); + if (value !== undefined) { + //Make base64 string for access - compatible with outlook365 and gmail + saslxoauth2 = Buffer.from("user="+node.userid+"\x01auth=Bearer "+value+"\x01\x01").toString('base64'); + } + imap = new Imap({ + xoauth2: saslxoauth2, + host: node.inserver, + port: node.inport, + tls: node.useSSL, + autotls: node.autotls, + tlsOptions: { rejectUnauthorized: false }, + connTimeout: tout, + authTimeout: tout + }); + } else { + imap = new Imap({ + user: node.userid, + password: node.password, + host: node.inserver, + port: node.inport, + tls: node.useSSL, + autotls: node.autotls, + tlsOptions: { rejectUnauthorized: false }, + connTimeout: tout, + authTimeout: tout + }); + } + imap.on('error', function(err) { + if (err.errno !== "ECONNRESET") { + s = false; + node.error(err.message,err); + node.status({fill:"red",shape:"ring",text:"email.status.connecterror"}); + } + setInputRepeatTimeout(); + }); //console.log("Checking IMAP for new messages"); // We get back a 'ready' event once we have connected to imap s = true; @@ -521,19 +562,45 @@ module.exports = function(RED) { } } // End of checkEmail - if (node.protocol === "IMAP") { +/* if (node.protocol === "IMAP") { var tout = (node.repeat > 0) ? node.repeat - 500 : 15000; - imap = new Imap({ - user: node.userid, - password: node.password, - host: node.inserver, - port: node.inport, - tls: node.useSSL, - autotls: node.autotls, - tlsOptions: { rejectUnauthorized: false }, - connTimeout: tout, - authTimeout: tout - }); + if(node.authentication == "OAUTH") { + imap = new Imap({ + user: node.userid, + oauth: node.token, + host: node.inserver, + port: node.inport, + tls: node.useSSL, + autotls: node.autotls, + tlsOptions: { rejectUnauthorized: false }, + connTimeout: tout, + authTimeout: tout + }); + } else if(node.authentication == "XOAUTH2") { + imap = new Imap({ + user: node.userid, + xoauth2: node.token, + host: node.inserver, + port: node.inport, + tls: node.useSSL, + autotls: node.autotls, + tlsOptions: { rejectUnauthorized: false }, + connTimeout: tout, + authTimeout: tout + }); + } else { + imap = new Imap({ + user: node.userid, + password: node.password, + host: node.inserver, + port: node.inport, + tls: node.useSSL, + autotls: node.autotls, + tlsOptions: { rejectUnauthorized: false }, + connTimeout: tout, + authTimeout: tout + }); + } imap.on('error', function(err) { if (err.errno !== "ECONNRESET") { s = false; @@ -542,7 +609,7 @@ module.exports = function(RED) { } setInputRepeatTimeout(); }); - } + }*/ node.on("input", function(msg, send, done) { send = send || function() { node.send.apply(node,arguments) };