我的应用程序收到用户的电子邮件。例如,来自gmail的回复就像这样:
This is some new text
On Sun, Apr 1, 2012 at 3:32 AM, My app <
4f77ed3860c258a567aeabf8@myapp.com> wrote:
> Original...
> message..
当然,这种治疗因客户而异。
现在我正在识别'4f77ed3860c258a567aeabf8'然后丢掉所有内容,因为我知道他们发送了什么电子邮件地址。这不是一般解决方案,但适用于我的目的,除了,因为在“原始消息”行中有换行符,如上例所示。
是否有更好的标准方式从用户对电子邮件的回复中删除过去的邮件?
答案 0 :(得分:4)
如果您想要100%的方式删除除最新帖子之外的任何内容,请比较新邮件和前一个邮件中的每个字符。如果您不想编写自己的diff解析器,请查看此lib。
https://github.com/cemerick/jsdifflib
或者,如果你想要一个轻量级的算法,请检查一下
答案 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;
}