Forum Webscript.Ru

Программирование => Perl => Тема начата: Ardzhan от 26 Июля 2002, 14:11:04

Название: Проверка e-mail
Отправлено: Ardzhan от 26 Июля 2002, 14:11:04
Такой код

print "Content-type: text/html\\n\\n";

$email="test\\@mail.ru";
if ( $email =~ m/(\\w+)\\@(\\w+\\.\\w+)/ ) {
     print "OK";
}else{
     print "Not Valid";
}
Не пашет он, зараза! Точнее если вставить некорректный символ в слово mail -выдает not valid (так и надо), а вот если в test или ru :mad:
Так тоже пробовал: $email =~ m/(\\w+)\\@(\\w+)\\.(w+)/ - та же лажа.
Помогите с регуляркой... :insane:
P.S. Должны допускаться адреса типа test@win.mail.ru, test@win.from.mail.ru итд...
Название: Проверка e-mail
Отправлено: Serchey от 26 Июля 2002, 14:19:06
Поищи на этом же сайте в разделе перл-скриптов проверку валидности имэил - там все по косточкам разобрано.
Название: Проверка e-mail
Отправлено: Ardzhan от 26 Июля 2002, 14:43:54
Не нашел :( Может плохо искал, а может уже удалили :-(
Название: Проверка e-mail
Отправлено: Ardzhan от 26 Июля 2002, 15:02:17
Сделал сам! если кому нужно:
$email =~m/^([\\w,\\-,\\.]+\\@[\\w,\\-,\\.]+\\.\\w{2,4})/
Название: Проверка e-mail
Отправлено: Alexandr от 26 Июля 2002, 15:25:14
На Perl не програмил, но вот Perl\'овская регулярка.
if (!preg_match("/^[a-z0-9_-]{1,20}@(([a-z0-9-]+\\.)+(com|net|org|mil|".
"edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\\.[0-9]{1,3}\\.[0-".
"9]{1,3}\\.[0-9]{1,3})$/is",$mail))
return -1;
return $mail;

думаю разберёшься.
Название: Проверка e-mail
Отправлено: Serchey от 26 Июля 2002, 15:50:47
Ловите!!!
#!/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 неправильного формата!
\\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 не обнаружен!
\\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 верный.
\\n";
}

# 550 5.7.1  user unknown
elsif ($rd =~ /^550/) {print "$email неверный.
\\n";$isvalid = 0;}

if ($isvalid) {
# Отправляем почту... (как это сделать читай ниже)
}
close $handle;
if (!$isvalid) {exit;}
}
else {
print "Не удалось подулкчиться к серверу!
\\n";
exit;
}
# Теперь делаем что угодно...
Название: Проверка e-mail
Отправлено: Serchey от 26 Июля 2002, 15:52:27
В догонку:
тут :D - : D
Название: Проверка e-mail
Отправлено: glebushka от 26 Июля 2002, 22:27:05
Цитировать
$email !~ /^[a-zA-Z_\\.-][a-zA-Z0-9_\\.-\\d]*\\@[a-zA-Z\\.-\\d]+\\.[a-zA-Z]{2,4}$/

Я тоже эту проверку использую...
Вот только у меня проблемка, с включённым флагам -w, Перл, хоть и работает, но огрызается:
False [] range "\\.-\\d" before HERE mark in regex m/^[a-zA-Z_\\.-][a-zA-Z0-9_\\.-\\
 << HERE ]*\\@[a-zA-Z\\.-\\d]+\\.[a-zA-Z]{2,4}$/ at c:\\intellectuals\\cgi-bin\\articu
.cgi line 75.
False [] range "\\.-\\d" before HERE mark in regex m/^[a-zA-Z_\\.-][a-zA-Z0-9_\\.-\\
]*\\@[a-zA-Z\\.-\\d << HERE ]+\\.[a-zA-Z]{2,4}$/ at
Примерно, так... Извините, тут урезано не много, но как есть. Никто не знает почему, и как бороться?
Название: Проверка e-mail
Отправлено: glebushka от 26 Июля 2002, 22:29:13
Ardzhan, поищи на вебскрипте, среди статей. В ней как раз я и увидел впервые это регулярное выражение.
Название: Проверка e-mail
Отправлено: Ardzhan от 27 Июля 2002, 16:06:18
Цитировать
$email !~ /^[a-zA-Z_\\.-][a-zA-Z0-9_\\.-\\d]*\\@[a-zA-Z\\.-\\d]+\\.[a-zA-Z]{2,4}$/

А зачем так? Если можно... Тут все пашет...
$email =~m/^([\\w,\\-,\\.]+\\@[\\w,\\-,\\.]+\\.\\w{2,4})/
\\w - разрешает все символы англ. алфавита и подчеркивание...
Название: Проверка e-mail
Отправлено: Chs от 28 Июля 2002, 22:23:46
ээээ Тема поднимается ну ни первый раз.... Результат обсуждения хотите? :)))
Проверить существование e-mail адреса можно только одним путем - послать по нему e-mail и получить ответ.:))
Название: Проверка e-mail
Отправлено: КшЫуфксрук от 29 Июля 2002, 12:07:31
А может не стоит изобретать велосипед? Регулярное выражения для проверки правильности синтаксиса e-mail адресов, которое _почти_ соответствует спецификации RFC 822, общеизвестно:

http://www.piter.com/bugs/5-318-00056-8/optimis.txt
Название: Проверка e-mail
Отправлено: Ardzhan от 29 Июля 2002, 22:31:01
Chs
Это-то ясно, имелось ввиду корректность...
Цитировать
получить ответ

Это тоже не выход... Ответа можно и не получить :)
Название: Проверка e-mail
Отправлено: glebushka от 29 Июля 2002, 22:57:34
Цитировать
Ответа можно и не получить

А разве те письма, которые не нашли адресата, не возвращаются отправителю?
ИМХО: Chs имел в виду получить ответ от регистрирующегося юзера.
Наример мы посылаем письмо с сылкой вида
ввв.сайт.ру/скрипт.цги?ид=1234566
Случайно генерируемое число,  которое "запоминается" скриптом (записывается в файл). Если юзверь пришёл по ссылке то значит всё ок, если нет то делаем выводы...