Как я могу правильно разобрать адрес электронной почты с именем? - PullRequest
0 голосов
/ 28 февраля 2012

Я читаю заголовки писем (в 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 ]

6 голосов
/ 29 февраля 2012

Для этого есть модуль npm - mimelib (или mimelib-noiconv, если вы работаете в Windows или не хотите компилировать node-iconv)

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' }]
2 голосов
/ 28 февраля 2012

Фактическое форматирование для этого довольно сложно, но вот регулярное выражение, которое работает.Я не могу обещать, что это всегда будет работать, хотя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.
}
0 голосов
/ 28 февраля 2012

Для чего-то полного, вы должны перенести это на JS: http://cpansearch.perl.org/src/RJBS/Email-Address-1.895/lib/Email/Address.pm

Это даст вам все необходимые детали.Сложный бит - это просто набор регулярных выражений в начале.

0 голосов
/ 28 февраля 2012

Я бы попробовал сделать все за одну итерацию (производительность). Просто бросил все вместе (ограниченное тестирование):

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...