【问题标题】:Stripping out original message from an email reply从电子邮件回复中删除原始消息
【发布时间】:2012-04-15 13:13:38
【问题描述】:

我的应用程序收到来自用户的电子邮件。例如,来自 gmail 的回复是这样的:

This is some new text

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

> Original...
> message..

当然,这种处理方式因客户而异。

现在我正在识别“4f77ed3860c258a567aeabf8”并在之后丢弃所有内容,因为我知道他们发送到的电子邮件地址。这不是一个通用的解决方案,但适用于我的目的,除了当“原始消息”行中有换行符时,就像上面的例子一样。

有没有更好的标准方法从用户对电子邮件的回复中删除过去的消息?

【问题讨论】:

    标签: node.js email


    【解决方案1】:

    如果您想要一种 100% 的方式来删除除最新帖子之外的任何内容,请将新消息中的每个字符与上一条消息进行比较。如果您不想编写自己的差异解析器,请查看这个库。

    https://github.com/cemerick/jsdifflib

    或者如果你想要一个轻量级的算法,看看这个

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

    【讨论】:

    • 这个问题是一个差异将错误地标记“在太阳,4 月 1 日...XX 写:”作为新消息的一部分。似乎唯一的解决方案可能就是了解每个客户端(gmail、outlook 等)如何响应。
    • 我认为大多数供应商总是将它放在换行符上。你不能只做差异而不是删除最后一个换行符和倒数第二个之间的行吗?那么,您的示例实际上是多行还是只是粘贴方式?
    • 在我发布的示例中实际上是多行的。我的用户也有不保留他们的消息和提供者行之间的换行符的习惯。当我收集每个客户的“原始消息”字符串时,我想我可以提出一些启发式方法......
    • 哇,是的,这是一个非常烦人的问题。我什至可以想象不同版本的 Outlook 会有不同的表现。对不起,你必须处理这个!
    【解决方案2】:

    有一个名为 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);
    

    请注意,如果作者将回复文本和引用的消息片段交织在一起,可能会有几个有趣的片段。

    【讨论】:

      【解决方案3】:

      请检查我的代码 我认为它涵盖了所有案例,因为回购包含未处理的案例 如果消息中有多个回复并且 (On 写道:) 行被分成多行,则它工作错误并包括此行 (On 写道:) 与它作为回复的一部分

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 2016-01-22
        • 1970-01-01
        • 2011-04-15
        相关资源
        最近更新 更多