Forum Webscript.Ru
Программирование => Perl => Тема начата: 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 итд...
-
Поищи на этом же сайте в разделе перл-скриптов проверку валидности имэил - там все по косточкам разобрано.
-
Не нашел :( Может плохо искал, а может уже удалили :-(
-
Сделал сам! если кому нужно:
$email =~m/^([\\w,\\-,\\.]+\\@[\\w,\\-,\\.]+\\.\\w{2,4})/
-
На 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;
думаю разберёшься.
-
Ловите!!!
#!/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;
}
# Теперь делаем что угодно...
-
В догонку:
тут :D - : D
-
$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
Примерно, так... Извините, тут урезано не много, но как есть. Никто не знает почему, и как бороться?
-
Ardzhan, поищи на вебскрипте, среди статей. В ней как раз я и увидел впервые это регулярное выражение.
-
$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 адреса можно только одним путем - послать по нему e-mail и получить ответ.:))
-
А может не стоит изобретать велосипед? Регулярное выражения для проверки правильности синтаксиса e-mail адресов, которое _почти_ соответствует спецификации RFC 822, общеизвестно:
http://www.piter.com/bugs/5-318-00056-8/optimis.txt
-
Chs
Это-то ясно, имелось ввиду корректность...
получить ответ
Это тоже не выход... Ответа можно и не получить :)
-
Ответа можно и не получить
А разве те письма, которые не нашли адресата, не возвращаются отправителю?
ИМХО: Chs имел в виду получить ответ от регистрирующегося юзера.
Наример мы посылаем письмо с сылкой вида
ввв.сайт.ру/скрипт.цги?ид=1234566
Случайно генерируемое число, которое "запоминается" скриптом (записывается в файл). Если юзверь пришёл по ссылке то значит всё ок, если нет то делаем выводы...