从电子邮件回复中删除原始邮件

时间:2012-04-01 18:12:15

标签: email node.js email-integration

我的应用程序收到用户的电子邮件。例如,来自gmail的回复就像这样:

This is some new text

On Sun, Apr 1, 2012 at 3:32 AM, My app <
4f77ed3860c258a567aeabf8@myapp.com> wrote:

> Original...
> message..

当然,这种治疗因客户而异。

现在我正在识别'4f77ed3860c258a567aeabf8'然后丢掉所有内容,因为我知道他们发送了什么电子邮件地址。这不是一般解决方案,但适用于我的目的,除了,因为在“原始消息”行中有换行符,如上例所示。

是否有更好的标准方式从用户对电子邮件的回复中删除过去的邮件?

3 个答案:

答案 0 :(得分:4)

如果您想要100%的方式删除除最新帖子之外的任何内容,请比较新邮件和前一个邮件中的每个字符。如果您不想编写自己的diff解析器,请查看此lib。

https://github.com/cemerick/jsdifflib

或者,如果你想要一个轻量级的算法,请检查一下

http://ejohn.org/projects/javascript-diff-algorithm/

答案 1 :(得分:4)

有一个名为emailreplyparser的npm模块,它是从github ruby​​库移植而来的。正如你所指出的那样,用于此的格式不是标准格式,因此任何解决方案都会非常脆弱且不完美但是 whaddayagonnado

以下是我从新版Gmail API获取JSON响应并成功访问给定邮件的新回复文本的示例。

var erp = require('emailreplyparser').EmailReplyParser.read;
var message = require('./sample_message.json');
var buffer = new Buffer(message.payload.parts[0].body.data, 'base64');
var body = buffer.toString();
//body is the whole message, the new text and the quoted reply portion
// console.log(body);
var parsed = erp(body);
//this has just the text of the reply itself
console.log(parsed.fragments[0].content);

注意如果作者交错回复文本和引用的消息片段,可能会有几个有趣的片段。

答案 2 :(得分:1)

请检查我的代码 我认为它涵盖了所有情况,因为回购包含未处理的案例 如果邮件中有多个回复,并且(On&lt; Date&gt;&lt; Email&gt; write :)行在多行之间拆分则说错误并包含此行(On&lt; Date&gt;&lt; ;电子邮件&gt;写:)作为回复的一部分

function getReplyOnly(str){
  str = str || '';
  var exp = /^(>)*\s*(On\s(\n|.)*wrote:)/m;
  var exp2 = /(\s|.|\n)*((wrote:)$)/m;
  var exp3 = /^((\s)*(On))/m;

  var arr = str.split('\n');
  var msg = '';

  var foundEndWrote = false;
  var foundStartOn = false;
  var indexes = [];
  var tempStr = '';

  for(var i = arr.length - 1; i >= 0; i--){
    tempStr = arr[i] + tempStr;
    if(exp2.test(arr[i])){
      foundEndWrote = true;
    }

    if(exp2.test(arr[i])){
      foundStartOn = true;
    }

    indexes.push(i);
    if(exp.test(tempStr) && foundEndWrote && foundStartOn){
      clear();
    }
  }

  function clear(){
    tempStr = '';
    indexes = [];
    foundEndWrote = false;
    foundStartOn = false;
  }

  // create the message
  for(var i = indexes.length - 1; i >= 0; i--){
    msg += ('\n' + arr[indexes[i]]);
  }
  return msg;
}