Click here to Skip to main content
15,904,153 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
Good afternoon. Can anyone convert the following PHP code to C#?
PHP
<?php

 /**
 * Validate Email Addresses Via SMTP
 * This queries the SMTP server to see if the email address is accepted.
 * @copyright http://creativecommons.org/licenses/by/2.0/ - Please keep this comment intact
 * @author gabe@fijiwebdesign.com
 * @contributers adnan@barakatdesigns.net
 * @version 0.1a
 */
class SMTP_validateEmail {

 /**
  * PHP Socket resource to remote MTA
  * @var resource $sock
  */
 var $sock;

 /**
  * Current User being validated
  */
 var $user;
 /**
  * Current domain where user is being validated
  */
 var $domain;
 /**
  * List of domains to validate users on
  */
 var $domains;
 /**
  * SMTP Port
  */
 var $port = 25;
 /**
  * Maximum Connection Time to wait for connection establishment per MTA
  */
 var $max_conn_time = 30;
 /**
  * Maximum time to read from socket before giving up
  */
 var $max_read_time = 5;

 /**
  * username of sender
  */
 var $from_user = 'user';
 /**
  * Host Name of sender
  */
 var $from_domain = 'localhost';

 /**
  * Nameservers to use when make DNS query for MX entries
  * @var Array $nameservers
  */
 var $nameservers = array(
        '192.168.0.1'
);

 var $debug = false;

 /**
  * Initializes the Class
  * @return SMTP_validateEmail Instance
  * @param $email Array[optional] List of Emails to Validate
  * @param $sender String[optional] Email of validator
  */
 function SMTP_validateEmail($emails = false, $sender = false) {
  if ($emails) {
   $this->setEmails($emails);
  }
  if ($sender) {
   $this->setSenderEmail($sender);
  }
 }

 function _parseEmail($email) {
        $parts = explode('@', $email);
        $domain = array_pop($parts);
        $user= implode('@', $parts);
        return array($user, $domain);
 }

 /**
  * Set the Emails to validate
  * @param $emails Array List of Emails
  */
 function setEmails($emails) {
        foreach($emails as $email) {
                list($user, $domain) = $this->_parseEmail($email);
                if (!isset($this->domains[$domain])) {
                         $this->domains[$domain] = array();
                }
                $this->domains[$domain][] = $user;
        }
 }

 /**
  * Set the Email of the sender/validator
  * @param $email String
  */
 function setSenderEmail($email) {
        $parts = $this->_parseEmail($email);
        $this->from_user = $parts[0];
        $this->from_domain = $parts[1];
 }

 /**
 * Validate Email Addresses
 * @param String $emails Emails to validate (recipient emails)
 * @param String $sender Sender's Email
 * @return Array Associative List of Emails and their validation results
 */
 function validate($emails = false, $sender = false) {

  $results = array();

  if ($emails) {
   $this->setEmails($emails);
  }
  if ($sender) {
   $this->setSenderEmail($sender);
  }

  // query the MTAs on each Domain
  foreach($this->domains as $domain=>$users) {

         $mxs = array();

         // current domain being queried
         $this->domain = $domain;

          // retrieve SMTP Server via MX query on domain
          list($hosts, $mxweights) = $this->queryMX($domain);

          // retrieve MX priorities
          for($n=0; $n < count($hosts); $n++){
           $mxs[$hosts[$n]] = $mxweights[$n];
          }
          asort($mxs);

          // last fallback is the original domain
          $mxs[$this->domain] = 0;

          $this->debug(print_r($mxs, 1));

          $timeout = $this->max_conn_time;

          // try each host
          while(list($host) = each($mxs)) {
           // connect to SMTP server
           $this->debug("try $host:$this->port\n");
           if ($this->sock = fsockopen($host, $this->port, $errno, $errstr, (float) $timeout)) {
            stream_set_timeout($this->sock, $this->max_read_time);
            break;
           }
          }

          // did we get a TCP socket
          if ($this->sock) {
           $reply = fread($this->sock, 2082);
           $this->debug("<<<\n$reply");

           preg_match('/^([0-9]{3}) /ims', $reply, $matches);
           $code = isset($matches[1]) ? $matches[1] : '';

           if($code != '220') {
            // MTA gave an error...
            foreach($users as $user) {
                $results[$user.'@'.$domain] = false;
                }
                continue;
           }

           // say helo
           $this->send("HELO ".$this->from_domain);
           // tell of sender
           $this->send("MAIL FROM: <".$this->from_user.'@'.$this->from_domain.">");

           // ask for each recepient on this domain
           foreach($users as $user) {

                   // ask of recepient
                   $reply = $this->send("RCPT TO: <".$user.'@'.$domain.">");

                    // get code and msg from response
                   preg_match('/^([0-9]{3}) /ims', $reply, $matches);
                   $code = isset($matches[1]) ? $matches[1] : '';

                   if ($code == '250') {
                    // you received 250 so the email address was accepted
                    $results[$user.'@'.$domain] = true;
                   } elseif ($code == '451' || $code == '452') {
                        // you received 451 so the email address was greylisted (or some temporary error occured on the MTA) - so assume is ok
                        $results[$user.'@'.$domain] = true;
                   } else {
                        $results[$user.'@'.$domain] = false;
                   }

           }

           // reset before quit
           $this->send("RSET");

           // quit
           $this->send("quit");
           // close socket
           fclose($this->sock);

          }
        }
        return $results;
 }



 function send($msg) {
  fwrite($this->sock, $msg."\r\n");

  $reply = fread($this->sock, 2082);

  $this->debug(">>>\n$msg\n");
  $this->debug("<<<\n$reply");

  return $reply;
 }

 /**
  * Query DNS server for MX entries
  * @return
  */
 function queryMX($domain) {
        $hosts = array();
        $mxweights = array();
        if (function_exists('getmxrr')) {
                getmxrr($domain, $hosts, $mxweights);
        } else {
                // windows, we need Net_DNS
                require_once 'Net/DNS.php';

                $resolver = new Net_DNS_Resolver();
                $resolver->debug = $this->debug;
                // nameservers to query
                $resolver->nameservers = $this->nameservers;
                $resp = $resolver->query($domain, 'MX');
                if ($resp) {
                        foreach($resp->answer as $answer) {
                                $hosts[] = $answer->exchange;
                                $mxweights[] = $answer->preference;
                        }
                }

        }
        return array($hosts, $mxweights);
 }

 /**
  * Simple function to replicate PHP 5 behaviour. http://php.net/microtime
  */
 function microtime_float() {
  list($usec, $sec) = explode(" ", microtime());
  return ((float)$usec + (float)$sec);
 }

 function debug($str) {
  if ($this->debug) {
   echo '<pre>'.htmlentities($str).'</pre>';
  }
 }

}


?>

Thank you, WHEELS

[edit]Code block corrected to only one set of <pre> tags - check when you paste as you can nest them if you have the "auto detect" option set, as you do have. - OriginalGriff[/edit]
Posted
Updated 17-Jan-11 9:05am
v2
Comments
Yusuf 17-Jan-11 15:03pm    
Good luck with that. I doubt any one will convert the code for you. It is your job, but you can get plenty of help if in process you get stuck withs something.

Here is a tool [^]that can get you started. But don't expect someone will do the job for you.
 
Share this answer
 
Do you want -- by any change -- an alternative to conversion?

If you want just to re-use existing PHP code, get the job done and save time, you could develop .NET solution using PHP for .NET called Phalanger:

http://php-compiler.net/doku.php[^], see also http://en.wikipedia.org/wiki/Phalanger_(compiler)[^].

It compiles PHP to CIL byte-code, can be used for ASP.NET as well.
There is a Visual Studio integration project based on Phalanger.

Just a food for thought...
 
Share this answer
 
Thank you everyone. Not sure what I am going to do, but it is good to have options. WHEELS
 
Share this answer
 
Comments
Kasson 18-Jan-11 8:08am    
There are lot of options available. So before posting your code just google it what is your requirement, if you could not able to find the solution then ask a question with specific problem so our experts here will give you the way to solve your problem.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900