如何从零开始创建电子邮件解析器

所以,你的老板刚刚让你解决困扰公司的“电子邮件难题”:每个早晨,大量自动化邮件需要人工录入数据,严重拖慢了团队效率并堵塞邮箱。

你聪明又高效,很快想到可以构建一个电子邮件解析系统。这是个好主意!不过,这个过程比写几段脚本要复杂一些。下面是创建电子邮件解析器并成功自动化电子邮件数据录入工作流的六个步骤

在开始之前:让我们定义解析以及什么是解析

在计算机科学中,解析是指根据一套规则将文本拆分为若干子部件的操作。

一个电子邮件解析器,就是让计算机能够读取邮件并根据特定规则处理它们。理想情况下,系统会自动从这些邮件中提取相关数据,并将其输入你的后台应用程序。欢迎阅读这篇关于电子邮件解析深度剖析的文章。

小小推荐:你了解 Parseur 吗?

自己开发一个电子邮件解析器很有趣,可以帮你深入理解底层原理。

但这个过程非常耗时。如果你想跳过开发阶段,Parseur 为你提供了一个开箱即用的电子邮件解析器

注册您的免费账户
使用 Parseur 节省时间和精力。自动处理您的文档。

Parseur 完全从零开发始于2015年底,六年时间里,单单构建后端就投入了约5000个人时。前端(包括所有用户界面和模板编辑器)也花费了数千个人时来构建。Parseur 背后的团队由拥有20年以上专业编码经验的资深开发者组成。

我们还没有完成,甚至都无法估算创建一个“足够好”的文本解析器需要多长时间。

如果你需要快速见效,建议直接试用 Parseur。Parseur 是一款托管且易用的电子邮件解析器,能为你节省大量搭建自有方案的时间。快来了解丰富的 Parseur 功能

1. 获取电子邮件

目前,邮件可能接收在员工个人邮箱、团队共享邮箱或公司总邮箱。

第一步应是设置一个邮箱账号来集中所有这些邮箱。或者甚至,如果你有勇气,还可以自建自己的邮件服务器,也叫作 SMTP 服务器。

如果你知道自己在做什么,以下是目前比较流行的一些 SMTP 服务器:

  • Exim 是一款免费开源的邮件传输代理(邮件服务器的另一个名称)。它是目前最流行的 SMTP 服务器,普及速度略微领先于排名第二的 Postfix。
  • Postfix 同样免费开源。它以“开箱即用、问题极少”而著称。根据这篇关于邮件服务器市场份额的文章,Exim 和 Postfix 共同占据了所有邮件服务器的 80%。
  • 微软阵营则是无处不在的 Exchange。你可以通过 EWS 从中获取邮件,而不必使用老式的 POP3IMAP。如今,你甚至可以付费让微软为你托管
  • 自己搭建。这条路漫长而曲折,但你能学到很多东西。最终你的服务器可能会更贴合你的需求,前提是你的需求并不意味着要与市面上数不清的邮件客户端兼容。如果你决心走这条路,Python 标准库中有一个可爱的模块可以帮助你入门。不妨看看 smtpd

需要注意的是,大量发送邮件而不被列入黑名单本身就是一门艺术,最好交给专家来处理。

同时,自己搭建邮件服务器的热度正在下降。在云和 SaaS 时代,使用托管邮件服务替你做这些脏活累活更加方便。该领域的主要参与者有:

  • Postmark 注重送达率和可靠性,而且它有免费套餐。
  • Mandrill 拥有先发优势,依然很受欢迎。它侧重于营销和事务型邮件。
  • Sendgrid 同样定位为营销和事务型邮件平台。
  • Mailgun 更偏向开发者和 API。同时,它也有免费方案。

在 Parseur 我们特别喜欢 Postmark。他们的 API 很棒,文档也非常出色。并且拥有几乎所有主流编程语言的众多 SDK。

2. 将电子邮件转换为标准数据格式

电子邮件是一种十分古老的格式,古老到比《星球大战》还要早,并且几十年来积累了一些瑕疵。比如,最初的规范中并不包含处理国际(非美式)字符。为了处理像 € 这样的特殊字符,你需要考虑三份技术文档(也称作 RFC):

  • RFC 2047 提供对邮件头中国际名称和主题行的支持
  • RFC 5890 提供对域名系统 (DNS) 中国际域名的支持
  • RFC 6532 允许在邮件头部使用 UTF-8(另一种存储国际文本的方式)

再一次强调,像 Postmark 或 Mailgun 这样的服务能够拯救你,帮你完成转换。你可以忘掉涉及 UTF-8、MIME 和 cp1252 的恐怖故事(没听说过 UTF-8、MIME 或 cp1252?我真羡慕你的生活)。

举个例子,如果使用 Mailgun,服务器会替你接收邮件并将其转换为易于处理的 JSON 文档,妥善处理人类已知的所有 RFC 协议。然后它将通过单一的 HTTP POST 请求,把它作为 webhook 发送到你自己的服务器上的任意 URL。

对于好奇的人,这里是所有与 SMTP 相关的 RFC 列表。不用谢。

例如,Mailgun 收到的一封普通邮件到达你的服务器时会变成这样:

{
  "subject": "My favorite café",
  "sender": "John Doe <[email protected]>",
  "recipient": "Mr. Parseur <[email protected]>",
  "message": "It's called Awesome Café! See directions in the attachment. Bye.",
  "attachements": [
    { "name": "directions.pdf", "content": "https://url.with.content" },
    { "name": "cappucino.jpg", "content": "https://another.content.url" }
  ]
  /*... other interesting pieces of data here (read the doc, Luke) ...*/
}

是不是很棒?将此与传统的电子邮件格式比较一下:

  MIME-Version: 1.0
  Received: by 102.29.23.176 with HTTP; Sat, 12 Aug 2016 14:13:31 -0700 (PDT)
  Date: Sat, 12 Aug 2016 14:13:31 -0700
  Delivered-To: =?ISO-8859-1?Q?Mr. Parseur <[email protected]>
  Message-ID: <CAAJL_=kPAJZ=fryb21wBOALp8-XOEL-h9j84s3SjpXYQjN3Z3A@mail.gmail.com>
  Subject: =?ISO-8859-1?Q?My=20Favorite=20Caf=E9
  From: =?ISO-8859-1?Q?John Doe <[email protected]>
  To: =?ISO-8859-1?Q?Mr. Parseur <[email protected]>
  Content-Type: multipart/mixed; boundary=mixed
  ==mixed
  Content-Type: multipart/alternative; boundary=alternative
  ==alternative
  Content-Type: text/plain; charset="utf-8"
  It's called Awesome Caf=C3=A9! See directions in the attachm= ent. Bye.
  ==alternative
  Content-Type: text/html; charset="utf-8"
  It's called <b>Awesome Caf=C3=A9</b>! See directions in the = attachment. Bye. ==alternative== ==mixed
  Content-Type: document/pdf; name="directions.pdf"
  Content-Disposition: attachment; filename="directions.pdf"
  Content-Transfer-Encoding: base64
  iVBORw [... the whole encoded attachment here ...] RK5CYII=
  ==mixed
  Content-Type: image/jpg; name="capuccino.jpg"
  Content-Disposition: attachment; filename="capuccino.jpg"
  Content-Transfer-Encoding: base64
  G+aHAAAA [... another attachment encoded here ...] ORK5CYII=
  ==mixed==

幸运的是,大多数主流编程语言都带有解析邮件的库,例如 Python 的 email 模块,或者 Ruby 的 RubyMail 库。

3. 将数据存入数据库

从现在起,你可以指望自己的编程技能来处理所有这些 HTTP 请求,并将它们转化为所选数据库中漂亮的条目。

以下是一些流行的编程语言和框架可帮助你完成任务,按流行度递增排序:

如果你对具体格式没有特殊要求,相关代码会相对简单。不过,你可能需要找出你的业务软件所接受的格式并转换为这种格式。常用的交换格式包括 CSVJSON,但某些业务应用会使用更晦涩的二进制格式。

如果你需要的只是存储数据(可能是为你自己的定制业务应用),那你只需选择数据的存储方式即可。

如果你知道自己永远不需要对这些存储的邮件做统计或非顺序操作,你可以考虑使用 MongoDB。不过,我建议不要这样做,理由可以参考这篇很棒的博文

任何基于 SQL 的关系数据库管理系统都能很好地存储你的邮件。至少,你需要定义两张表:一张用来存邮件,另一张用来存其附件(如果你决定存储它们)。

任何 SQL 数据库引擎应该都能胜任,只要你的数据量和负载不超出单机范围。现在关系型数据库有几个流行的选择:

  • MySQL,及其推荐但非官方的分支 MariaDB 是基础且仍旧受欢迎的数据库服务器选择。注意,自从 Oracle 收购了 MySQL 后,官方支持力度已经大不如前。并不意外。
  • Postgresql 是一个更庞大、功能丰富的数据库引擎,相比 MySQL 有更多的扩展选项和更复杂的设置。
  • 除了这些免费开源数据库之外,当然还有 Oracle,它拥有卡车一般多的功能来满足大型企业的需求。非常庞大、复杂且昂贵。你确定你简单的邮件存储解决方案需要这么强的可扩展性吗?
  • 同样在商业阵营,Microsoft SQL server 在过去几年有了很大提升,如今看起来是 Oracle 的可行竞争对手。

我们到了这一步。如果你只想将邮件内容原封不动放入应用数据库,那你基本已经搞定了。

但为什么要止步于此?现在你手头掌握了大量有趣的数据。这组数据非常有趣,因为它关系到你的核心业务。你的邮件可能满是发票、差旅报销、估价单、潜在客户和客户资料。

再进一步,从这些邮件中提取相关数据怎么样?提炼你拥有的数据能帮助你自动化业务工作流,为你和你的员工节省时间。

4. 从每封邮件中提取相关文本

这就是真正的解析大显身手的地方。理想情况下,我们希望这样做:

A screen capture of email parser overview
Schematics of an email parser transforming a received email into structured data (for example, a spreadsheet, or a database)

这里有几种解决这一庞大问题的方法:

统计单词分析,或“单词计数”

统计分析很适合没有预定义格式的邮件,通常是人工撰写的邮件。你可以定义几个邮件类别,每个类别包含一组特定词汇。然后解析每封邮件,分别统计每一类词汇出现的频次,再判断邮件属于其中一个或多个类别。

这在情感分析场景中表现得相当不错。例如,你可以定义一个“满意客户”类别和一个“愤怒客户”类别,将满意客户的邮件发送给你的老板,而将愤怒客户的邮件直接丢进垃圾桶。开玩笑的,但你应该懂我的意思。

但是,如你所知,人与人之间的交流很容易出错、出现歧义,且对语境非常敏感。只要我们还没有实现真正的人工智能,这些歧义就无法被解决。最好的情况是让你的系统变得不可靠,最坏的情况就是彻底没用。

正则表达式

这种方法最适合自动生成的邮件,因为这类邮件中的大部分文本是不变的。

例如,假设你想解析美国航空的一百万封订票邮件,并从中提取每位乘客的姓名。你可以创建一个匹配整封邮件并仅捕获乘客姓名的正则表达式来实现。听起来很简单,对吧?但当邮件的其他部分也发生变化时怎么办?如果那趟航班上有三名乘客而不是只有一名呢?糟了。

Python 有一个不错的正则表达式库。正则表达式(简称 regexp)也作为 Regexp 模块包含在 Ruby Core 中。它们在 JavaScript 中也是一等公民。

缺点是正则表达式难以维护,其可读性充其量也只是勉强合格。许多 Parseur 客户告诉我们,他们最初使用正则表达式开发了自己的解析引擎,但面对不断变化的新邮件流,他们无法继续维护下去。这种维护成本正是 AI 与基于规则的电子邮件解析 决策的核心。

5. 托管解决方案?Parseur 可以提供帮助!

如果能直接获取你想要的数据,并分类到 Excel 电子表格或数据库的正确列中,那岂不是很棒?

这正是我们在 Parseur 的目标。我们为你提供一个简单的“点击即用”界面,让你只需一次即可定义出哪些数据与你相关。你后续再发送类似邮件,它们的数据就会被提取出来并自动放入 Excel 表格。

你无需自己从零开始创建电子邮件解析器。在第一次短暂的点击操作后,你也无需再进行任何手动处理。每封邮件本身就会自动变成 Excel 表格中的一行。

6. 集成到你的业务软件

当你提取的数据整齐地躺在 Excel 表格中后,你“只”需将它传到有用的地方:你的业务应用。

ZapierMake 等工具能在这里极大地帮助你,因为它们可以将你的电子邮件应用与业务应用连接起来。你所要做的只是为这些服务写一个连接器。然后你就可以享用它们生态系统中的众多其他连接器了。

Parseur 支持与 Google Sheets、Zapier、Integromat 和 Microsoft Power Automate 集成,只需点击几下就能将解析后的数据开放给数千种应用。

祝你好运!

最后更新于

立即开始

告别手动录入,
就从今天起。

几分钟免费上手,亲自体验Parseur如何融入您的工作流。

无需训练模型
为真实业务场景打造
操作足够简单,API足够强大