Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Допустим, адрес Боба — bob@smith.com. Плюс-адрес можно сделать, добавив + и метку после него: bob+spam@smith.com. Если Боб зарегистрируется на сайте со вторым адресом, он всё равно будет получать письма на bob@smith.com – но теперь он может создать фильтры, или просто отключить один из плюс-адресов.
Следовательно — и благодаря длинной череде проблем, вызванных промежуточными хостами, пытавшимися оптимизировать передачу путём изменения их [адресов — перев.], локальная часть ДОЛЖНА быть интерпретирована (и ей должен быть назначен семантический смысл) исключительно сервером, указанным в доменной части адреса.
The local-part portion is a domain-dependent string. In addresses,
it is simply interpreted on the particular host as a name of a
particular mailbox.
/etc/postfix/main.cf имеет:# ADDRESS EXTENSIONS (e.g., user+foo)
#
# The recipient_delimiter parameter specifies the separator between
# user names and address extensions (user+foo). See canonical(5),
# local(8), relocated(5) and virtual(5) for the effects this has on
# aliases, canonical, virtual, relocated and .forward file lookups.
# Basically, the software tries user+foo and .forward+foo before
# trying user and .forward.
#
#recipient_delimiter = +recipient_delimiter) он считает user@domain и user+tag@domain разными адресами.А коли и так, то хотя бы и для gmail'а...
example@gmail.com совпадает с e.x.a.m.p.l.e@gmail.com. Но это не значит, что также делают остальные. Но это не повод для очередной статьи-откровения на хабре, ИМХО.Вы можете сказать, в какой ситуации необходима поддержка полного RFC для почтовых адресов?
Когда ты отправляешь письмо, оно проходит через два сервера.
Полностью поддерживать стандарт просто ради того чтобы его поддерживать бессмысленно
локальная часть ДОЛЖНА быть интерпретирована (и ей должен быть назначен семантический смысл) исключительно сервером, указанным в доменной части адреса.
То, что невозможно проверить емейл на допустимость с помощью регулярок — это понятно.
^(.+)@(.+)\.(.+)$^.+@.+\..+$Даже если это регулярное выражение будет работать правильно, лучше от него отказаться и написать обычную процедуру. Нет, ну серьезно, вы только представьте, что у вас обнаружился баг и вы подозреваете, что проблема в регулярном выражении. И вот вам надо найти в нем ошибку. Сколько часов это займет?
^\S+@\S+\.\S+$. Ой Постойте. А как же test@example.com test1@example.com (Не знаю как отобразится, но между двумя адресами должен быть перенос сторки). Такой адрес тоже пройдет. Ну тогда надо \A\S+@\S+\.\S+\z. Это кстати не выдуманные, а примеры из жизни.Например пробел внутри адреса достаточно распространенная проблема чтоб все-таки ловить.Я вот, честно говоря, в этом не убеждён. Я не утверждаю, что такого никогда не случается, но понятие «достаточно распространённая» слишком уж расплывчатое. Нужно смотреть какую-то реальную статистику.
но, как раз в практическом плане, такой адреса будет невалиднымКазалось бы, человек читал статью…
страшного regexp'а из RFC822
/^[^()<>@,;:\\".\[\] \000-\037\177*&]+(\.[^()<>@,;:\\".\[\] \000-\037\177*&]+)*@[^()<>@,;:\\".\[\] \000-\037\177*&]+(\.[^()<>@,;:\\".\[\] \000-\037\177*&]+)*$/iuse Test;
use strict;
BEGIN { plan tests => 88 };
my $mail_reg = qr/^[^()<>@,;:\\".\[\] \000-\037\177*&]+(\.[^()<>@,;:\\".\[\] \000-\037\177*&]+)*@[^()<>@,;:\\".\[\] \000-\037\177*&]+(\.[^()<>@,;:\\".\[\] \000-\037\177*&]+)*$/i;
#my $mail_reg = qr/^[a-z0-9\-]+(\.[a-z0-9\-]+)*@[a-z0-9\-]+(\.[a-z0-9\-]+)*$/i;
ok(test('Test@test.ru'), 1);
ok(test('test@a.a'), 1);
ok(test('---@example.com'), 1);
ok(test('root@localhost'), 1);
ok(test('foo-bar@example.net'), 1);
ok(test('mailbox.sub1.sub2@this-domain'), 1);
ok(test('sub-net.mailbox@sub-domain.domain'), 1);
ok(test('Neuman@BBN-TENEXA'), 1);
ok(test('Русский@русский'), 1);#поменять на 0, если используется вторая регулярка
###Всё остальное не проходит###
ok(test('test@aa..aa'), 0);
ok(test('a..a@aa.aa'), 0);
ok(test('.aa@aa.aa'), 0);
ok(test('aa.@aa.aa'), 0);
ok(test('aa@aa.aa.'), 0);
ok(test('aa@.aa.aa.'), 0);
ok(test('.@aa.aa.'), 0);
ok(test('a@.'), 0);
ok(test('.@.'), 0);
ok(test('.@..'), 0);
ok(test('..@..'), 0);
ok(test('ab[]igail@example.com'), 0);
ok(test('ab\[\]igail@example.com'), 0);
ok(test('this is string'), 0);
ok(test('abigail@example.com '), 0);
ok(test(' abigail@example.com'), 0);
ok(test('abigail @example.com'), 0);
ok(test('*@example.net'), 0);
ok(test('"\""@foo.bar'), 0);
ok(test('fred&barny@example.com'), 0);
ok(test('"127.0.0.1"@[127.0.0.1]'), 0);
ok(test('Abigail <abigail@example.com>'), 0);
ok(test('Abigail<abigail@example.com>'), 0);
ok(test('Abigail<@a,@b,@c:abigail@example.com>'), 0);
ok(test('"This is a phrase"<abigail@example.com>'), 0);
ok(test('"Abigail "<abigail@example.com>'), 0);
ok(test('"Joe & J. Harvey" <example @Org>'), 0);
ok(test('Abigail <abigail @ example.com>'), 0);
ok(test('Abigail made this < abigail @ example . com >'), 0);
ok(test('Abigail(the bitch)@example.com'), 0);
ok(test('Abigail <abigail @ example . (bar) com >'), 0);
ok(test('Abigail < (one) abigail (two) @(three)example . (bar) com (quz) >'), 0);
ok(test('Abigail (foo) (((baz)(nested) (comment)) ! ) < (one) abigail (two) @(three)example . (bar) com (quz) >'), 0);
ok(test('Abigail <abigail(fo\(o)@example.com>'), 0);
ok(test('Abigail <abigail(fo\)o)@example.com>'), 0);
ok(test('(foo) abigail@example.com'), 0);
ok(test('abigail@example.com (foo)'), 0);
ok(test('"Abi\"gail" <abigail@example.com>'), 0);
ok(test('abigail@[example.com]'), 0);
ok(test('abigail@[exa\[ple.com]'), 0);
ok(test('abigail@[exa\]ple.com]'), 0);
ok(test('":sysmail"@ Some-Group. Some-Org'), 0);
ok(test('Muhammed.(I am the greatest) Ali @(the)Vegas.WBA'), 0);
ok(test('name:;'), 0);
ok(test('\':;'), 0);
ok(test('name: ;'), 0);
ok(test('Alfred Neuman <Neuman@BBN-TENEXA>'), 0);
ok(test('"George, Ted" <Shared@Group.Arpanet>'), 0);
ok(test('Wilt . (the Stilt) Chamberlain@NBA.US'), 0);
ok(test('Cruisers: Port@Portugal, Jones@SEA;'), 0);
ok(test('$@[]'), 0);
ok(test('*()@[]'), 0);
ok(test('"quoted ( brackets" ( a comment )@example.com'), 0);
ok(test(qq {"Joe & J. Harvey"\x0D\x0A <ddd\@ Org>}), 0);
ok(test(qq {"Joe &\x0D\x0A J. Harvey" <ddd \@ Org>}), 0);
ok(test(qq {Gourmets: Pompous Person <WhoZiWhatZit\@Cordon-Bleu>,\x0D\x0A}), 0);
ok(test(qq { Childs\@WGBH.Boston, "Galloping Gourmet"\@\x0D\x0A}), 0);
ok(test(qq { ANT.Down-Under (Australian National Television),\x0D\x0A}), 0);
ok(test(qq { Cheapie\@Discount-Liquors;}),0);
ok(test('Just a string'), 0);
ok(test('string'), 0);
ok(test('(comment)'), 0);
ok(test('()@example.com'), 0);
ok(test('fred(&)barny@example.com'), 0);
ok(test('fred\ barny@example.com'), 0);
ok(test('Abigail <abi gail @ example.com>'), 0);
ok(test('Abigail <abigail(fo(o)@example.com>'), 0);
ok(test('Abigail <abigail(fo)o)@example.com>'), 0);
ok(test('"Abi"gail" <abigail@example.com>'), 0);
ok(test('abigail@[exa]ple.com]'), 0);
ok(test('abigail@[exa[ple.com]'), 0);
ok(test('abigail@[exaple].com]'), 0);
ok(test('abigail@'), 0);
ok(test('@example.com'), 0);
ok(test('phrase: abigail@example.com abigail@example.com ;'), 0);
#ok(test('invalidЈchar@example.com'), 0);
ok(test(qq {"Joe & J. Harvey"\x0A <ddd\@ Org>}), 0);
# Invalid, CR LF not followed by a space.
ok(test(qq {"Joe &\x0D\x0AJ. Harvey" <ddd \@ Org>}), 0);
# This appears in RFC 822, but ``Galloping Gourmet'' should be quoted.
ok(test(qq {Gourmets: Pompous Person <WhoZiWhatZit\@Cordon-Bleu>,\x0D\x0A} .
qq { Childs\@WGBH.Boston, Galloping Gourmet\@\x0D\x0A} .
qq { ANT.Down-Under (Australian National Television),\x0D\x0A} .
qq { Cheapie\@Discount-Liquors;}), 0);
# Invalid, only a CR, no LF.
ok(test(qq {"Joe & J. Harvey"\x0D <ddd\@ Org>}), 0);
sub test {
my $mail = shift;
return ($mail ~~ $mail_reg) ? 1 : 0;
}А для чего сохраняем? Чтобы слать различные коммерческие предложения, извещения об акциях, и т.д. Иными словами слать рекламу.
Postgres Professional
Приглашаю вас к прочтению этой статьи в связи с попыткой валидации вашим сайтом postgrespro.ru моего адреса вида user+postgrespro.ru@gmail.com
Невозможно проверить адрес e-mail на допустимость с помощью регулярных выражений