0

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

我正在使用 imap_tools 在我的 API 中获取邮件。但是当有线程/对话时,我被困在了这一点上。我从邮件中阅读了一些关于使用reference或标题的文章。in-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
4

1 回答 1

0

您面临的问题与标题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然后删除匹配的行。

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

来源:如何从电子邮件中删除引用的文本并仅显示新文本


编辑

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

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

于 2021-08-02T13:06:19.397 回答