2015-08-17 3 views
3

Я пишу сценарий Node.js, который извлекает непрочитанные письма из моего почтового ящика gmail с помощью node-imap, анализирует их с помощью mailparser и затем выполняет некоторую работу с разобранными электронными письмами. Я столкнулся с проблемой, когда необработанное сообщение электронной почты, похоже, не корректно обрабатывается mailparser. Я не уверен, что я сделал что-то неправильно при вызове node-imap или mailparser, или если по какой-либо причине сам адрес электронной почты находится в плохом формате. Я включил код, который я запускаю, а также полученный результат.Неправильный разбор gmail с узлом-imap и mailparser

var Imap = require("imap"), 
    MailParser = require("mailparser").MailParser, 
    Promise = require("bluebird"), 
    request = require("request-promise").defaults({jar: true}), 
    log = require("winston"), 
    _ = require("underscore"), 
    config = require("config").jobs; 

var logConfig = _.clone(config.logConfig.email); 
if (process.env.LOG_DIR) { 
    logConfig.filename = process.env.LOG_DIR + "/" + logConfig.filename; 
} 
log.add(log.transports.File, logConfig || config.logConfig); 

Promise.longStackTraces(); 

var imap = new Imap(config.emailConfig); 
Promise.promisifyAll(imap); 

imap.once("ready", execute); 
imap.once("error", function (err) { 
    log.error("Connection error: " + err.stack); 
}); 
imap.connect(); 

function execute() { 
    imap.openBoxAsync("INBOX", false) 
     .then(function() { 
      return imap.searchAsync(["UNSEEN"]); 
     }) 
     .then(function (results) { 
      var f = imap.fetch(results, {bodies: ["HEADER.FIELDS (FROM SUBJECT)", "TEXT"]}); 
      f.on("message", processMessage); 
      f.once("error", function (err) { 
       return Promise.reject(err); 
      }); 
      f.once("end", function() { 
       log.info("Done fetching all unseen messages."); 
       imap.end(); 
      }); 
     }) 
     .catch(function (err) { 
      log.error("Error fetching messages: " + err.stack); 
      imap.end(); 
     }); 
} 

function processMessage(msg, seqno) { 
    log.info("Processing msg #" + seqno); 

    var parser = new MailParser(); 
    parser.on("headers", function(headers) { 
     log.info("Header: " + JSON.stringify(headers)); 
    }); 
    parser.on("end", function(msg) { 
     log.info("From: " + msg.from); 
     log.info("Subject: " + msg.subject); 
     log.info("Text: " + msg.text); 
     log.info("Html: " + msg.html); 
    }); 

    msg.on("body", function (stream) { 
     stream.on("data", function (chunk) { 
      parser.write(chunk.toString("utf8")); 
     }); 
    }); 
    msg.once("end", function() { 
     log.info("Finished msg #" + seqno); 
     parser.end(); 
    }); 
} 

Выход:

info: Processing msg #1 
info: Finished msg #1 
info: Done fetching all unseen messages. 
info: Header: {"--001a11339690da942a051d866a04":"","content-type":"text/plain; charset=UTF-8"} 
info: From: undefined 
info: Subject: undefined 
info: Text: Test app mail body! 

- Jared 

--001a11339690da942a051d866a04 
Content-Type: text/html; charset=UTF-8 

<div dir="ltr"><div>Test app mail body!<br><br></div>- Jared<br></div> 

--001a11339690da942a051d866a04-- 
Subject: Here is a test appmail email 
From: Jared Wolinsky <[email protected]> 


info: Html: undefined 

ответ

6

Вы извлечение сырого тела по электронной почте. mailparser Ожидается полный e-mail, headers и корпус обе. Чтобы получить это вместо этого, просто укажите пустую строку '' вместо 'TEXT'.

+0

Мне нравится пример Jareks. @mscdex Я пропустил эту часть в вашем модуле imap. Вы можете упомянуть mailparser в справочном разделе. Но я ценю вашу работу, отличную работу! – raoulinski

Смежные вопросы