Удаление оригинального сообщения из ответа по электронной почте - PullRequest
8 голосов
/ 01 апреля 2012

Мое приложение получает электронную почту от пользователей. Например, ответ от gmail выглядит так:

This is some new text

On Sun, Apr 1, 2012 at 3:32 AM, My app <
4f77ed3860c258a567aeabf8@myapp.com> wrote:

> Original...
> message..

Конечно, это лечение варьируется от клиента к клиенту.

Прямо сейчас я идентифицирую '4f77ed3860c258a567aeabf8' и выбрасываю все после, потому что я знаю, на какой адрес электронной почты они отправили. Это не общее решение, но оно работает для моих целей, за исключением для случаев, когда в строке «Исходное сообщение» есть разрыв строки, как в приведенном выше примере.

Есть ли лучший, стандартный способ вырезать прошлое сообщение из ответа пользователя на электронное письмо?

Ответы [ 3 ]

4 голосов
/ 09 июля 2014

Существует модуль npm с именем emailreplyparser , который портирован из библиотеки github ruby, которая делает это. Как вы указываете, форматы, используемые для этого, не являются стандартными, и поэтому любое решение будет довольно хрупким и несовершенным, но whaddayagonnado ?

Вот пример, где я беру ответ JSON, полученный от нового API Gmail, и успешно получаю доступ только к новому тексту ответа для данного сообщения.

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

Обратите внимание, что может быть несколько интересных фрагментов, если автор чередовал текст ответа и цитируемые фрагменты сообщения.

4 голосов
/ 01 апреля 2012

Если вы хотите на 100% удалить все, кроме самого последнего сообщения, сравните каждый символ из нового сообщения и предыдущего.Если вы не хотите писать свой собственный анализатор различий, проверьте эту библиотеку.

https://github.com/cemerick/jsdifflib

Или, если вы хотите легкий алгоритм, проверьте этот

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

1 голос
/ 20 декабря 2017

пожалуйста, проверьте мой код я думаю, что это покрывает все случаи, поскольку репо содержит необработанный случай если в сообщении содержится более одного ответа и строка (On wrote :) разделена между более чем одной строкой, это работает неправильно и включает эту строку (On wrote :) с это как часть ответа

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...