我对我的项目有一个要求,要求我解析进入Gmail帐户的邮件的签名。从签名中,我必须提取名字,姓氏,邮件ID等(仅发送者的)。您能告诉我从哪里开始吗? (从某种意义上说,“从哪里开始”已经存在了吗?)
我已经遍历了这个question,这个问题是关于删除签名的内容,但这与我的要求完全相反。答案并不能解决我的问题。
我知道我可以使用正则表达式来完成此任务。但是我也不想错过那些不遵循邮件签名网络礼节的邮件,例如在签名之前删除“-”,后跟连字符。
如果可能的话,请让我知道任何确切提供此功能的开源javascript项目。
提前致谢。
更新:我正在寻找的签名通常与业务相关,因此它们包含HTML内容或有时直接包含VCard。
更新:我需要做的只是剥离签名的每一行,并从这些行中获取详细信息。
最佳答案
回答这个问题有几个潜在的部分。
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由于大多数签名是自动添加的,因此通常在它们前面有一系列换行符。但是,手工输入的签名可能不遵循这种模式,因此,根据您要处理的电子邮件类型,您可能会发现此步骤无益或有害。
识别签名的一部分
现在,您已经减少了正则表达式错误肯定匹配的可能性,现在可以查看其余行是否与您的任何模式都匹配。
用换行符替换公共分隔线,|。是一个常见的例子。
检查是否有任何行与您的正则表达式模式匹配。如果是这样,请将其从进一步考虑中删除。最困难的部分是将名称与其他名称区分开。建议的订单:
电子邮件
电话
邮政编码(如果找到邮政编码,则输入地址)
左边应该是结束语,名称,标语和上面各项的任何格式错误的部分。请注意,虽然大多数正则表达式都用于查找错误(用于验证),但您要匹配错误,从进一步处理中删除行,然后进行验证或规范化。
在我看来,弄清楚哪一部分是最难的部分是将名称与标记行区分开。以下是一些对常见情况应有帮助的建议:
名称由少量单词组成。
名称在某些地方包含句点-1-3个字母词。 (法语有M. Messieur)
名称不包含太多标点符号。除上述时间段外,可能还只有破折号和撇号。您可能会在标题前遇到逗号问题,例如John Lawyer,Esq。
标记行可能以逗号结尾
大写可以暗示(但不能确切地说)某物是否是名字。
此外,您可以将常用的结尾称呼词列入黑名单(此致,谢谢,欢呼等)。如果将其缩小到一两行,则最上面的一个可能是名称,而最下面的一个可能是标记行。 。
有关标识名称的更多信息,请参见Find names with Regular Expression。请记住,虽然在一般情况下编写解决方案应该很容易,但是自然语言处理非常庞大,超出了像我这样的凡人的范围。 Named Entity Recognition is a known challenge。希望我所描述的内容能在大多数情况下为您带来帮助。
关于javascript - 如何解析电子邮件签名以单独获取详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31782084/