nodejs mailparser多次解析同一条消息

时间:2015-08-14 12:15:33

标签: node.js email

我正在使用inboxmailparser npm模块来读取和解析来自邮箱的电子邮件。

我在解析重复邮件方面遇到了一些麻烦。目前正在发生的事情是:

正如您对电子邮件服务器所期望的那样,电子邮件将被放入正确的邮箱中。然后他们在我的node.js应用程序中被inbox选中。然后他们被传送到mailparser并被解析。

这是正常的。问题是,当我发送第二封电子邮件时,我再次获得第一封电子邮件。有时我会得到多个,但我还没弄清楚是什么原因造成的。

let _inbox      = require( "inbox"      );
let _MailParser = require( "mailparser" ).MailParser;

let parser  = new _MailParser();
let mail    = _inbox.createConnection( false, "mail.myemailserver.com", {
  auth: {
    user: "email@myemailserver.com",
    pass: "mypasswordthatissostrongnoonewilleverguessit:)"
  }
});

mail.on( "new", ( message ) => {
  console.log( message.UID, message.title );
  db_insert( DB.collection( "email_ids" ), { _id: message.UID } ).then( () => {
    mail.createMessageStream( message.UID ).pipe( parser );
  });
});

parser.on( "end", ( message ) => {
  // This works the first time, I get the correct message.
  // The second time this gets called I just get the first message again.
});

我的蜘蛛般的感官告诉我,这与我不知道streamspipe如何运作的事实有关。值得注意的是,这是我第一次使用这些库中的任何一个,我可能错过了一些东西。

mailparser
inbox

我正在使用MongoDB,如果你尝试两次插入相同的_id,它会引发摇摆不定,但这根本不是抱怨。这加强了我对streamspipe的怀疑。

我正在使用es6和babel转换器。

更新

我不再需要这个问题的答案。我决定寻找一个不同的图书馆。我现在正在使用mail-notifier

以防有人感兴趣。这就是我解决问题的方法。

let _notifier = require( "mail-notifier" );

let imap = {
  user    : "email@myemailserver.com",
  password: "mypasswordthatissostrongnoonewilleverguessit:)",
  host    : "mail.mymailserver.com"
};

_notifier( imap ).on( "mail", ( mail ) => {
  // process email
}).start();

我仍然有兴趣知道导致另一种方法出现问题的原因,但这并不重要。

1 个答案:

答案 0 :(得分:5)

我遇到了同样的问题。 原因是每次运行一个循环时都必须创建新的MailParser实例。

let _MailParser = require( "mailparser" ).MailParser;

mail.on( "new", ( message ) => {

  parser = new _MailParser();

  // do your stuff

  parser.on( "end", ( message ) => {

     // finished

  });
}