如何解析电子邮件签名以分别获取详细信息?
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">
。
签名解析的通用方法
我随意将目标限制为发件人的联系信息。因此,在签名中只获取联系信息是最有意义的。由于许多电子邮件包含发件人以外的人的联系信息,因此第一步是隔离签名。
隔离签名后,每一行都可以与正则表达式模式进行匹配。我绝不是正则表达式专家,所以我不会在这里尝试描述实际模式。
后面是方法,不是代码。实际实施应该非常简单。
正在从电子邮件中获取签名
- 删除目标消息中呈现的文本以外的所有内容。在适当的地方留下 \n 换行符。
- 从消息底部开始工作,将每一行存储在一个变量中。当您遇到长行时停止(60 多个字符,具体数字需要实验1)。不要包括长行。
- 如果中间某处有多个\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 签名可能不遵循此模式,因此根据您处理的电子邮件类型,您可能会发现此步骤无益或有害。
识别部分签名
现在您已经降低了正则表达式误报匹配的可能性,您可以查看剩余的行是否与您的任何模式匹配。
用换行符替换公共分隔符,|是一个常见的例子。
检查是否有任何行与您的正则表达式模式匹配。如果他们这样做,请将它们从进一步考虑中删除。最困难的部分是将名称与其他事物区分开来。建议顺序:
电子邮件
phone
邮政编码(如果找到邮政编码,则为地址)
左边应该是结束语、姓名、标语以及上述项目的任何格式不正确的部分。请注意,虽然大多数正则表达式用于查找错误(用于验证),但您想要匹配错误,从进一步处理中删除行,然后验证或规范化。
在我看来,找出哪一部分是哪一部分最难的部分是区分名称和标记行。以下是一些对常见情况应该有所帮助的建议:
- 名称由少量单词组成。
- 名称在某些地方包含句点 - 在 1-3 个字母单词之后。 (法语有 M. 代表 Messieur)
- 名称不包含太多标点符号。除了上面的句点之外,可能只有破折号和撇号。您可能 运行 遇到标题前逗号的问题,例如,John Lawyer, Esq.
- 标记行可能以逗号结尾
- 大写可以暗示(但不是明确地说)某物是否是一个名字。
此外,您可以将常见的结束称呼词(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://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": []
}
]
}
我的项目需要解析发送到我的 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">
。
签名解析的通用方法
我随意将目标限制为发件人的联系信息。因此,在签名中只获取联系信息是最有意义的。由于许多电子邮件包含发件人以外的人的联系信息,因此第一步是隔离签名。
隔离签名后,每一行都可以与正则表达式模式进行匹配。我绝不是正则表达式专家,所以我不会在这里尝试描述实际模式。
后面是方法,不是代码。实际实施应该非常简单。
正在从电子邮件中获取签名
- 删除目标消息中呈现的文本以外的所有内容。在适当的地方留下 \n 换行符。
- 从消息底部开始工作,将每一行存储在一个变量中。当您遇到长行时停止(60 多个字符,具体数字需要实验1)。不要包括长行。
- 如果中间某处有多个\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 签名可能不遵循此模式,因此根据您处理的电子邮件类型,您可能会发现此步骤无益或有害。
识别部分签名
现在您已经降低了正则表达式误报匹配的可能性,您可以查看剩余的行是否与您的任何模式匹配。
用换行符替换公共分隔符,|是一个常见的例子。
检查是否有任何行与您的正则表达式模式匹配。如果他们这样做,请将它们从进一步考虑中删除。最困难的部分是将名称与其他事物区分开来。建议顺序:
电子邮件
phone
邮政编码(如果找到邮政编码,则为地址)
左边应该是结束语、姓名、标语以及上述项目的任何格式不正确的部分。请注意,虽然大多数正则表达式用于查找错误(用于验证),但您想要匹配错误,从进一步处理中删除行,然后验证或规范化。
在我看来,找出哪一部分是哪一部分最难的部分是区分名称和标记行。以下是一些对常见情况应该有所帮助的建议:
- 名称由少量单词组成。
- 名称在某些地方包含句点 - 在 1-3 个字母单词之后。 (法语有 M. 代表 Messieur)
- 名称不包含太多标点符号。除了上面的句点之外,可能只有破折号和撇号。您可能 运行 遇到标题前逗号的问题,例如,John Lawyer, Esq.
- 标记行可能以逗号结尾
- 大写可以暗示(但不是明确地说)某物是否是一个名字。
此外,您可以将常见的结束称呼词(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://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": []
}
]
}