【问题标题】:Parse email and send reply using googleapiclient in Python在 Python 中使用 googleapiclient 解析电子邮件并发送回复
【发布时间】:2020-12-04 03:43:01
【问题描述】:

我目前正在从事一个项目,我选择使用 Gmail 来发送和接收电子邮件。我希望能够发送电子邮件,让用户回复并解析他们的回复。响应可以是任意数量的行(因此response.split('\n')[0] 之类的内容将不起作用)。然后它应该能够直接回复该电子邮件线程。

我一直在关注googleapiclient tutorials,但他们还有很多不足之处。但是,我设法使用以下方法阅读了电子邮件线程:

service.users.threads().get(userId='me', id=thread_id).execute()

thread_id 是(可以预见的)电子邮件线程的 ID(我在其他地方找到)。在此返回的大字典中,有一段 base64 数据包含电子邮件的内容。这是我唯一能找到响应的实际数据的地方。不幸的是,我在解码时得到了这个:

b'This is my response from my phone\r\n\r\nOn Sat, 28 Nov 2020, 8:40 PM , <myemail@gmail.com>\r\nwrote:\r\n\r\n> This is sent from the python script\r\n>\r\n'

这是线程中的所有数据,但是,我只想要响应,因为显然没有办法将其拆分以仅获取我需要的数据。我能想到的最好的方法是解析出On &lt;date&gt;, &lt;time&gt; 形式的任何内容,但这可能会导致问题。必须有另一种方法来仅提取This is my response from my phone 而没有其他数据。


收到响应后,我想对其进行解析并根据消息的内容做出适当的响应。我宁愿直接回复该主题,而不是开始一个新主题。不幸的是,所有谷歌文档都说:

如果您尝试发送回复并希望将电子邮件串起来,请确保:

  1. 主题标头匹配
  2. References 和 In-Reply-To 标头遵循 RFC 2822 标准。

文档提供了此代码(我做了一些小的修改)用于发送电子邮件:

def create_message(sender, to, subject, message_text):
  message = MIMEText(message_text)
  message['to'] = to
  message['from'] = sender
  message['subject'] = subject
  return {'raw': base64.urlsafe_b64encode(message.as_bytes()).decode()}

发送具有相同主题行的回复非常简单 (message['subject'] = same_subject_as_before),但我什至不知道从哪里开始使用 References 和 In-Reply-To 标头。如何设置这些?

【问题讨论】:

    标签: python email gmail google-api-client


    【解决方案1】:

    为什么这么难?

    您正试图将电子邮件用于它最初不是为它设计的用途。我的印象是您希望电子邮件响应包含结构化数据,但电子邮件文本缺乏任何明确定义的结构。它还取决于其他用户拥有的电子邮件客户端,以及他们是否发送 HTML 电子邮件。

    这对人类来说通常很容易看到,但对计算机来说却很难。这表明如果您想要更高的可靠性,机器学习可能是最佳策略。无论您选择哪种解决方案,都不会 100% 可靠。

    • 电子邮件可以是纯文本或 HTML,或两者兼有。
    • 没有明确的结构将回复与原始文本分开。 Wikipedia lists a few different "posting styles"
      • 在过去“网络礼仪”还很酷的时候,把你的回复放在最前面(“置顶”)被认为是不好的做法,老人们告诉新的互联网用户不要置顶。部分用户仍然在下方回复或与原文交错。
    • 回复行(例如“在 DATE,EMAIL 写信:”或“-------- 原始消息 --------”)会有所不同,具体取决于电子邮件客户端使用的、客户端设置的语言以及用户自己的偏好。

    使用文本分隔符

    与您描述的面临类似问题的一类软件是客户服务应用程序,它允许操作员使用电子邮件进行通信。一种常见的策略是在您的模板中为外发电子邮件注入一些独特的文本。比如Zendesk uses a text "delimiter" 如:

    ##- 请在此行上方输入您的回复-##

    这有两个目的;它告诉用户置顶,并提供一个分隔符来删除大部分不相关的文本。

    如果您首先处理任何 HTML 编码,您应该能够通过这样的文本分隔符来分割消息。它并不完美,但通常可以。

    使用别人的产品

    有一些开源选项,例如:

    我发现了一个商业产品,SigParser,它似乎使用了他们非常仔细训练过的机器学习模型:

    他们还解释了将电子邮件文本解析为结构化数据的一些挑战。

    【讨论】:

    • 谢谢@traal。我实际上有一封来自使用 Zendesk 的公司的电子邮件,但是在 Gmail 中回复时,它变成了On Sat, Nov 28, 2020 at 2:01 PM Person &lt;person@email.com&gt; wrote: ##- Please type your reply above this line -## The original email is here。我仍然面临需要解析顶部文本的问题。或者将上面的行也删除到分隔符是否正常?
    • @JolonB,你可以尝试这样做,但如果对方不使用 Gmail,它可能会失败,也许他们的电子邮件客户端会做一些完全不同的事情。如果他们的回复和原始回复之间有一个空行,您可以尝试删除分隔符上方的最后一段。特别是如果最后一段以冒号 (:) 结尾或包含长破折号 (----) 序列。
    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多