2012-04-01 95 views
7

我的應用程序收到來自用戶的電子郵件。從Gmail的響應,例如,進來像這樣:從電子郵件中刪除原始郵件回覆

This is some new text 

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

> Original... 
> message.. 

當然,這種處理從客戶端變化到客戶端。

現在我正在識別'4f77ed3860c258a567aeabf8',並將所有內容都扔掉,因爲我知道他們發送了什麼郵件地址。這不是一個通用的解決方案,但適用於我的目的,,除了,當在「原始消息」行中有一個換行符時,就像上面的例子。

是否有更好的標準方法去除用戶對電子郵件的回覆中的過去消息?

回答

3

如果您希望以100%的方式刪除最近發佈的文章以外的任何內容,請比較新消息和前一個文章中的每個字符。如果您不想編寫自己的差異解析器,請查看此lib。

https://github.com/cemerick/jsdifflib

或者,如果你想有一個輕量級的算法中檢查這一個

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

+0

的問題,這是一個差異會錯誤地標記「在一部分Sun,Apr 1 ... XX寫道:「作爲新消息的一部分。似乎唯一的解決方案可能只是瞭解每個客戶端(Gmail,Outlook等)如何響應。 – 2012-04-02 20:20:30

+0

我會假設大多數提供者會一直把這個放在換行符上。不能刪除最後一個換行符和最後一個換行符之間的行嗎?所以,你的例子,實際上是多線或者它是如何粘貼的? – FlavorScape 2012-04-02 21:54:48

+0

在我發佈的示例中,它實際上是多行的。我的用戶也習慣於不在他們的消息和提供者行之間保留換行符。當我收集每個客戶的「原始消息」字符串時,我想我可以想出一對夫婦啓發式... – 2012-04-03 00:21:33

3

有一個叫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); 

請注意,如果作者交錯回覆文本和引用消息片段,可能會有幾個有趣的片段。

0

請檢查我的代碼 我認爲它涵蓋了所有的情況下,作爲回購包含未辦理情況 如果在消息中不止一個答覆和(在<日期> <電子郵件>寫了:)線拆分多行之間它的工作錯了,包括這條線(在<日期> <電子郵件>寫:)它作爲回覆

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; 
} 
相關問題