我的应用程序接收用户发送的电例如,来自gmail的响应如下:
This is some new text
On Sun, Apr 1, 2012 at 3:32 AM, My app <
[email protected]> wrote:
> Original...
> message..
当然,这种治疗因客户而异。
现在我正在识别'4f77ed3860c258a567aeabf8'然后丢掉所有内容,因为我知道他们发送了什么电子邮件地址。这不是一般解决方案,但适用于我的目的,除非在“原始消息”行中有换行符,如上例所示。
是否有更好的标准方法从用户对电子邮件的回复中删除过去的邮件?
如果您想要100%的方式删除除最新帖子之外的任何内容,请比较新邮件和前一个邮件中的每个字符。如果您不想编写自己的diff解析器,请查看此lib。
https://github.com/cemerick/jsdifflib
或者,如果你想要一个轻量级算法检查这一个
有一个名为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);
请注意,如果作者交错回复文本和引用的消息片段,可能会有几个有趣的片段。
请检查我的代码我认为它涵盖了所有情况,因为如果邮件中有多个回复并且(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;
}