<?php

error_reporting(E_ALL);

define('TRY_EMAIL_HELOHOST', 'spambox.mx.skyrock.com');
define('TRY_EMAIL_DELIVERY_TIMEOUT', 10);
define('TRY_EMAIL_DELIVERY_SENDER', '');
define('TRY_EMAIL_MAX_LINE_LENGTH', 5000);
define('TRY_EMAIL_TEMPORARY_FAILURE_CODE', '4');
define('TRY_EMAIL_MAX_MXS', 15);

function _expect_smtp_ok_reply($fd, $code) {
    for(;;) {
	$line = @fgets($fd, TRY_EMAIL_MAX_LINE_LENGTH);
	if (strlen($line) < 5) {
	    return NULL;
	}
	if ($line[3] === ' ') {
	    break;
	}
	if ($line[3] !== '-') {
	    return NULL;
	}
    }
    if (substr($line, 0, strlen($code)) !== "$code" &&
	$line[0] !== TRY_EMAIL_TEMPORARY_FAILURE_CODE) {
	return FALSE;
    }
    return TRUE;
}

function _try_email_delivery($email, $mx) {
    $errno = FALSE;
    $errstr = FALSE;
    $fd = fsockopen($mx, 25, $errno, $errstr, TRY_EMAIL_DELIVERY_TIMEOUT);
    if ($fd === FALSE) {
	return NULL;
    }
    stream_set_timeout($fd, TRY_EMAIL_DELIVERY_TIMEOUT);
    if (_expect_smtp_ok_reply($fd, 2) === FALSE) {
	fclose($fd);
	return NULL;
    }
    fwrite($fd, 'HELO orbus.fr' . "\r\n");
    if (_expect_smtp_ok_reply($fd, 2) === FALSE) {
	fclose($fd);
	return NULL;
    }    
    fwrite($fd, 'MAIL FROM: <' . TRY_EMAIL_DELIVERY_SENDER . '>' . "\r\n");
    if (_expect_smtp_ok_reply($fd, 2) === FALSE) {
	fclose($fd);
	return NULL;
    }    
    fwrite($fd, 'RCPT TO: <' . $email . '>' . "\r\n");
    if (_expect_smtp_ok_reply($fd, 2) === FALSE) {
	fclose($fd);
	return FALSE;
    }    
    fwrite($fd, 'DATA' . "\r\n");
    if (_expect_smtp_ok_reply($fd, 3) === FALSE) {
	fclose($fd);
	return FALSE;
    }    
    fclose($fd);
    
    return TRUE;
}

function is_valid_email($email) {
    @list($user, $host) = explode('@', $email);
    if (empty($user) || empty($host)) {
        return FALSE;
    }
    if (strstr($host, '.') === FALSE) {
        return FALSE;
    }
    $mxs = array();
    $weights = array();
    getmxrr($host, $mxs, $weights);
    if (empty($mxs)) {
	$mxs = gethostbynamel($host);
	$weights = array_fill(0, count($mxs), 0);
    }
    if (empty($mxs)) {
	return FALSE;
    }
    array_splice($mxs, TRY_EMAIL_MAX_MXS);
    array_splice($weights, TRY_EMAIL_MAX_MXS);    
    array_multisort($weights, $mxs);
    foreach ($mxs as $mx) {
	if (($ret = @_try_email_delivery($email, $mx)) !== NULL) {
	    return $ret;
	}
    }
    return NULL;
}

$ret = is_valid_email('caro@caramail.com');
var_dump($ret);

?>
