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

问题描述 投票:8回答:3

我的应用程序接收用户发送的电例如,来自gmail的响应如下:

This is some new text

On Sun, Apr 1, 2012 at 3:32 AM, My app <
[email protected]> wrote:

> Original...
> message..

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

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

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

email node.js email-integration
3个回答
4
投票

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

https://github.com/cemerick/jsdifflib

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

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


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

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


1
投票

请检查我的代码我认为它涵盖了所有情况,因为如果邮件中有多个回复并且(On <Date> <Email> write :)行在多行之间拆分,则repo包含未处理的情况工作错误,并将此行(On <Date> <Email> write :)与它一起作为回复的一部分

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.