0

我正在阅读电子邮件标题(在 Node.js 中,用于记分的人),它们各不相同。该字段中的电子邮件地址to如下所示:

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

以及各种其他格式。有什么办法可以解析出所有这些吗?

这是我的第一个刺:

  1. 运行一个将不同split()-人分解成一个数组
  2. 对于每个项目,查看是否有<"
  3. 如果有<,则解析出电子邮件
  4. 如果有",则解析出名称
  5. 对于名称,如果有,,则拆分以获取姓氏、名字。

如果我先对 进行拆分,Development, Business则会导致拆分错误。空格也不一致。另外,我以前从未见过的标题中可能包含更多的电子邮件地址格式。有什么方法(或者可能是一个很棒的 Node.js 库)可以为我完成所有这些工作吗?

4

4 回答 4

5

有一个用于此的 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' }]
于 2012-02-28T20:51:04.163 回答
3

实际的格式非常复杂,但这是一个有效的正则表达式。我不能保证它总是会起作用。https://www.rfc-editor.org/rfc/rfc2822#page-15

const str = "...";
const pat = /(?:"([^"]+)")? ?<?(.*?@[^>,]+)>?,? ?/g;

let m;
while (m = pat.exec(str)) {
  const name = m[1];
  const mail = m[2];

  // Do whatever you need.
}
于 2012-02-28T03:55:54.147 回答
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);
于 2012-02-28T03:42:09.753 回答
0

对于完整的东西,你应该把它移植到 JS:http ://cpansearch.perl.org/src/RJBS/Email-Address-1.895/lib/Email/Address.pm

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

于 2012-02-28T16:57:24.977 回答