You can use sockets and connect to their mail server (bit after the @) and
"pretend" to send an email to them, but cancel the request before you
actually send anything - doesn't always work though, as some servers will
report back the all users are correct

This is the code I use - a bit long though - if anyone can find a better
way, please email me


<?
//
----------------------------------------------------------------------------
if (!class_exists("mail_exchange_class"))
{
  class mail_exchange_class
  {
    //
------------------------------------------------------------------------
    function get_mx_reply($f)
    {
      $body = "";
      do
      {
        $line = fgets($f, 1024);
        $body .= "$line\n";
        $ch = substr($line, 3, 1);
      }
      while ($ch == "-");

      return $body;
    }

    //
------------------------------------------------------------------------
    function send_mx_msg($f, $str)
    {
      fputs($f, $str);
      return mail_exchange_class::get_mx_reply($f);
    }

    //
------------------------------------------------------------------------
    function check_email($email)
    {
      list($user, $host) = explode("@", $email);

      // --- check if there's a mail server
      // -------------------------------------
      if (!getmxrr($host, $mx_arr, $wt_arr))
      {
        return false;
      }

      // --- check if user exists at mail server
      // ------------------------------------------
      // try connecting to one of the mail servers
      $i = 0;
      $num_mx = count($mx_arr);
      do
      {
        $mx_server = $mx_arr[0];
        $f = fsockopen($mx_server, 25);
        $i++;
      }
      while (!$f && $i < $num_mx);
      if (!$f)
      {
        return false;
      }

      // "talk" with mail server to determine user validity
      $flag = true;
// default to: user exists
      $rep = mail_exchange_class::get_mx_reply($f);
// welcome message
      $rep = mail_exchange_class::send_mx_msg($f, "helo anonymous\n");
// introduce ourselves
      $rep = mail_exchange_class::send_mx_msg($f, "mail from:<$email>\n");
// say we want to send a msg
      $rep = mail_exchange_class::send_mx_msg($f, "rcpt to:<$email>\n");
// say who it's to
      if (substr($rep, 0, 3) != "250")
// check if user exists
      {
        $flag = false;
// ... now we know they don't exist
      }
      $rep = mail_exchange_class::send_mx_msg($f, "rset\n");
// reset all the buffers
      $rep = mail_exchange_class::send_mx_msg($f, "quit\n");
// log off from server
      fclose($f);

      // return status
      return $flag;
    }
  }
}
?>

then to use:
  $email = "[EMAIL PROTECTED]";
  if (mail_exchange_class::check_email($email))
    ;  // user probably exists
  else
    ;  // user doesn't exist, or can't connect to server

I think that's all you need of this code - there's lots more, there's an
email class and an attachment class that goes with it, but it's need to
check the address

HTH
Martin

-----Original Message-----
From: Simon Willison [mailto:[EMAIL PROTECTED]]
Sent: Monday, February 25, 2002 9:27 AM
To: Steven Walker
Cc: [EMAIL PROTECTED]
Subject: Re: [PHP] Email Verification


Steven Walker wrote:

> Does anybody know any good ways (or available code) for verifying 
> email addresses?
>
> Checking syntax is not enough.. I'd like to actually be able to test 
> whether the email address exists.

The only way to be sure is to send them an e-mail with a link or 
validation code that they must use to prove the address exists - or if 
it's for an account just tell them that the (random) password for their 
account will be e-mailed to the address they provide.



-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to