Отправлять электронные письма из адресной книги

102
10

В нашем приложении есть страница приглашения, в которой пользователь может импортировать свою адресную книгу. Мы используем внешнюю службу для их получения, поэтому она просто выводит результаты в текстовое поле. Мы начали просто разбивать результаты запятой и быстро выяснили, что это не сработает из-за:


"Smith, Joe" <jsmith@example.com>, "Jackson, Joe" <jjackson@example.com>

Он работал бы между двумя записями, но также разбивался и на них. Просто интересно, есть ли хорошо известный способ доказать свою эффективность.


Может ли regex работать? Я довольно плохой, чтобы кто-нибудь подсказывал мне, какое регулярное выражение будет извлекать только электронные письма в массив...


Что-то вроде этого:


emails = recipients.scan(/.*@.*/) <<==== but i know that not right

ИЗМЕНИТЬ


Похоже, что-то вроде этого может работать. У кого-нибудь есть предложения, если это будет работать для особых случаев:


emails = recipients.scan(/[a-z0-9_.-]+@[a-z0-9-]+\.[a-z.]+/i)

спросил(а) 2021-01-19T17:39:32+03:00 9 месяцев, 1 неделя назад
1
Решение
102

ruby-1.9.3-p0 :055 >   a = '"Smith, Joe" <jsmith@example.com>, "Jackson, Joe" <jjackson@example.com>';
ruby-1.9.3-p0 :056 > b = a.scan(/<(.*?)>/).flatten
=> ["jsmith@example.com", "jjackson@example.com"]
ruby-1.9.3-p0 :057 > c = a.scan(/"(.*?)"/).flatten
=> ["Smith, Joe", "Jackson, Joe"]

Индекс имени/адреса электронной почты в каждом массиве одинаков, поэтому c [1] - это имя для b [1] email.


На основе вашего комментария, как насчет его:

ruby-1.9.3-p0 :008 > a = '"Smith, Joe" <jsmith@example.com>, "Jackson, Joe" <jjackson@example.com>';
ruby-1.9.3-p0 :009 > b = '"test@domain.com, test2@domain.com"';
ruby-1.9.3-p0 :010 > b.scan(/\w*@\w*\.\w*/)
=> ["test@domain.com", "test2@domain.com"]
ruby-1.9.3-p0 :011 > a.scan(/\w*@\w*\.\w*/)
=> ["jsmith@example.com", "jjackson@example.com"]

Это почти то же самое, что вы добавили в свой вопрос, просто более компактный.

ответил(а) 2021-01-19T17:39:32+03:00 9 месяцев, 1 неделя назад
91

Версия Kassym не удастся при любых обстоятельствах, в том числе на любых адресах электронной почты, содержащих не-словные символы (например, some.guy@gmail.com)


Разбор списков адресов электронной почты не может быть выполнен с помощью регулярных выражений. Используйте что-то с реальным парсером, например, mail gem:

require "mail"

Mail::AddressList.new(address_list).addresses.map(&:address)


EZ!

ответил(а) 2021-01-19T17:39:32+03:00 9 месяцев, 1 неделя назад
47

Вы можете попытаться разбить на следующее регулярное выражение


,(?=(?:[^"]*"[^"]*")*[^"]*$)

Altho это не оптимальное быстрое решение и может быть медленным для длинных строк, лучше использовать специализированный синтаксический анализатор. Цитированные кавычки могут быть проблемой с этим решением, в зависимости от того, как они экранируются (если вообще).

ответил(а) 2021-01-19T17:39:32+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема