Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Новости ИТ Программы Книги Games   Обои   Экспорт RSS E-Books
 
Поиск по сайту

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Xilisoft 3GP Video Converter v2.1.52.831b
Антивирус Касперского Personal 5.0.303 beta 2
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
MP3 To Ringtone Gold v3.02
Mobtime Cell Phone Manager v5.3.1
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

   Интернет технологии -> Perl -> Проверка e-mail адреса на существование


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

Я уже много раз слышал вопрос: "Как проверить 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";
    Вот в принципе и всё! Удачи!

    Автор: Skob
    Источник: www.cwg.ru

    Ссылки по теме
    Создание пакетов и модулей в Perl
    Счетчик посещений на Perl
    Бесполезный Perl и общая теория улучшения мира
    Использование шаблонов при программировании web-приложений в среде Perl
    PERL Вопросы и ответы ( FAQ )
    Безопасное программирование на языке Perl
    Практический Перл для начинающего
     

    Компьютерная документация от А до Я - Главная

     
    Популярные книги

    Технология программирования на C++. Начальный курс

    Подробнее

    SQL для "чайников", 5-е издание

    Подробнее

    Введение в ИТ Сервис-менеджмент

    Подробнее

     

     
    Новости ИТ
    21.11.2008  Thunderbird 2.0.0.18
    21.11.2008  Miranda IM 0.7.13
    21.11.2008  Dr. Web 5 Beta
    21.11.2008  KAV/KIS 2009 8.0.0.506
    21.11.2008  avast! 4.8 (1290)
    21.11.2008  Radmin 3.3
    21.11.2008  DVR-X162J - новый внешний DVD-привод от Pioneer
    21.11.2008  Дизайнерские системные блоки от Smooth Creations
    21.11.2008  SPARKLE представляет Calibre P980X+, видеокарту с необычным дизайном
    21.11.2008  Titan представляет куллер для Intel i7
    21.11.2008  Компактный ПК для дома Acer Aspire X3200 - в России
    21.11.2008  Hitachi Data Systems объявляет о новом плане инвестиций в России и странах СНГ
    21.11.2008  Назначен новый президент Microsoft в России
    21.11.2008  Mustek: новые цифровые видеокамеры начального уровня
    21.11.2008  Серверные Core i7 - быстры ли они? Да, и очень, судя по тестам в SPECfp
    21.11.2008  NETGEAR: акция для партнеров
    21.11.2008  Персональные фотокарты на Яндексе
    21.11.2008  Программа для стартапов Microsoft BizSpark анонсирована в России
    21.11.2008  Средства защиты от утечек конфиденциальных данных Symantec DLP 8.1 теперь и в России
    21.11.2008  Axis: первый 6-канальный IP-видеосервер с поддержкой H.264/M-JPEG
     
    Полезно

    зима уже близко, пора покупать тепловые завесы Dantex и тепловые пушки Veab, тел.795-5173
    деревянные окна москва
     
    Copyright © CompDoc.Ru
    При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
     
    Rambler's Top100