如何解析电子邮件签名以分别获取详细信息?

How to parse an email signature to get the details separately?

我的项目需要解析发送到我的 gmail 帐户的邮件的签名。从签名中我必须获取名字、姓氏、邮件 ID 等 [仅发件人的]。你能告诉我从哪里开始吗? (从某种意义上说,"where to start from" 是否已经为此准备好了任何东西?)

我已经通过了question,这个问题说的是删除签名的东西,但这与我的要求完全相反。这个答案没有解决我的问题。

我知道我可以使用正则表达式来完成这项工作。但我什至不想错过那些不遵守邮件签名网络礼仪的邮件,例如在签名前删除“--”、尾随连字符。

如果可能的话,请告诉我任何完全提供此功能的开源 javascript 项目。

提前致谢。

更新: 我正在寻找的签名通常与业务相关,因此它们包含 HTML 内容或有时直接包含 VCard。

更新:我只需要去掉签名的每一行并从这些行中获取详细信息。

我不使用 GMail,所以我实际上是根据我拥有的唯一一条包含签名的 GMail 邮件构建这个答案的。这是垃圾邮件。不过,让我们看看这能让你走多远...

var sig = document.querySelector('div[data-tooltip="Show trimmed content"]')
                  .parentNode.nextElementSibling

这应该将一个名为 sig 的新变量设置为紧跟在 hide/show 点之后的内容。请注意,它还会查找引用的对话。这是一个开始,而不是一个完整的解决方案。

Element.querySelector() 是一种通过 CSS 搜索元素的简便方法。在这种情况下,我寻找工具提示。我们想要的元素实际上是上一层然后是下一个元素(CSS做不到但是JS可以)。

回答这个问题有几个潜在的部分。

gmail 界面内的签名

在 gmail 界面中,签名很容易获取。它们被包装在 <font color="#888888"> 中,因此如果您从 gmail 界面中获取签名,那么使用 xmlreader 获取它们应该非常容易。这不会获得 gmail 未检测到的任何签名。

使用签名设置从 gmail 发送的邮件中的签名

只需在电子邮件的 html 版本中查找 <div class=3D"gmail_signature">

签名解析的通用方法

我随意将目标限制为发件人的联系信息。因此,在签名中只获取联系信息是最有意义的。由于许多电子邮件包含发件人以外的人的联系信息,因此第一步是隔离签名。

隔离签名后,每一行都可以与正则表达式模式进行匹配。我绝不是正则表达式专家,所以我不会在这里尝试描述实际模式。

后面是方法,不是代码。实际实施应该非常简单。

正在从电子邮件中获取签名

  1. 删除目标消息中呈现的文本以外的所有内容。在适当的地方留下 \n 换行符。
  2. 从消息底部开始工作,将每一行存储在一个变量中。当您遇到长行时停止(60 多个字符,具体数字需要实验1)。不要包括长行。
  3. 如果中间某处有多个\n,删除它们和它们上面的所有内容。这是为了删除任何短线和大多数结束称呼。2

现在签名被隔离了。

以下是关于剩余部分的一些假设。除非指定顺序,否则假设它们可以按任何顺序排列。

A) End of message and closing greeting will be the topmost line(s)
B) Name
C) Phone Number
D) Email Address
E) Mailing Address
F) Tag line or witty saying, etc.

1 60 个字符的行长度基于 RFC 2822 强烈建议行应为 78 个字符的事实。 Gmail 尊重这一点。大多数签名行会比这更短,除非整个地址写成一行。使用此方法无法正确检测极短电子邮件(< 20 个单词)的签名,但首先检查邮件总长度并使用不同的代码来处理它是微不足道的。

2由于大多数签名都是自动添加的,所以在它们之前通常会有一系列的换行符。但是,hand-typed 签名可能不遵循此模式,因此根据您处理的电子邮件类型,您可能会发现此步骤无益或有害。

识别部分签名

现在您已经降低了正则表达式误报匹配的可能性,您可以查看剩余的行是否与您的任何模式匹配。

  1. 用换行符替换公共分隔符,|是一个常见的例子。

  2. 检查是否有任何行与您的正则表达式模式匹配。如果他们这样做,请将它们从进一步考虑中删除。最困难的部分是将名称与其他事物区分开来。建议顺序:

    电子邮件

    phone

    邮政编码(如果找到邮政编码,则为地址)

左边应该是结束语、姓名、标语以及上述项目的任何格式不正确的部分。请注意,虽然大多数正则表达式用于查找错误(用于验证),但您想要匹配错误,从进一步处理中删除行,然后验证或规范化。

在我看来,找出哪一部分是哪一部分最难的部分是区分名称和标记行。以下是一些对常见情况应该有所帮助的建议:

  1. 名称由少量单词组成。
  2. 名称在某些地方包含句点 - 在 1-3 个字母单词之后。 (法语有 M. 代表 Messieur)
  3. 名称不包含太多标点符号。除了上面的句点之外,可能只有破折号和撇号。您可能 运行 遇到标题前逗号的问题,例如,John Lawyer, Esq.
  4. 标记行可能以逗号结尾
  5. 大写可以暗示(但不是明确地说)某物是否是一个名字。

此外,您可以将常见的结束称呼词(sincerely、thank(s)、cheers 等)列入黑名单。如果将其缩小到一两行,则上一行很可能是名字,下一行是很可能是标语。

有关识别名称的详细信息,请参阅 Find names with Regular Expression. Remember that while it should be easy to write a solution in the general case, natural language processing is HUGE and beyond the scope of mortals like me. Named Entity Recognition is a known challenge。希望我所描述的内容在大多数情况下都能让您有所收获。

我想解决这个问题的方法不仅仅是几行代码。我认为它需要某种专门用于此的特殊处理,例如签名解析器或 NLP。这个问题从八月开始我想现在是时候关闭它了。

有一个 API 可以从签名中解析联系人数据。它还将处理回复链。请参阅下面的示例。

https://www.sigparser.com

您可以在 https://api.sigparser.com 的 swagger 详细信息页面上测试 API。

(我是 SigParser.com 顺便说一句)

这是一个示例响应:

{
    "error": null,
    "contacts": [
        {
            "firstName": "Bill",
            "lastName": "Gates",
            "emailAddress": "bgates@example.com",
            "phoneNumber": null,
            "fax": null,
            "address": null,
            "title": null,
            "phoneNumbers": [
                {
                    "rationalType": null,
                    "type": "Mobile",
                    "phoneNumber": "7774448888"
                }
            ],
            "twitterUrl": [
                {
                    "emailAddress": "bgates@example.com",
                    "url": "https://twitter.com/BillGates"
                }
            ],
            "linkedInUrl": [
                {
                    "emailAddress": "bgates@example.com",
                    "url": "https://www.linkedin.com/in/williamhgates/"
                }
            ]
        }
    ],
    "isSpammyLookingEmailMessage": false,
    "isSpammyLookingSender": false,
    "isSpam": false,
    "from_LastName": "Gates",
    "from_FirstName": "Bill",
    "from_Fax": null,
    "from_Phone": null,
    "from_Address": null,
    "from_Title": null,
    "from_MobilePhone": "7774448888",
    "from_OfficePhone": null,
    "from_LinkedInUrl": "https://www.linkedin.com/in/williamhgates/",
    "from_TwitterUrl": "https://twitter.com/BillGates",
    "from_EmailAddress": "bgates@example.com",
    "emails": [
        {
            "from_EmailAddress": "bgates@example.com",
            "from_Name": "Bill Gates",
            "textBody": "Hi, good seeing you the other day.\r\n--\r\nBill Gates\r\nCell 777-444-8888LinkedInTwitter",
            "htmlLines": [
                "<div>Hi, good seeing you the other day.</div>",
                "<div>--</div>",
                "<div>Bill Gates</div>",
                "<div>Cell 777-444-8888</div><a href=\"https://www.linkedin.com/in/williamhgates/\">LinkedIn</a><a href=\"https://twitter.com/BillGates\">Twitter</a>"
            ],
            "date": "2017-01-01T00:00:00",
            "didParseCorrectly": true,
            "to": [],
            "cc": []
        }
    ]
}