2012-04-01 19 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%の方法をしたい場合は、新しいメッセージおよび以前のものから各文字を比較します。独自のdiffパーサーを作成したくない場合は、このlibをチェックしてください。

https://github.com/cemerick/jsdifflib

それとも、この1

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

+0

これに伴う問題は、diffが間違ってオン」マークするということであるの一環として、それを:)書いた<日にSun、Apr 1 ... XXは次のように書いています。「新しいメッセージの一環として。唯一の解決策は、各クライアント(Gmail、Outlookなど)がどのように応答するかを知ることです。 –

+0

私は、ほとんどのプロバイダが常にこれを改行すると仮定します。あなたは最後の改行と最後の改行の間の行を削除するよりもdiffを行うだけですか?そう、あなたの例は、実際には複数行ですか、それともどのように貼り付けられたのでしょうか? – FlavorScape

+0

私が掲載した例では、実際には複数行です。私のユーザは、メッセージとプロバイダのラインの間に改行を保存しないという習慣もあります。私は各クライアントの "元のメッセージ"文字列を収集すると、私はカップルヒューリスティックを思いつくことができると思う... –

3

を軽量アルゴチェックアウトしたい場合は、これを行うgithubのルビーライブラリーから移植されemailreplyparserと呼ばれるNPMモジュールは、あります。あなたが指摘するように、このために使用されるフォーマットは標準ではありませんので、任意の解決策はかなり脆弱で不完全であることを行っているが、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; 
} 
関連する問題