Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Проверка E-mail


Автор: MeIsGremlin 7.4.2006, 23:12
Доброго времени суток, Кто знает как проверить при помощи php существование почтового адреса? То есть мне просто нужно знать существует он или нет. Пару классов которые я отрыл подсоединяются к нему через imap и там нужен пароль. Что в общем не то что мне нужно.

Автор: Danox 8.4.2006, 13:29
Функция проверки существования сервера в введенном адресе электронной почты
Cepera:
Код

function checkemailserver($email) {
 if (eregi("^[_\.0-9a-z-]+@([0-9a-z][-0-9a-z\.]+)\.([a-z]{2,3}$)", $email, $check)) {
  if (getmxrr($check[1].".".$check[2],$temp)) return true;
  else return false;
 }
 else return false;
}

Автор: ZlojEzh 8.4.2006, 13:39
если помимо существования хоста надо проверить еще и существование такого пользователя - можно законнектиться через smtp и дать серверу комманду
Код

VRFY _user_name_


варианты ответа сервера можно посмотреть http://www.ietf.org/rfc/rfc0821.txt

Автор: MeIsGremlin 10.4.2006, 15:48
Цитата(Danox @ 8.4.2006, 13:29)
Функция проверки существования сервера в введенном адресе электронной почты
Cepera:
Код

function checkemailserver($email) {
 if (eregi("^[_\.0-9a-z-]+@([0-9a-z][-0-9a-z\.]+)\.([a-z]{2,3}$)", $email, $check)) {
  if (getmxrr($check[1].".".$check[2],$temp)) return true;
  else return false;
 }
 else return false;
}

Эта функция просто проверяет есть ли mail.ru например. Но а как проверить есть ли какой-то user@mail.ru ?
Добавлено @ 15:53
Цитата(ZlojEzh @ 8.4.2006, 13:39)
если помимо существования хоста надо проверить еще и существование такого пользователя - можно законнектиться через smtp и дать серверу комманду
Код

VRFY _user_name_


варианты ответа сервера можно посмотреть http://www.ietf.org/rfc/rfc0821.txt

Эта команда может быть отключена. И подсоединиться к smtp кажется можно в php при помощи imap_open? правильно ? Но опять же нужен пароль.

Автор: ZlojEzh 10.4.2006, 19:40
Цитата(MeIsGremlin @ 10.4.2006, 15:48 Найти цитируемый пост)
И подсоединиться к smtp кажется можно в php при помощи imap_open?

я бы все через сокеты делал

коннектишься на порт smtp
и пытаешься послать письмо пользователю, имя которого надо проверить:

Код

S: MAIL FROM:<здесь вписываем какой-нить емейл адрес>
R: 250 OK

S: RCPT TO:<здесь подставляем проверяемы мейл>


в ответ получаешь одну из следующих строк
Код

R: 250 OK
R: 251 User not local; will forward to <_ куда-то там _>
R: 551 User not local; please try <_ чего-то там _>

Автор: MeIsGremlin 10.4.2006, 19:59
Надо будет попробовать.

Автор: MeIsGremlin 11.4.2006, 22:43
Цитата(ZlojEzh @ 10.4.2006, 19:40)
Цитата(MeIsGremlin @  10.4.2006,  15:48 Найти цитируемый пост)
И подсоединиться к smtp кажется можно в php при помощи imap_open?

я бы все через сокеты делал

коннектишься на порт smtp
и пытаешься послать письмо пользователю, имя которого надо проверить:

Код

S: MAIL FROM:<здесь вписываем какой-нить емейл адрес>
R: 250 OK

S: RCPT TO:<здесь подставляем проверяемы мейл>


в ответ получаешь одну из следующих строк
Код

R: 250 OK
R: 251 User not local; will forward to <_ куда-то там _>
R: 551 User not local; please try <_ чего-то там _>

А можно небольшой пример этого? Я так понял нужно на какой-то свой сервер подключатсья и от туда отправлять запросы. А есть что-то менее хитрозакрученное?

Автор: ZlojEzh 12.4.2006, 01:19
вот, накатал сходу
еще не проверял
Код

$email = "test@test.ch" // ;-)
list($login,$server) = explode('@',$email);
$fp = fsockopen($server, 25, $errno, $errstr, 30);
if (!$fp) {
   die("$errstr ($errno)<br />\n");
} else {
   fwrite($fp,'MAIL FROM:<me@mydomain.com>');
   fgets($fp);
   fwrite($fp,'RCPT TO:<'.$email.'>');   
   $resp = fgets($fp);
   if (preg_match("#250#A",$resp)) {
      print "e-mail ok\n";
   } else {
      print "e-mail bad\n";
   }
   fclose($fp);
}


только сейчас заметил одну проблему - реальное имя смтп-сервера может не совпадать со второй частью емейла
как бороться, пока не знаю...

Автор: MeIsGremlin 13.4.2006, 17:57
Смотри что получается

telnet smtp.mail.ru 25
Trying 194.67.23.111...
Connected to smtp.mail.ru.
Escape character is '^]'.
220 mail.ru ESMTP Thu, 13 Apr 2006 18:45:48 +0400
helo smtp.mail.ru
250 mx5.mail.ru Hello smtp.mail.ru [217.77.214.110]
auth login
334 VXNlcm5hbWU6
ZXRvIG1vZSBtaWxv
334 UGFzc3dvcmQ6
QSB4eWkgdGViZQ==
235 Authentication succeeded
helo smtp.mail.ru
250 mx5.mail.ru Hello smtp.mail.ru [217.77.214.110]
MAIL FROM:user@mail.ru
250 OK
RCPT TO:popa@geeksforless.net
250 Accepted
Data
354 Enter message, ending with "." on a line by itself
hello man
.
250 OK id=1FU36d-000MxY-00
quit

После этого приходит mail delivery system ко мне на user@mail.ru ну эт что мне теперь парсить новые сообщения и смотреть не mail delivery system ли они? как-то неправильно. Да и таких как прийдет. Ящика не хватит
Обратил внимаение на
RCPT TO:popa@geeksforless.net
250 Accepted
Оно его приняло.

Автор: ZlojEzh 13.4.2006, 21:27
коннектиться надо не на свой smtp-сервер, а на тот, где надо ящик проверить
в твоем примере - на geeksforless.net

другой сервер будет принимать письмо и перенаправлять его дальше
но тут возникает другая проблема: сервер может попросить логин-пароль
как с бороться с таким вариантом пока не знаю

будем подумать...

Автор: MeIsGremlin 17.4.2006, 15:14
Та не ты перепутал наверно. Я на mail.ru  соединяюсь и отправляю письмо на несуществующий адрес с mail.ru  на geeksforless.net и мне на mail.ru приходит письмо что  popa@geeksforless.net не существует. Но во время  соединения с smtp  адрес принимается 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)