2012-04-01 27 views
7

Uygulamam, kullanıcılardan e-posta alıyor. gmail'e gelen bir yanıt, örneğin, bu gibi gelir: TabiiOrijinal iletiyi e-posta yanıtından çıkarılıyor

This is some new text 

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

> Original... 
> message.. 

, bu tedavi müşteriden müşteriye değişir.

Şu anda '4f77ed3860c258a567aeabf8' belirlenmesi ediyorum ve onlar gönderilen kadarıyla e-posta adresi biliyorum çünkü, sonra her şeyi atma. Bu genel bir çözüm değildir ama yukarıdaki örnekte olduğu gibi, "Orijinal mesaj" doğrultusunda satır sonu varken benim amaçlar hariç için çalışır.

bir e-postaya bir kullanıcının cevapta dışarı geçmiş mesajı en şerit daha iyi, standart bir yolu var mı? En son mesaja dışında bir şey kaldırmak için% 100 bir şekilde istiyorsanız

cevap

3

, yeni mesaj ve öncekinden Her karakteri karşılaştırın. Kendi ayrıştırıcınızı yazmak istemiyorsanız, bu kitapçığa göz atın.

https://github.com/cemerick/jsdifflib

Yoksa bunu yapan bir github yakut kütüphanesinden gelen taşıdık emailreplyparser adında bir npm modülü vardır

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

+0

bu sorun bir fark hatalı Açık" işaretler olduğunu bir parçası olarak onunla :) yazdı < Date Sun, 1 Nis ... XX şunu yazdı: "yeni mesajın bir parçası olarak. Tek çözüm, sadece her müşterinin (gmail, görünüm vb.) Nasıl karşılık verdiğini öğrenmek olabilir gibi görünüyor. –

+0

Çoğu sağlayıcı bunu her zaman yeni bir satır üzerine koyacaktır. Son linebreak ile sonuncu sonuncu arasındaki çizgiyi silmek yerine diff'i yapabildiniz mi? Yani, örneğiniz, aslında çok satırlı mı, yoksa nasıl yapıştırılmış? – FlavorScape

+0

Aslında gönderdiğim örnekte çok satırlı. Kullanıcılarım, mesajlarıyla sağlayıcı hattı arasındaki yeni hattı korumaya yönelik bir alışkanlığa da sahipler. Ben her müşterinin "orijinal mesaj" dizeleri toplarken bir çift buluşsal gelebilir düşünüyorum ... –

3

hafif algo, kontrol edildiğinde bu bir dışarı istiyorum. Eğer işaret gibi, bu kullanılan biçimleri standart değildir ve bu nedenle herhangi bir çözüm oldukça kırılgan ve kusurlu olacak ama whaddayagonnado?

İşte ben yeni Gmail API aldığım bir JSON yanıtını alıp başarıyla belirli bir mesajın sadece yeni cevap metnine erişmek bir örnek. Yazar, cevap metni ve alıntı ileti parçaları interleaved eğer

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

Not birkaç ilginç fragmanları olabilir.

0

i repo mesajında ​​birden fazla cevap ve (< Date> < Eposta varsa un ele davayı içerdiği gibi tüm durumları kapsar düşünüyorum kodumu kontrol ediniz> yazmış :) çizgi bölünmüş olduğunu birden fazla hat arasındaki yanlış çalışmak ve (bu satırı ekleyin> < E-posta> cevapta

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