【问题标题】:Reliable way to only get the email text, excluding previous emails仅获取电子邮件文本的可靠方法,不包括以前的电子邮件
【发布时间】:2011-07-22 04:20:58
【问题描述】:

我正在创建一个基本系统,允许用户通过电子邮件回复网站上的线程。但是,大多数电子邮件客户端在其回复电子邮件中包含以前电子邮件的文本。网站上不需要此文本。

有没有一种可靠的方法可以让我只提取新邮件,而无需事先了解早期的电子邮件?我正在使用 Python 的email 类。


示例消息:

Content-Type: text/plain; charset=ISO-8859-1

test message! This is the part I want.

On Thu, Mar 24, 2011 at 3:51 PM, <test@test.com> wrote:

> Hi!
>
> Herman just posted a comment on the website:
>
>
> From: Herman
> "Hi there! I might be interested"
>
>
> Regards,
> The Website Team
> http://www.test.com
>

这是来自 gmail 的回复消息,我相信其他客户可能会有所不同。一个好的开始可能是忽略以&gt; 开头的行,但在新消息之间也可能有类似的行,然后它们可能应该保留。我还会有内容类型行和日期行。

【问题讨论】:

    标签: python django email


    【解决方案1】:

    电子邮件回复的格式取决于客户。没有可行的方法来提取最新消息,而不会有删除太多或不够的风险。

    但是,标记引号的常用方法是在它们前面加上 &gt; 前缀,因此以该字符开头的行(尤其是在电子邮件的末尾或开头有多个时)很可能是引号。

    但是您示例中的On Thu, Mar 24, 2011 at 3:51 PM, &lt;test@test.com&gt; wrote: 很难提取。在引用之前以 : 结尾的行可能表明它属于引用,您无法确定 - 它也可能是新消息的一部分,而冒号只是错字 . (在德语键盘上:SHIFT+.)。

    【讨论】:

    • 很遗憾没有真正可靠的方法,但您提供的想法证明很有帮助,尤其是德语键盘上的要点 - 谢谢。
    • 我同意没有可靠的方法,确实应该有,但每个客户都不同。我们一直在 CloudMailin 试验一种默认包含此解析的方法,但我们还没有任何东西可以捕获我们想要的所有内容。
    【解决方案2】:

    我认为这应该可行

    import re
    string_list = re.findall(r"\w+\s+\w+[,]\s+\w+\s+\d+[,]\s+\d+\s+\w+\s+\d+[:]\d+\s+\w+.*", strings) # regex for On Thu, Mar 24, 2011 at 3:51 PM
    res = strings.split(string_list[0]) # split on that match
    print(res[0]) # get before string of the regex
    

    【讨论】:

      【解决方案3】:

      @LAMRIN TAWSRAS 给出的答案仅在找到匹配项的情况下才适用于解析 Gmail 日期表达式之前的文本,否则将引发错误。此外,不需要在整个消息中搜索多个日期表达式,您只需要找到第一个。因此,我会改进他的解决方案以使用re.search()

      def get_body_before_gmail_reply_date(msg):
        body_before_gmail_reply = msg
        # regex for date format like "On Thu, Mar 24, 2011 at 3:51 PM"
        matching_string_obj = re.search(r"\w+\s+\w+[,]\s+\w+\s+\d+[,]\s+\d+\s+\w+\s+\d+[:]\d+\s+\w+.*", msg)
        if matching_string_obj:
          # split on that match, group() returns full matched string
          body_before_gmail_reply_list = msg.split(matching_string_obj.group())
          # string before the regex match, so the body of the email
          body_before_gmail_reply = body_before_gmail_reply_list[0]
        return body_before_gmail_reply
      

      【讨论】:

        【解决方案4】:

        试试这个:

        import re
        def deleteForwardedMessagesFromMessage(message):
            nextMessage = re.split(r"\n.*[\,].*\<\s*.*>", message)[0]
            print(nextMessage)
            return nextMessage
        

        【讨论】:

          【解决方案5】:

          试试这个,它适用于法语/英语电子邮件:

          2011 年 3 月 24 日星期四下午 3:51,test@test.com 写道:

          勒梅尔。 28 平均2021 à 10:03,test.test@orange.com 一个écrit:

          正则表达式=r'\w+\s+\w+[,.]\s+(\w+\s+\d+|\d+\s+\w+)[,.]\s+\d+\s+(\w+|\à )\s+\d+[:]\d+(\s+\w+)?,?\s+(\s*\s*[a-zA-Z][._-]?[a-zA -Z][@]\w+[.]?\w{2,3}\s*>?;?\s*)(a écrit|wrote)\s*:'

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-14
            • 2013-04-30
            • 2010-11-23
            • 1970-01-01
            • 2011-07-13
            • 2023-03-29
            • 1970-01-01
            • 2015-12-22
            相关资源
            最近更新 更多