可靠的方法仅获取邮件正文,排除之前的邮件

15 投票
5 回答
6484 浏览
提问于 2025-04-16 14:20

我正在创建一个基本系统,让用户可以通过电子邮件回复网站上的帖子。不过,大多数电子邮件客户端在回复邮件时会把之前邮件的内容也包含进去。这些内容在网站上是多余的。

有没有什么可靠的方法可以只提取出新的消息,而不需要知道之前的邮件内容?我正在使用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的回复消息,我相信其他邮件客户端可能会有不同的处理方式。一个好的开始可能是忽略那些以>开头的行,但新的消息中可能也会有这样的行,所以这些行可能还是需要保留的。我还会有内容类型和日期的行。

5 个回答

1

我觉得这个应该可以用

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
2

@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

电子邮件回复的格式取决于使用的邮件客户端。没有一种可靠的方法可以提取最新的消息,因为这样做可能会导致提取的信息太多或太少。

不过,有一种常见的方式来标记引用内容,就是在引用前加上一个>符号。因此,邮件中以这个符号开头的行,尤其是在邮件的开头或结尾有多个这样的符号,通常是引用的内容。

但是,你提到的On Thu, Mar 24, 2011 at 3:51 PM, <test@test.com> wrote:这一行就很难提取。因为如果一行以:结尾,紧接着是引用内容,这可能表示这行是引用的一部分,但你不能确定——它也可能是新消息的一部分,而这个冒号只是打错了(在德语键盘上,:是通过SHIFT+.输入的)。

撰写回答