如何正确解析名称中的电子邮件地址?

时间:2012-02-28 03:10:51

标签: parsing node.js email-headers

我正在阅读电子邮件标题(在Node.js中,对于那些保持分数的人),并且它们各不相同。 to字段中的电子邮件地址如下所示:

"Jake Smart" <jake@smart.com>, jack@smart.com, "Development, Business" <bizdev@smart.com>

以及其他各种格式。有没有办法解析所有这些?

这是我的第一次尝试:

  1. split()上运行-,将不同的人分成阵列
  2. 对于每件商品,请查看是否有<"
  3. 如果有<,则解析出电子邮件
  4. 如果有",则解析出名称
  5. 对于名称,如果有,,则拆分以获取姓氏,名字。
  6. 如果我首先对,进行拆分,则Development, Business将导致拆分错误。空间也不一致。此外,我之前从未见过的标题中可能会有更多的电子邮件地址格式。有什么方法(或者可能是一个很棒的Node.js库)会为我做这一切吗?

4 个答案:

答案 0 :(得分:6)

有一个npm模块 - mimelib(如果你在Windows上或者不想编译node-iconv,则为mimelib-noiconv)

npm install mimelib-noiconv

用法是:

var mimelib = require("mimelib-noiconv");
var addressStr = 'jack@smart.com, "Development, Business" <bizdev@smart.com>';
var addresses = mimelib.parseAddresses(addressStr);

console.log(addresses);
// [{ address: 'jack@smart.com', name: '' },
//  { address: 'bizdev@smart.com', name: 'Development, Business' }]

答案 1 :(得分:2)

实际的格式非常复杂,但这里有正则表达式。我不能保证它总能奏效。 http://tools.ietf.org/html/rfc2822#page-15

var str, pat, name, mail;
str = "...";
pat = /(?:"([^"]+)")? ?<?(.*?@[^>,]+)>?,? ?/g;
while (m = pat.exec(str)) {
  name = m[1];
  mail = m[2];

  // Do whatever you need.
}

答案 2 :(得分:0)

我会尝试在一次迭代(性能)中完成所有操作。把它扔到一起(有限的测试):

var header = "\"Jake Smart\" <jake@smart.com>, jack@smart.com, \"Development, Business\" <bizdev@smart.com>";
alert (header);
var info = [];
var current = [];
var state = -1;
var temp = "";
for (var i = 0; i < header.length + 1; i++) {
  var c = header[i];
  if (state == 0) {
    if (c == "\"") {
      current.push(temp);
      temp = "";
      state = -1;
    } else {
      temp += c;
    }
  } else if (state == 1) {
    if (c == ">") {
      current.push(temp);
      info.push (current);
      current = [];
      temp = "";
      state = -1;
    } else {
      temp += c;
    }
  } else {
    if (c == "<"){
      state = 1;
    } else if (c == "\"") {
      state = 0;
    }
  }
}

alert ("INFO: \n" + info);

答案 3 :(得分:0)

对于完整的内容,您应该将其移植到JS:http://cpansearch.perl.org/src/RJBS/Email-Address-1.895/lib/Email/Address.pm

它为您提供所需的所有部件。棘手的一点就是开始时的一组正则表达式。