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


Автор: Sl@va 24.2.2005, 16:50
Здравствуйте !
Не подскажете, где можно найти скрипт, проверяющий e-mail адрес не на правильность ввода, а на само его существование.
Уже много мест облазил, но так ни где не смог его найти.
Заранее спасибо.

smile

Автор: Mal Hack 24.2.2005, 16:55
Для этого надо попытаться залогинется... Сам понимаешь это не так уж хорошо...

Автор: Akina 24.2.2005, 16:55
Такого нет. как ты себе представляешь механизм такой проверки?

Автор: Наставник 24.2.2005, 17:34
Возможно доп. проверить следующим образом (работает только под Unix)

Код

// проверяем существует ли домен, который содержится в адресе электронной почты
$email="test@test.com";
list($user,$domain)=explode("@",$email);
// извлекаем домен из электронного адреса почтового ящика
// теперь $domain="test.com";
// checkdsnrr - проверяет существует ли домен, второй параметр может быть MX -который проверяет, может ли данный домен принимать работать с почтой, но к сожалению, не на все почтовых серверах записи MX есть... (можете протестить на mail.ru, там записи MХ есть)
if(checkdsnrr($domain,"ANY"))
 return true;
else
 return false;


Удачи.

Автор: Sl@va 24.2.2005, 17:58
А возможно ли на php общение с почтовым сервером по протоколу smtp ?, в смысле возможна ли такая реализация ообще. И тогда по ответу почтового сервера можно будет узнать о существоании e-mail адреса.

Автор: Akina 24.2.2005, 18:09
Цитата(PHP)
For the Mail functions to be available, PHP must have access to the sendmail binary on your system during compile time. If you use another mail program, such as qmail or postfix, be sure to use the appropriate sendmail wrappers that come with them. PHP will first look for sendmail in your PATH, and then in the following: /usr/bin:/usr/sbin:/usr/etc:/etc:/usr/ucblib:/usr/lib. It's highly recommended to have sendmail available from your PATH. Also, the user that compiled PHP must have permission to access the sendmail binary.

Автор: Наставник 24.2.2005, 18:10
Естественно возможна через SMTP, а также POP3, да и даже через IMAP..
Если успею, то кину пример класса, для подсоединения по протоколу SMTP, и последующего анализа.

Автор: Sl@va 24.2.2005, 18:17
Ок, буду ждать.
Заранее спасибо.

Автор: Akina 24.2.2005, 18:26
Зачем класс? если сендмэйл подключен - его и пользуем...

Автор: Наставник 24.2.2005, 18:39
Цитата(Akina @ 24.2.2005, 18:26)
Зачем класс? если сендмэйл подключен - его и пользуем...

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

1. Новой версии, которая у меня работала, я не могут найти, так что очень древняя, но рабочая версия... (спасибо книги "Профессиональное PHP программирование")

Итак.

файл mailsimple.php

Код

<?php
/*
*  Базовый класс MailSimple
*  Использует встроенную функция mail(...), для того чтобы отправить письмо.
*  Использует настройки php.ini для правильной работы mail(...);
*/

  include("errormsg.php");

//   mailsimple.php

    class MailSimple
    {
        // основные параметры
        var $to="";            // адрес того, кому отправляем сообщением (может быть несколько)
        var $from="";          // адрес того, кто отправляет сообщение
        var $replyTo="";       // адрес, на который будет приходить ответ об удачном/неудачном отправлении письма
        var $cc="";            // адреса, кому придут копии соообщения от отправителя, все получатели видят, кто ещё получил копии
        var $bcc="";           // слепая копия - копия сообщения, но получатели не видят кто ещё получил копии, кроме него
        var $subj="";          // заголовок сообщения электронной почты
        var $body="";          // тело сообщения электронной почты

        // дополнительные параметры
        var $ereg_check=true;      // проверка почтовых адресов с помощью регулярных выражений (true - да)
        var $subj_empty=false;     // возможность отправить электронного сообщения с пустым заголовком (false - нет)
        var $body_empty=false;     // возможность отправить электронного сообщения с пустым телом (false - нет)
        var $view_email=array();   // используется для вывода электронного письма на экран, в удобном виде

        // переменная для создания экземпляра класса ошибок
        var $ErrorMessageSimple='ErrorMessageSimpleClass';
        var $E;

        // конструктор
        function MailSimple() {
            $this->ERR__=new $this->ErrorMessageSimple();
        }

        // проверка на пустоту заголовка с учетом доп. параметров
        // проверка почтовых адресов c помощью регулярного выражения
        function checkMail()
        {
            if(empty($this->to)){
                $this->E=$this->ERR__->E_EMPTY_MAIL_TO;
                return false;
            }

            if(empty($this->subj) && !$this->subj_empty) {
                $this->E=$this->ERR__->E_EMPTY_SUBJ;
                return false;
            }

            if(empty($this->body) && !$this->body) {
                $this->E=$this->ERR__->E_EMPTY_BOBY;
                return false;
            }

            // замена; на , в полях: to, cc, bcc
            $this->to=ereg_replace(";", ",", $this->to);
            $this->cc=ereg_replace(";", ",", $this->cc);
            $this->bcc=ereg_replace(";", ",", $this->bcc);

            if(!empty($this->from))
                $this->headers[]="From: $this->from";
            if(!empty($this->replyTo))
                $this->headers[]="Reply-To: $this->replyTo";

            if($this->validate_email) {
                $toM=explode(",",$this->to);
                if(!empty($this->cc)) $ccM=explode(",", $this->cc);
                if(!empty($this->bcc)) $bccM=explode(",", $this->bcc);

                if(!$this->eregMail($toM)) {
                    $this->E=$this->ERR__->E_TO_EMAIL;
                    return false;
                }

                if(is_array($ccM) && !$this->eregMail($ccM)) {
                    $this->E=$this->ERR__->E_CC_EMAIL;
                    return false;
                }

                if(is_array($bccM) && !$this->eregMail($bccM)) {
                    $this->E=$this->ERR__->E_BCC_EMAIL;
                    return false;
                }
             }

            return true;
         }

         // проверка, почтовых адресов c помощью регулярного выражения
         function eregMail($_email) {
             foreach($_email as $temp) {
                 if(!eregi("^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+))*$",$temp)) {
                     return false;
                 }
             }
             return true;
         }

         // включение заголовков
         function buildTitle() {
             if(!empty($this->cc)) $this->headers[]="Cc: $this->cc";
             if(!empty($this->bcc)) $this->headers[]="Bcc: $this->bcc";
         }

         // вывод сообщения письма
         function viewMail() {
             if($this->checkMail()) return false;

             $this->headers=array();
             $this->buildTitle();
             $this->headers[]="From: $this->from";
             $this->headers[]="To: $this->to";
             $this->headers[]="Subject: $this->subject";

             $viewM=implode("\r\n",$this->headers);
             $viewM.="\r\n";
             $viewM.=$this->body;

             return $viewM;
         }

        function sendMail() {
            if(!$this->checkMail()) return true;
            $this->buildTitle();

            if(mail($this->to,stripslashes(trim($this->subj)),stripslashes($this->body),implode("\r\n",$this->headers)))
                return true;
            else {
                $this->E=$this->ERR__->E_SEND;
                return false;
            }
        }

    }

?>



файл errormsg.php

Код

<?php

    class ErrorMessageSimple {

        // сообщения об ошибках
        var $E_EMPTY_MAIL_TO;
        var $E_EMPTY_SUBJ;
        var $E_EMPTY_BOBY;
        var $E_TO_EMAIL;
        var $E_CC_EMAIL;
        var $E_BCC_EMAIL;
        var $E_SEND;
       
        function ErrorMessageSimple() {
            $this->E_EMPTY_MAIL_TO="Empty to field.";
            $this->E_EMPTY_SUBJ="Empty subject field.";
            $this->E_EMPTY_BOBY="Emmpty body field.";
            $this->E_TO_EMAIL="To - incorrectly set field.";
            $this->E_CC_EMAIL="Cc - incorrectly set field.";
            $this->E_BCC_EMAIL="Bcc - incorrectly set field.";
            $this->E_SEND="Not send, because error";
        }

    }
   
    class ErrorMessageSMTP {

        // сообщения об ошибках
        var $E_SMTP_HOST;
        var $E_SMTP_CONN;
        var $E_SMTP_NOT_CONN;
        var $E_INIT_SOCKET;
        var $E_UNKNOWN;
        var $E_HELO_NOT;
        var $E_HELO_FAILED;
        var $E_QUIT_FAILED;
        var $E_MAIL_NOT;
        var $E_RCPT_NOT;
        var $E_DATA_NOT;
       

        function ErrorMessageSMTP() {
            $this->E_SMTP_HOST="SMTP host not set yet";
            $this->E_INIT_SOCKET="Couldn't initialize the socket";
            $this->E_SMTP_CONN="Failed to connect";
            $this->E_UNKNOWN="Unknown response from the server";
            $this->E_SMTP_NOT_CONN="Not connect to SMTP server";
            $this->E_HELO_NOT="HELO command needs an arguments";
            $this->E_HELO_FAILED="HELO command failed";
            $this->E_MAIL_NOT="MAIL command needs an arguments";
            $this->E_RCPT_NOT="RCPT command needs an arguments";
            $this->E_DATA_NOT="DATA command needs an arguments";
            $this->E_QUIT_FAILED="QUIT command failed";
        }

    }
?>


файл mailsmtp.php
Вот этот файл Вам и нужен, со всеми остальными, пока нет времени, потом комментарии напишу.


Код

<?php
include "mailsimple.php";

        class MailSMTP extends MailSimple
        {
              var $smtp_host="";
              var $smtp_port=25;
              var $socket=0; // сокет, через который общается сценарий и сервер SMTP
              var $response_code=0;
              var $response_msg="";
             
              var $ErrorMessageSMTP='ErrorMessageSMTP';
              var $E;
             
              function MailSMTP() {
                  $this->ER__=new $this->ErrorMessageSMTP();
              }
             
              function connect()
              {
                  if(empty($this->smtp_host)) {
                      $this->E=$this->ER__->E_SMTP_HOST;
                      return false;
                  }
                  $this->socket=fsockopen($this->smtp_host,$this->smtp_port,&$err_no,&$err_str);
                 
                  if(!$this->socket) {
                      if(!$err_no){
                          $err_str=$this->ER__->E_INIT_SOCKET;
                      }
                      $this->E=$this->ER__->E_SMTP_CONN . "$err_no: $err_str";
                      return false;
                  }
                 
                  if(!$this->getAns()) {
                      $this->E=$this->ER__->E_UNKNOWN . " : " . $this->response_msg;
                      return false;
                  }
                 
                  if($this->response_code!=220){
                      $this->E=$this->ER__->E_SMTP_CONN." ".$this->response_code." ".$this->response_msg;
                      return false;
                  }
                 
                  return true;
              }
             
              function getAns()
              {
                  if(!$this->socket) {
                      $this->E=$this->ER__->E_SMTP_NOT_CONN;
                      return false;
                  }
                 
                  $server_response=fgets($this->socket,1024);
                  if(ereg("^([0-9]{3})(.*)$",$server_response,$match)) {
                      $this->response_code=$match[1];
                      $this->response_msg=$match[2];
                      return true;
                  }
                  $this->response_msg=$server_response;
                  return false;
              }
             
              function see($_command,$_arg='')
              {
                  if($this->socket) {
                      $this->E=$this->ER__->E_SMTP_NOT_CONN;
                      return false;
                  }
             
                  switch($_command) {

                      case "HELO":
                          if (empty($_arg)) {
                              $this->E=$this->ER__->E_HELO_NOT;
                              return false;
                          }
                          $smtp_cmd="HELO $_arg\r\n";
                          fwrite($this->socket,$smtp_cmd);
                          if(!$this->getAns()){
                             $this->E=$this->ER__->E_UNKNOWN.":".$this->response_msg;
                             return false;
                          }
                          if($this->response_code!=250){
                              $this->E=$this->ER__->E_HELO_FAILED." ".$this->response_code." ".$this->response_msg;
                              return false;
                          }
                          break;
                         
                       case "MAIL":
                          if(empty($_arg)) {
                              $this->E=$this->ER__->E_MAIL_NOT;
                              return false;
                          }
                          $smtp_cmd="MAIL FROM: $_arg\r\n";
                          fwrite($this->socket,$smtp_cmd);
                          if(!$this->getAns()) {
                              $this->E=$this->ER__->E_UNKNOWN.":".$this->response_msg;
                              return false;
                          }
                          if($this->response_code!=250){
                              $this->E=$this->ER__->E_MAIL_FAILED." ".$this->response_code." ".$this->response_msg;
                              return false;
                          }
                          break;
                         
                       case "RCPT":
                          if(empty($_arg)) {
                              $this->E=$this->ER__->E_RCPT_NOT;
                              return false;
                          }
                          $toM=explode(",",$_arg);
                          foreach ($toM as $temp){
                              $smtp_cmd="RCPT TO: $temp\r\n";
                              fwrite($this->socket,$smtp_cmd);
                              if(!$this->getAns()) {
                                 $this->E=$this->ER__->E_UNKNOWN.":".$this->response_msg;
                                 return false;
                             }

                             if($this->response_code!=250){
                                 $this->E=$this->ER__->E_RCPT_FAILED." ".$this->response_code." ".$this->response_msg;
                                 return false;
                             }
                          }
                          break;
                         
                       case "DATA":
                          if(empty($_arg)) {
                              $this->E=$this->ER__->E_DATA_NOT;
                              return false;
                          }
                          $smtp_cmd="DATA\r\n";
                          fwrite($this->socket,$smtp_cmd);
                          if(!$this->getAns()) {
                              $this->E=$this->ER__->E_UNKNOWN.":".$this->response_msg;
                              return false;
                          }
                          if($this->response_code!=354){
                              $this->E=$this->ER__->E_DATA_FAILED." ".$this->response_code." ".$this->response_msg;
                              return false;
                          }
                          $smtp_cmd="$_arg\r\n"."."."\r\n";
                          fwrite($this->socket,$smtp_cmd);
                          if(!$this->getAns()) {
                              $this->E=$this->ER__->E_UNKNOWN.":".$this->response_msg;
                              return false;
                          }
                          if($this->response_code!=250){
                              $this->E=$this->ER__->E_DATA_FAILED." ".$this->response_code." ".$this->response_msg;
                              return false;
                          }
                          break;
                         
                       case "QUIT":
                          $smtp_cmd="QUIT\r\n";
                          fwrite($this->socket,$smtp_cmd);
                          if(!$this->getAns()) {
                              $this->E=$this->ER__->E_UNKNOWN.":".$this->response_msg;
                              return false;
                          }
                          if($this->response_code!=221){
                              $this->E=$this->ER__->E_QUIT_FAILED." ".$this->response_code." ".$this->response_msg;
                              return false;
                          }
                          break;
                         
                       default:
                          $this->E=$this->ER__->E_UNRECOG;
                          return false;
                          break;
                       }
                       
                       return true;
               }
               
               function sendMail()
               {
                  if($this->checkMail()) return false;
                 
                  $this->buildTitle();
                  if(!$this->connect()) return false;
                  if(!$this->see("HELO",$GLOBALS["SERVER_NAME"])) return false;
                  if(!$this->see("MAIL", $this->from)) return false;
                  if(!$this->see("RCPT", $this->to)) return false;
                 
                  if(!empty($this->to)) $this->headers[]="To: $this->to";
                  if(!empty($this->subject)) $this->headers[]="Subject: $this->subject";
                  if(!$this->see("DATA", implode("\r\n",$this->headers) . "\r\n\r\n" . $this->body)) return false;
                  if(!$this->see("QUIT")) return false;
                  fclose($this->socket);
                 
                  return true;
               }

           }
?>


файл testsmtp.php
Честно признаюсь, т.к. это старая версия, не уверен что работает, хотя...


Код

<?php
 include("mailsmtp.php");

 $mail=new MailSMTP();
 $mail->smtp_host="mail.ru";
 
 $mail->to="test@list.ru";
 $mail->from="test@list.ru";
 $mail->subject="Test";
 $mail->body="Is it work?";
 
 if($mail->sendMail()){
     echo("Success : $mail->subj");
 } else die("Error : $mail->subj " . $mail->E);
 
 echo("<br>");
 echo(str_replace("\r\n","<br",$mail->viewMail()));
?>


Все удачи.

Автор: Akina 24.2.2005, 18:52
Цитата
чтобы отправить не только текст, но и встроенные изображения в тело письма, да и приаттачить файлы

а какие проблемы-то?
Цитата(PHP)
mail
(PHP 3, PHP 4 , PHP 5)

mail -- send mail
Description
bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]])

mail() automatically mails the message specified in message to the receiver specified in to. Multiple recipients can be specified by putting a comma between each address in to. Email with attachments and special types of content can be sent using this function. This is accomplished via MIME-encoding - for more information, see this Zend article or the PEAR Mime Classes.


Sl@va
Даже если удаленный хост принял письмо, это не означает что адрес существует - там вполне может быть мультибокс.

Автор: Sl@va 24.2.2005, 20:44
Ок, спасибо.
Попробуем чего нето сделать, надеюсь что получится.

Автор: Mal Hack 24.2.2005, 21:22
Цитата
Естественно возможна через SMTP, а также POP3, да и даже через IMAP..

Только через IMAP...

Автор: Sl@va 25.2.2005, 17:02
Почемуто пишет что невозможно модключится к почтовому серверу.
может быть почтовый серер производит фильтрацию IP, пропуская тем самым только IP других почтовых серверов.
Пробывал подключаться к Rambler'у - тоже самое

Автор: Mal Hack 25.2.2005, 17:57
Беплатные хостеры не предоставляют возможности работы с IMAP с удаленных серверов..
Раньше такое было точно. Думаю не изменилось.

Автор: Sl@va 27.2.2005, 08:14
Пробовал на платном хостинге - тоже самое

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