Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从电子邮件回复中删除原始邮件_Node.js_Email - Fatal编程技术网

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

Node.js 从电子邮件回复中删除原始邮件,node.js,email,Node.js,Email,我的应用程序接收来自用户的电子邮件。例如,gmail的回复如下: This is some new text On Sun, Apr 1, 2012 at 3:32 AM, My app < 4f77ed3860c258a567aeabf8@myapp.com> wrote: > Original... > message.. 这是一些新的文本 2012年4月1日星期日凌晨3:32,我的应用程序< 4f77ed3860c258a567aeabf8@myapp.com

我的应用程序接收来自用户的电子邮件。例如,gmail的回复如下:

This is some new text

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

> Original...
> message..
这是一些新的文本
2012年4月1日星期日凌晨3:32,我的应用程序<
4f77ed3860c258a567aeabf8@myapp.com>写道:
>原来的。。。
>消息。。
当然,这种治疗方法因人而异

现在我正在识别“4f77ed3860c258a567aeabf8”,然后扔掉所有的东西,因为我知道他们发到了什么电子邮件地址。这不是一个通用的解决方案,但对于我来说是可行的,除非“原始消息”行中有换行符,如上面的示例中所示


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

如果您想要100%删除除最近的邮件以外的任何内容,请将新邮件中的每个字符与以前的每个字符进行比较。如果您不想编写自己的diff解析器,请查看此库

或者如果你想要一个轻量级的algo,看看这个


有一个名为npm的模块,它是从github ruby库移植来的,可以实现这一点。正如您所指出的,用于此目的的格式不是标准格式,因此任何解决方案都将非常脆弱和不完善,但是什么是Yagonnado

下面是一个例子,我从新的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);
注意:如果作者将回复文本和引用的消息片段交织在一起,可能会有几个有趣的片段。

请检查我的代码 我认为它涵盖了所有案例,因为回购协议包含未处理的案例 如果邮件中有多个回复,并且(在writed:)行被拆分为多行,则会出现错误,并将此行(在writed:)作为回复的一部分

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;
}

问题是,在4月1日的太阳报上,一个diff会错误地标记“作为新消息的一部分,XX写道。似乎唯一的解决办法可能就是了解每个客户(gmail、outlook等)的反应。我认为大多数提供商都会把这一点放在一条新的线上。除了删除最后一个换行符和下一个倒数第二个换行符之间的行之外,您是否可以只进行差异处理?那么,你的例子,实际上是多行还是仅仅是它的粘贴方式?在我发布的例子中,它实际上是多行的。我的用户还有一个习惯,就是不保留消息和提供者行之间的换行符。我想当我收集每个客户的“原始消息”字符串时,我可以想出一些启发式方法……哇,是的,这是一个非常烦人的问题。我甚至可以想象不同版本的outlook会有不同的表现。很抱歉,你必须处理这个问题!