【问题标题】:separate emails in the email thread based on reference or in-reply-to headers using imap_tools使用 imap_tools 根据参考或回复标头在电子邮件线程中分离电子邮件
【发布时间】:2021-10-07 18:26:27
【问题描述】:

我正在开发一个 CRM,每天我会收到数百封关于报价/要求的电子邮件。我正在构建一个 API 来处理电子邮件并在 CRM 中插入条目。

我正在使用 imap_tools 在我的 API 中获取邮件。但是当有线程/对话时,我被困在了这一点上。我从邮件中阅读了一些关于使用referencein-reply-to 标头的文章。但到目前为止很不幸。我也尝试过使用 message-id,但它给了我相同的电子邮件线程而不是多封电子邮件。

我收到一封电子邮件线程/对话作为单个电子邮件,我想获得分开的电子邮件,以便我可以轻松处理它们。

这是我到目前为止所做的。

from imap_tools import MailBox
with MailBox('mail.mail.com').login('abc@abc.com', 'password', 'INBOX') as mailbox:
for msg in mailbox.fetch():
   From = msg.headers['from'][0]
   To = msg.headers['to'][0]
   subject = msg.headers['subject'][0]
   received_date = msg.headers['date'][0]
   raw_email = msg.text
   process_email(raw_email) #processing the email

【问题讨论】:

  • 澄清一下,您的意思是在一个电子邮件正文中,您会收到线程中所有以前的电子邮件以及新邮件?
  • 是的,我在单个电子邮件正文中收到了所有内容。
  • @Vladimir 你能解释一下你想到的解决方案吗,因为我已经尝试了几乎所有提供的属性。
  • @this 提示使用属性,准备工作。参考或回复您的方式是正确的,但没有魔法

标签: python imap gmail-imap email-parsing email-threading


【解决方案1】:

您面临的问题与标题 referencein-reply-to 无关。大多数电子邮件客户端会在您回复时将以前的电子邮件作为引用文本附加到新邮件中。因此,在一个线程中,一封邮件将所有以前邮件的正文作为引用文本。

在大多数情况下,我说的最多,因为电子邮件标准因客户而异,客户将通过在所有引用行之前假装> 来引用上一封邮件

new message

> old message
>> very old message

作为一个 hacky 解决方案,您可以删除所有以 > 开头的行

在python中,可以splitlines()进行过滤

lines = email.splitlines()
new_lines = [i for i in lines if not i.startswith('>')]

new_lines = list(filter(lambda i: not i.startswith('>'), lines))

您也可以使用正则表达式或其他技术。

解决方案的问题很明显,如果电子邮件包含>,否则会导致信息丢失。因此,更复杂的方法是选择带有> 的行,并将它们与线程中使用references 的先前电子邮件进行比较,然后删除匹配的行。

Google 在这里有他们的专利实施 https://patents.google.com/patent/US7222299

来源:How to remove the quoted text from an email and only show the new text


编辑

我意识到 Gmail 遵循 > 引用,其他客户端可能会遵循其他方法。上面有一篇维基百科文章:https://en.wikipedia.org/wiki/Posting_style

从概念上讲,所需的方法相似,但需要处理不同类型的客户

【讨论】:

  • 我在回复中没有收到任何引用的文本,它只是纯文本。
  • 您能否在您的问题中添加一个示例原始邮件。这样我们可以更好地调试
  • 这里是link 示例文本
  • 我可能是错的,但我认为这就是正在使用的客户对待它的方式。用户很可能正在使用不遵守在旧邮件行之前添加> 的自定义客户端。您可以检查多封邮件,看看水平线是否不变,如果是,那么您可以删除之后的所有内容
  • 恐怕您会收到来自多个客户的邮件,并且您需要处理多个不同的案例。或者采用 Google 的方法,在 references 中使用以前邮件中的哈希值并删除与之对应的文本。
猜你喜欢
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 2022-09-30
  • 2022-09-27
  • 2016-12-18
  • 2018-03-17
  • 2013-07-25
  • 2018-09-22
相关资源
最近更新 更多