Javascript 如何解析电子邮件签名以单独获取详细信息?

Javascript 如何解析电子邮件签名以单独获取详细信息?,javascript,regex,email,parsing,signature,Javascript,Regex,Email,Parsing,Signature,我对我的项目有一个要求,就是解析我进入gmail账户的邮件的签名。从签名中我必须提取名字、姓氏、邮件id等[只有发件人的]。你能告诉我从哪里开始吗?从这个意义上说,从哪里开始,有什么东西已经准备好了吗 我已经经历了这个,这个问题是关于删除签名的东西,但这与我的要求完全相反。这个问题的答案解决不了我的问题 我知道我可以用正则表达式来完成这件事。但我不想错过那些不遵循邮件签名网络模式的邮件,比如删除签名前的尾随连字符 如果可能的话,请让我知道任何开源javascript项目都能提供这种功能 提前谢谢

我对我的项目有一个要求,就是解析我进入gmail账户的邮件的签名。从签名中我必须提取名字、姓氏、邮件id等[只有发件人的]。你能告诉我从哪里开始吗?从这个意义上说,从哪里开始,有什么东西已经准备好了吗

我已经经历了这个,这个问题是关于删除签名的东西,但这与我的要求完全相反。这个问题的答案解决不了我的问题

我知道我可以用正则表达式来完成这件事。但我不想错过那些不遵循邮件签名网络模式的邮件,比如删除签名前的尾随连字符

如果可能的话,请让我知道任何开源javascript项目都能提供这种功能

提前谢谢

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


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

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

var sig = document.querySelector('div[data-tooltip="Show trimmed content"]')
                  .parentNode.nextElementSibling
这应该为紧跟隐藏/显示点之后的内容设置一个名为sig的新变量。注意,它还将查找引用的对话。这只是一个开始,不是一个完整的解决方案


是一种通过CSS搜索元素的便捷方法。在本例中,我查找工具提示。我们想要的元素实际上是上一个级别,然后是下一个元素CSS不能做,但JS可以做。

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

var sig = document.querySelector('div[data-tooltip="Show trimmed content"]')
                  .parentNode.nextElementSibling
这应该为紧跟隐藏/显示点之后的内容设置一个名为sig的新变量。注意,它还将查找引用的对话。这只是一个开始,不是一个完整的解决方案


是一种通过CSS搜索元素的便捷方法。在本例中,我查找工具提示。我们想要的元素实际上是上升了一个层次,然后是下一个元素,CSS不能做,但JS可以做。

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

gmail接口内的签名

在gmail界面中,签名非常容易获取。它们都是包装好的,所以如果您是从gmail接口中获取签名的话,那么使用xmlreader获取它们应该非常容易。这不会得到gmail没有检测到的任何签名

使用签名设置从gmail发送的消息中的签名

只需在电子邮件的html版本中查找

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

一旦隔离了签名,就可以根据正则表达式模式匹配每一行。我绝不是一个正则表达式专家,所以我不会试图在这里描述实际的模式

下面是一个方法,而不是代码。实际实现应该非常简单

从电子邮件中抓取签名

删除目标消息中除呈现文本以外的所有内容。在适当的位置保留\n换行符。 从消息的底部开始工作,将每一行存储在一个变量中。当你打到一条超过60个字符的长线时停止,确切的数字需要实验1。不要包括长队。 如果在某处中间有一些\n,把它们和上面的所有东西都去掉。这是为了删除任何短句和大多数的结束问候语 现在签名被隔离了

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

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个字符的行长度基于这样一个事实,即强烈建议行的长度应为78个字符。Gmail尊重这一点。大多数签名行都会比这短,除非整个地址都写为一行。使用此方法无法正确检测小于20个单词的极短电子邮件的签名,但首先检查邮件的总长度并使用不同的代码来处理这一点很简单

2由于大多数签名都是自动添加的,因此通常在签名前会有一系列换行符。然而,手写签名可能不会遵循这种模式,因此根据您正在处理的电子邮件类型,您可能会发现这一步骤没有帮助或有害

识别签名的各个部分

现在,您已经减少了正则表达式的假阳性匹配的可能性,您可以查看剩余的行是否与您的任何模式匹配

替换公共divid 带有换行符的ers是一个常见的例子。 检查是否有任何行与您的正则表达式模式匹配。如果有,则将其从进一步考虑中删除。最困难的部分是将名字与其他东西区分开来。建议订购:

电子邮件

电话

邮政编码,然后地址,如果您找到邮政编码

左边应该是收尾称呼、姓名、标记行以及上面项目的任何格式错误的部分。请注意,虽然大多数正则表达式用于查找验证错误,但您希望匹配错误,从进一步处理中删除行,然后进行验证或规范化

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

名字由少量的单词组成。 名称在某些位置包含句点-在1-3个字母单词之后。法语中M代表救世主 名字没有太多标点符号。除了上面的句号,可能只有破折号和撇号。您可能会遇到标题前的逗号问题,例如,John律师、Esq。 标记行可能以逗号结尾 大写可以暗示,但不能确定某事物是否为名称。 此外,你可以将常用的致意词真诚地、谢谢、干杯等列为黑名单。如果这将其缩小到一行或两行,则上面的一行很可能是姓名,下面的一行很可能是标记行


有关标识名称的详细信息,请参阅。记住,虽然在一般情况下编写解决方案应该很容易,但自然语言处理是巨大的,超出了像我这样的凡人的范围。希望我所描述的内容在大多数情况下都能给你带来一些帮助。

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

gmail接口内的签名

在gmail界面中,签名非常容易获取。它们都是包装好的,所以如果您是从gmail接口中获取签名的话,那么使用xmlreader获取它们应该非常容易。这不会得到gmail没有检测到的任何签名

使用签名设置从gmail发送的消息中的签名

只需在电子邮件的html版本中查找

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

一旦隔离了签名,就可以根据正则表达式模式匹配每一行。我绝不是一个正则表达式专家,所以我不会试图在这里描述实际的模式

下面是一个方法,而不是代码。实际实现应该非常简单

从电子邮件中抓取签名

删除目标消息中除呈现文本以外的所有内容。在适当的位置保留\n换行符。 从消息的底部开始工作,将每一行存储在一个变量中。当你打到一条超过60个字符的长线时停止,确切的数字需要实验1。不要包括长队。 如果在某处中间有一些\n,把它们和上面的所有东西都去掉。这是为了删除任何短句和大多数的结束问候语 现在签名被隔离了

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

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个字符的行长度基于这样一个事实,即强烈建议行的长度应为78个字符。Gmail尊重这一点。大多数签名行都会比这短,除非整个地址都写为一行。使用此方法无法正确检测小于20个单词的极短电子邮件的签名,但首先检查邮件的总长度并使用不同的代码来处理这一点很简单

2由于大多数签名都是自动添加的,因此通常在签名前会有一系列换行符。然而,手写签名可能不会遵循这种模式,因此根据您正在处理的电子邮件类型,您可能会发现这一步骤没有帮助或有害

识别签名的各个部分

现在,您已经减少了正则表达式的假阳性匹配的可能性,您可以查看剩余的行是否与您的任何模式匹配

用换行符替换公共分隔符,|是一个常见的示例。 检查是否有任何行与您的正则表达式模式匹配。如果有,则将其从进一步考虑中删除。最困难的部分是将名字与其他东西区分开来。建议订购:

电子邮件

电话

邮政编码,然后地址,如果您找到邮政编码

左边应该是收尾称呼、姓名、标记行以及上面项目的任何格式错误的部分。请注意,虽然大多数正则表达式用于查找验证错误,但您希望匹配错误,从进一步处理中删除行,然后进行验证或规范化

在我的vie中 w、 确定哪一部分是哪一部分最困难的部分是区分名称和标记行。以下是一些对常见情况有帮助的建议:

名字由少量的单词组成。 名称在某些位置包含句点-在1-3个字母单词之后。法语中M代表救世主 名字没有太多标点符号。除了上面的句号,可能只有破折号和撇号。您可能会遇到标题前的逗号问题,例如,John律师、Esq。 标记行可能以逗号结尾 大写可以暗示,但不能确定某事物是否为名称。 此外,你可以将常用的致意词真诚地、谢谢、干杯等列为黑名单。如果这将其缩小到一行或两行,则上面的一行很可能是姓名,下面的一行很可能是标记行


有关标识名称的详细信息,请参阅。记住,虽然在一般情况下编写解决方案应该很容易,但自然语言处理是巨大的,超出了像我这样的凡人的范围。希望我所描述的内容在大多数情况下都能给您带来一些帮助。

我想解决这个问题的方法不仅仅是几行代码。我认为这需要某种专门的特殊处理,比如签名解析器或NLP。这个问题从八月份就开始了,我想现在该结束了。

我想解决这个问题的方法不仅仅是几行代码。我认为这需要某种专门的特殊处理,比如签名解析器或NLP。这个问题从8月份就开始了,我想现在该结束了。

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

您可以在的“招摇过市详细信息”页面上测试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": []
        }
    ]
}

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

您可以在的“招摇过市详细信息”页面上测试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": []
        }
    ]
}


你能举几个例子说明你正在处理的文本的输入和期望的输出吗?输入也可以是HTML,因为我处理的邮件通常是商务邮件,我正在为我自己的简介Vamshi Krishna Alladi |产品软件工程师P+91 9123456789 E提供粗略的输入abcdefghi@xyz.comW www.xyz.com如果没有准确的输入,您可能就无法获得HTML代码的帮助。对此没有具体的输入。这正是我想说的。谈到我早些时候在评论中提出的意见,我只是想大致说明签名的内容。输入没有特定的格式。你能举几个例子说明你正在处理的文本的输入和所需的输出吗?输入也可以是HTML,因为我正在处理的邮件通常是商务邮件,我正在为我自己的简介Vamshi Krishna Alladi |产品软件工程师P+91 9123456789 E提供粗略的输入abcdefghi@xyz.comW www.xyz.com如果没有准确的输入,您可能就无法获得HTML代码的帮助。对此没有具体的输入。这正是我想说的。谈到我早些时候在评论中提出的意见,我只是想大致说明签名的内容。输入没有特定格式对不起@Adam Katz这不是我想要的,我已经有签名了。我只想知道如何解析它,或者GMail是如何解析它的?而且修剪过的内容部分并没有单独的签名。如果邮件有回复,它也有邮件链。哦,你想解析这个非结构化内容吗?这是一条通往精神错乱的捷径,如果没有和/或其他类似的重物,你不会走得很远。是的,我知道。但实际上我正在寻找一个第三方库或开源项目,至少可以在某种程度上帮助我。感谢@Adam KatzSorry@Adam Katz的支持,这不是我想要的,我已经有了签名。我只想知道如何解析它,或者GMail是如何解析它的?而且修剪过的内容部分并没有单独的签名。如果邮件有回复,它也有邮件链。哦,你想解析这个非结构化内容吗?这是一条通往精神错乱的捷径,如果没有和/或其他类似的重物,你不会走得很远。是的,我知道。但实际上我正在寻找一个第三方库或开源项目,至少可以在一定程度上帮助我。感谢@Adam KatzThanks对这个问题的支持,但你的回答没有满足我的要求,我只想要签名部分,而60+字符不会一直存在,对吗?感谢@JosiahI给予你的支持,你的回答让我想到了至少在一点点程度上解决我想要的问题。需要实施和观察。如果有一个
在我签字之前是什么时候?我自己也多次表示感谢和问候,几乎在每封邮件中都是如此,那样的话就不会超过60个字符。如果邮件中的最后一行不超过60个字符怎么办?@VamshiKrishnaAlladi-这是另一个更新,有更多的材料,更好的结构和更多的组织。希望这能回答你的大部分问题!谢谢你回答这个问题,但你的回答没有满足我的要求,我只想要签名部分,而且60+字符不会一直存在,对吗?感谢@JosiahI给予你的支持,你的回答让我想到了至少在某种程度上解决我想要的问题。需要实施并查看。如果在我签名之前有问候语怎么办?我自己也多次表示感谢和问候,几乎在每封邮件中都是如此,那样的话就不会超过60个字符。如果邮件中的最后一行不超过60个字符怎么办?@VamshiKrishnaAlladi-这是另一个更新,有更多的材料,更好的结构和更多的组织。希望这能回答你的大部分问题!是否有任何开源库可以执行此提取?是否有任何开源库可以执行此提取?