WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Проверка e-mail адреса на существование


Прислал: Skob [ 28.02.2002 @ 11:52 ]
Раздел:: [ Статьи по Perl ]


Я уже много раз слышал вопрос: "Как проверить e-mail на существование?". Видел на них много ответов, но во всех было сказано, что проверить никак нельзя, предлагались только обходные пути, такие как отправка письма для подтверждения. Однако, я попытаюсь решить эту проблему.
Для проверки на существование будем делать следующее:
  • Проверка на синтаксическую верность адреса
  • Проверка существования почтового домена в DNS
  • Проверка на доступность сервера
  • Проверка существования аккаунта на сервере
Да, мой вариант решения тоже не идеален и стопроцентной гарантии не даёт, но все же даёт хороший результат!
Начнём с того, что в первой половине e-mail адреса могут присутствовать только цифры, латинские буквы, точка, тире и знак подчёркивания, прицем начианться адрес должен с буквы. В домене могут быть только цифры, латинские буквы, тире и точки. Проверить на соответствие такому формату в перле можно следующим образом:
$email = 'email@address.com';
if ($email =~ /^[a-zA-Z_\.-][a-zA-Z0-9_\.-\d]*\@[a-zA-Z\.-\d]+\.[a-zA-Z]{2,4}$/) {
# действия, выполняемые если e-mail верный
}
else {
# действия, выполняемые если e-mail НЕверный
}
Это была самая простая часть, теперь же, попробуем узнать, существует ли почтовый домен или нет?
Для этого нам понадобится немного кофе, сигареты и библиотека Net::DNS.
Для чего нужны первые два компонента и как ими пользоваться, вы, я думаю, знаете, меня же больше интересует третий компонент. Если кто не знает для чего нужен DNS, кратко оъясняю... Если ваш почтовый адрес my-name@my-e-mail-server.com, то это вовсе не значит, что почта, отправляемая на этот адрес будет получена сервером my-e-mail-server.com. Для того чтобы узнать, какой сервер должен получить эту почту существуют DNS сервера, в которых хранятся MX (Mail eXchange) записи. Для того чтобы получить их от сервера и нужна библиотека Net::DNS. Вот как это делается:
#!/usr/bin/perl
use Net::DNS;

$email = 'email@address.com';
$dns = "212.164.166.11";        # DNS Сервер

$res = new Net::DNS::Resolver;
$res->nameservers($dns);

print "Content-type: text/html; charset=windows-1251\n\n";

$email =~ /.*\@(.*)$/;
$domain = $1;

my @mx = mx($res, $domain);
if (@mx) {
my $rr = shift(@mx);
my $mxserver = $rr->exchange;
print "Сервер для $email: $domain";
}
else {
print "Не удалось определить сервер для $email";
}
Этот небольшой скрипт попытается определить сервер для почтового адреса. Ну вот, теперь, если кто-то ввёл от балды e-mail вида asd@fgh.jkl, то скрипт может отреагировать на это, например, попросить ввести правильный e-mail. Но такая проверка не даёт 100 процентной гарантии того, что e-mail юудет введён верно, так как домен для адреса no-such-account@mail.ru будет найден, но такого аккаунта на почтовом сервере не существует.
Что же делать? Заодно объеденим скрипт с предыдущими проверками.
#!/usr/bin/perl
use Net::DNS;
use IO::Socket;
use CGI::Carp qw(fatalsToBrowser);

my $email = 'my@mail.ru';
my $emailfrom = 'email@address.com';

print "Content-type: text/html; charset=windows-1251\n\n";

############################################################
############################################################
############################################################

if ($email !~ /^[a-zA-Z_\.-][a-zA-Z0-9_\.-\d]*\@[a-zA-Z\.-\d]+\.[a-zA-Z]{2,4}$/) {
print "e-mail неправильного формата!<br>\n";
exit;
}

############################################################
############################################################
############################################################

my $dns = "212.164.166.11";        # DNS Сервер

my $res = new Net::DNS::Resolver;
$res->nameservers($dns);

$email =~ /.*\@(.*)$/;
my $domain = $1;

my @mx = mx($res, $domain);
if (!@mx) {
print "Сервер для домена $domain не обнаружен!<br>\n";
exit;
}

my $rr = shift(@mx);
my $mxserver = $rr->exchange;

############################################################
############################################################
############################################################

my $handle = IO::Socket::INET->new(
Proto  => "tcp",
PeerAddr  => $mxserver,
PeerPort  => 25);

if ($handle) {
$handle->autoflush(1);
print $handle "HELO $mxserver\n";
print $handle "MAIL FROM: $emailfrom\n";
my $stype = 0;
my $regged = 0;
my $isvalid = 1;
$email =~ /^([a-z$ch2]+)\@([a-z$ch]+\.[a-z]{2,4})$/;
my ($em,$eh) = ($1,$2);
if ($stype) {
print $handle "RCPT TO: $email\n";
}
else {
print $handle "VRFY $em\n";
}
cycle:
my $rd = <$handle>;
chomp($rd);
# Hello From Server
if ($rd =~ /^220/) {goto cycle;}

# HELO Reply
elsif ($rd =~ /^250 \S+ hello/i) {goto cycle;}

# MAIL FROM Reply
elsif ($rd =~ /^250/i && !$regged) {$regged = 1;goto cycle;}

# Unknown command 'VRFY *'
# VRFY not available
elsif (($rd =~ /^252/ || $rd =~ /^550 5\.5\.2/ || $rd =~ /^502/) && !$stype) {
$stype = 1;print $handle "RCPT TO: $email\n"; goto cycle;
}

# 250 
  • verified # 250
  • , Recipient ok # 250 ok # 250 2.1.5 * # В принципе, можно, да и правильне будет просто 250 *, но при таком # корявом написании скрипта так будет надежней elsif ($rd =~ /^250 <\S+> verified/i || $rd =~ /^250 <\S+>,? recipient ok/i || $rd =~ /^250 ok/i || $rd =~ /^250 2\.1\.5/i) { print "$email верный.<br>\n"; } # 550 5.7.1 user unknown elsif ($rd =~ /^550/) {print "$email неверный.<br>\n";$isvalid = 0;} if ($isvalid) { # Отправляем почту... (как это сделать читай ниже) } close $handle; if (!$isvalid) {exit;} } else { print "Не удалось подулкчиться к серверу!<br>\n"; exit; } # Теперь делаем что угодно...
  • Этот способ позволит при помощи сервера узнать, существует ли такой e-mail или нет. Хотя не все сервера сообщают об этом, но теперь, по крайне мере в большинстве случаев вы сможете определить что e-mail неверный.

    Вообще, проверка на валидность может понадобиться вам при регистрации пользователей в вашей системе. Если необходимо после регистрации отправить письмо на зарегестрированыый адрес, то это можно сделать сразу же после проверки. Это значительно сократит время работы скрипта. Для того чтобы отправить почту вам будет необходимо вставить в скрипт следующие строки:
        if (!$stype) {
    print $handle "RCPT TO: $email\n";
    }
    print $handle "DATA\n";
    # Выводим заголовки
    print $handle "From: <$emailfrom>\n";
    print $handle "To: <$email>\n";
    print $handle "Subject: Test letter\n\n";
    # Печатаем текст письма
    print $handle "Hello! It is test!\n";
    # Одиночная точка - знак того что письмо закончилось
    print $handle ".\n";
    Вот в принципе и всё! Удачи!


     :::::  Dmytro Fadeyenko пишет 01.03.2002 @ 20:39 
    Как минимум одна ошибка - в строке

    if ($email =~ /^[a-zA-Z_\.-][a-zA-Z0-9_\.-\d]*\@[a-zA-Z\.-\d]+\.[a-zA-Z]{2,4}$/) {

    Мне известен по крайней мере один реально действующий адрес, в котором НЕТ ни одной точки.

    ps: чтобы отправить это, мне пришлось запускать IE. Почему ваша система публикации отзывов не работает с NN?


     :::::  LN пишет 01.03.2002 @ 21:05 
    Зачем городить такой огород???
    Есть более простой вариант:
    #!/usr/local/bin/perl -w
    use Net::SMTP;
    $smtp = Net::SMTP->new('mailhost');
    $smtp->verify ( ADDRESS );

    примерно так. Правда будет работать только если почтовый сервер поддерживает функцию veify.

     :::::  Чужой пишет 01.03.2002 @ 21:40 
    Начнём с того, что в первой половине e-mail адреса могут присутствовать только цифры, латинские буквы, точка, тире и знак подчёркивания, прицем начианться адрес должен с буквы. В домене могут быть только цифры, латинские буквы, тире и точки.
    ---------------------------------------
    Вообще-то я сам своими глазами видел название почтового ящика вида: вася@yandex.ru (это пример). Так что может и не прокатить...
     :::::  Steve пишет 02.03.2002 @ 08:05 
    Привет, а действительно зачем весь огород?
    use Email::Valid;
     :::::  Skob пишет 02.03.2002 @ 19:43 
    2Dmytro Fadeyenko: Привиди пример email'a без точки... Если такие и существуют, то это локальные...

    2LN: А если нет VRFY?

    2Чужой: А писать ты по такому адресу пробовал?
    Пробую писать на такой адрес, получаю ответ от сервера:
    500 5.5.2 Illegal input characters: Control chars on SMTP input
    не хочет он такое принять!!!

    2Steve: Email::Valid не входит в стандартный набор модулей Perl.
    Зачем усложнять себе работу установкой этого модуля на сервер... А если я написал скрипт для продажи? Мне нужно объяснять клиенту как этот модуль поставить?
     :::::  Dmytro Fadeyenko пишет 03.03.2002 @ 23:05 
    Все адреса локальны... Этот - в пределах интернета. :)

    Оный e-mail имеет вид xy@ua (я обозначил под x и y несколько другие буквы, чтобы никто не беспокоил обладателя сего мыла лишний раз) :)

    Ибо кто помешает tech-c домена первого уровня выдать мыло в оном домене? Ни один RFC это не запрещает. В отличие применения от кириллицы в оных адресах...


     :::::  Costezzo пишет 06.03.2002 @ 16:01 
    Компьюсервовские адреса начинаются с цифры (там в левой части только цифры и точки).
     :::::  alf пишет 12.03.2002 @ 09:22 
    Есть и другой вариант.
    use Mail::CheckUser;
    Но он тоже не входит в стандартную конфигурацию :( IMHO

     :::::  Chs пишет 12.03.2002 @ 14:09 
    В итоге приходим к тому с чего начали: на 100% проверить существование e-mail можно только одним способом - отправив на него письмо и получив ответ (при регистрации на сайте, например).
    А все остальное - упражнения в программирование, в которых пытаються переписать существующие модули.
    Изобретаем велосипед, итерация n-ная....

     :::::  Ese пишет 19.03.2002 @ 18:30 
    А мона так синтаксис проверить
    $email="sss@nnn.ru";
    ($em1,$em2)=split(/\@/,$email);
    if ($em1 eq "" or $em2 eq ""){&error}
    else {&ok}
     :::::  Александр пишет 21.03.2002 @ 18:53 
    Имеет ли смысл делать такие проверки? Ведь кто угодно может
    подписать сообщение адресом типа admin@webscript.ru
    Т.е e-mail существует, но принадлежит другому человеку.
     :::::  makut пишет 25.03.2002 @ 18:46 
    Не вижу смысла в конструкции:
    if ($stype) {
    print $handle "RCPT TO: $email\n";
    } else {
    print $handle "VRFY $em\n";
    }

    Т.к. перед этим $stype присваивается 0, и далее нигде не меняется. Возможно что-то недописано.

     :::::  makut пишет 25.03.2002 @ 18:50 
    Хотя по идее должно работать, если cycle: поставить перед, а не после конструкции.
     :::::  Борис пишет 12.04.2002 @ 12:34 
    Тема очень интересная, проверка подлинности email, не на всех серверах есть verify и остается тема открытой Как проверить адрес на подленность существования адреса,
    исключим провекру на синтаксис,
    исключим вариант чужой адрес.
    И поставим строго вопрос:
    Как проверить адрес эл. почты не посылая письма?

     :::::  arto пишет 25.04.2002 @ 18:41 
    никак не проверить существование e-mail не посылая на него письмо и не прося ответить.
     :::::  MayVortex пишет 25.11.2002 @ 08:35 
    Кто сказал, что никак не проверить подлинность e-mail?
    На счёт стандартности NET:POP3 не уверен, может ставил сам, но так давно, что уже и не помню... А если на продажу - так кто мешает дописать install скрипт и в нём прописать установку всего что угодно, куда угодно?

    ===cut===
    #!/usr/bin/perl
    use NET::POP3;
    use CGI

    $mailbox = Net::POP3->new("mail.dinfo.ru");

    $doc = CGI::new();

    $login = $doc->param('login'); #принимаем данные из некой формы
    $passwd = $doc->param('passwd');
    $ip = $ENV{'REMOTE_ADDR'}; #на всяк пожарный :::)

    $count = $mailbox->login($login, $passwd); #Если всё ок - в $count будет количество
    #писем или 0E0 если их там 0. Если не ок - то будет пусто (undef)
    $notconnected = 0;

    $Size = $mailbox->list() or $notconnected = 1; #чтобы со всякими if'ами не парится,
    #проверяем вот таким хитрым образом

    if ($notconnected == 0)
    {
    # Если всё прошло успешно делаем что угодно
    }
    else
    {
    # Значит что-то юзер не знает, может пароль не тот, может логин
    }
    ===cut===
     :::::  Ilia Vinokurov пишет 11.12.2002 @ 12:40 
    Проверить синтаксис мона таким способом:
    $RFC822PAT = <<'EOF';
    [\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\
    xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xf
    f\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\x
    ff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015
    "]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\
    xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80
    -\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*
    )*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\
    \\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\
    x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x8
    0-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n
    \015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x
    80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^
    \x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040
    \t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([
    ^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\
    \\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\
    x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-
    \xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()
    ]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\
    x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\04
    0\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\
    n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\
    015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?!
    [^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\
    ]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\
    x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\01
    5()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".
    \\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]
    )|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^
    ()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\0
    15()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][
    ^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\
    n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\
    x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?
    :(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-
    \xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*
    (?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015
    ()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()
    ]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\0
    40)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\
    [^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\
    xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*
    )*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80
    -\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x
    80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t
    ]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\
    \[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])
    *\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x
    80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80
    -\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015(
    )]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\
    \x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t
    ]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\0
    15()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015
    ()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(
    \040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|
    \\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80
    -\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()
    ]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x
    80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^
    \x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040
    \t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".
    \\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff
    ])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\
    \x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x
    80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015
    ()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\
    \\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^
    (\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-
    \037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\
    n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|
    \([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))
    [^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff
    \n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\x
    ff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(
    ?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\
    000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\
    xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\x
    ff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)
    *\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\x
    ff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-
    \xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)
    *(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\
    ]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]
    )[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-
    \xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\x
    ff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(
    ?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80
    -\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<
    >@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x8
    0-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:
    \([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]
    *(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)
    *\)[\040\t]*)*)*>)
    EOF
    $RFC822PAT =~ s/\n//g;

    А вот MX сервера "выковыривать" и определять их IP адреса лучше nslookup`ом, так как в сотни раз быстрее будет, нежели с помощью Net::DNS :) $resp = `nslookup %$%$%^`;

    А проверить существование почтового ящика можно и без функции VRFY. Нужно подать SMTP серверу команду на прием почтового сообщения (если юзера нет, сервер даст "отлуп") и после дать команду QUIT (DATA не давать).

    Знающий, да поймет ход мысли :)

    PS: Предупреждение о том, что мой E-Mail опубликован не будет - ТУФТА, так как просмотрев страницу в виде HTML, я обнаружил строки, типа:
    http://www.webscript.ru/profiles.php3?Author=arto&AuthorEmail=neghe+jrofpevcg.eh@avvs.fco.fh&AuthorURL=
    В которых мой E-Mail светится в явном виде и элементарно собирается всевозможными сборщиками :)))
     :::::  ironic пишет 08.02.2003 @ 11:24 
    А таки мыло светиться!!! И ничегошеньки они не починили!!!
     :::::  Michael Sakai пишет 31.03.2003 @ 07:03 
    >А проверить существование почтового ящика можно и без функции VRFY. Нужно подать SMTP >серверу команду на прием почтового сообщения (если юзера нет, сервер даст "отлуп") и после >дать команду QUIT (DATA не давать).

    Угу. А теперь делаем TELNET mail.ru 25 и наблюдаем, как сервер бодро рапортует "250 Accepted" на любой адрес вида "dghkdfsgsadf@mail.ru".

     :::::  Nick пишет 04.05.2003 @ 16:00 
    Ребят, зачем мучаться.... есть хороший модуль, написанный Ильёй Мартыновым(Ilya Martynov, http://martynov.org), называется этот модуль Mail::CheckUser и решает эти задачи. Этот модуль доступен через CPAN. В общем... зачем изобретать велосипед?
    Подробнее - здесь: http://martynov.org/checkuser/
     :::::  Игорь пишет 16.07.2003 @ 02:58 
    FOR NICK

    Я думаю дело не в том что есть еще какие - то модули, если уж на то пошло, то есть высокоскоростные программы для этого, что косается твоего Мартынова, так ты занимаешься раскруткой его бренда(сайта, и его имени)! Молодец, может это ты и есть>?

    Это написали для того чтобы понять принцип работы, а не значение этого принципа... Такие как ты и останутся уже с готовыми продуктами*(велосипедами!!!), ...


     :::::  IlyaM пишет 18.07.2003 @ 21:21 
    Re: Игорь

    Я обычно всегда от своего имени пишу. Интересно чего там раскручивать то? :) Деньги я же на этом софте и сайте не делаю. Впрочем, чтобы закрыть тему позволю себе дать релевантную ссылку на perlfaq: http://search.cpan.org/author/JHI/perl-5.8.1-RC2/pod/perlfaq9.pod#How_do_I_check_a_valid_mail_address_
     :::::  DMakeev пишет 21.08.2003 @ 00:21 
    Хм... ИМХО, проблема не решаема по своей сути, поскольку явные и неявние средства SMTP проверки адресов предусмотрительно отключаются держателями большинства почтовых серверов. Дабы не сканили. На мой взгляд, не стоит ломиться лбом в стену. Если вопрос существования мыльника принципиален (скажем, с точки зрения безопасности), то для пользователя не будет проблемой получить письмо с запросом подтверждения, собсно, подтвердить, иначе достаточно простой проверки синтаксиса.

    Проверка DNS также не функциональна, поскольку, если человек не намерен вводить свой адрес, его нен сильно затруднит указать несуществующий адрес на реальеном почтосервере. Нет, конечно, можно польстить своему самолюбию, но стоит ли из-за этого грузить сервер и канал?. К тому же, эта проверка, насколько я понимаю, довольно медленна, а, значит, может служить инструментом для DOS-атаки :) (с натяжкой, конечно, но может).
     :::::  Druid пишет 24.09.2003 @ 18:39 
    А зачем проверять e-mail?
    Если регистрация, то надо отправлять письмо все равно, а если просто указание e-mail, то никому не мешает указать чужой.
    Так что смысла нет.
     :::::  tatarin пишет 11.01.2005 @ 00:32 
    Привет вот вы все пишете о многих способах но вот кто сможет помоч мне и вышлет либо готовый рабочий проэкт либо описание как и что делать потому что в перле о пхп я 0,0000001
    так что не откажите бедняге
    Но мне просто необходимо проверить пару сотен адресов
    Зарание благодарен
    tatarin7@mail.ru
     :::::  guest пишет 20.09.2011 @ 18:57 
    Тут можите посмотреть прикреплённый файл. Там php скрипт проверки адреса электронной почты в 3 этапа:
    http://www.easy2code.com/ru/notes/view/proverka_e-mail_adresa_na_suschestvovanie/
    Имя:
    Email:
    URL

    Введите сумму двух чисел девять и одинн (девять+одинн=?)
    Запомнить мою информацию

    * Html запрещен* Ваш E-mail опубликован не будет.

    Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
    Design © 2001 by Parallax Design Studio (aka Spectator.ru)
    Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
    Сгенерировано за: 0.0255830