*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* GPL is found at: http://www.gnu.org/copyleft/gpl.html
*
* Usage: check_email($email,$HTTP_SERVER_VARS[SERVER_NAME])
* Returnvalues: array($message,$success,$server_answer)
* Message: reason for failure or empty
* Success: 0 = failed, no MX-Record for Domain;
* -1 = failed;
* 1 = success
* Server Answer: only if exists
*/
/**
* Drupalized by kmue@drupal.org
*/
function check_email($email,$sender_domain) {
list($user, $domain) = split('@', $email, 2);
$sender = "info@" .$sender_domain;
$success = -1;
$connect_success = "";
$connect_out = "";
$server_answer = "";
/* returnmessages */
$dns_failed = t('Ihre e-Mail Adresse ist nicht korrekt!
Es konnte kein Mailserver für %domain gefunden werden.
Bitte Überprüfen Sie Ihre Eingabe.', array('%domain' => $domain));
$connect_failed = t('Kein Mailserver für %email erreichbar
Ihre e-Mail Adresse konnte nicht Überprüft werden.', array('%email' => $email));
$helo_failed = t('HELO for %domain failed', array('%sender_domain' => $sender_domain));
$from_failed = t('MAIL FROM: %sender failed', array('%sender' => $sender));
$rcpt_failed = t('Der Benutzer %user ist bei %domain unbekannt!
Bitte Überprüfen Sie Ihre Eingabe.', array('%user' => $user, '%domain' => $domain));
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("email: $email, sender_domain: $sender_domain, domain: $domain");
}
/* check input */
if (!$email) {
return array(t('Internal error: $email is missing'),-1,'');
}
else if (!$sender_domain) {
return array(t('Internal error: $sender_domain is missing'),-1,'');
}
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("Input OK");
}
/* exists mxrr for $domain */
if (!getmxrr($domain,$mxhosts,$weight)) {
$message = $dns_failed;
$success = 0;
} else {
$i = 0; /* order mxhosts by weightness */
while ($i < sizeof($mxhosts)) {
$hosts[$weight[$i]][$i] = $mxhosts[$i];
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("MX RR for $domain $i: $weight[$i] * $mxhosts[$i]");
}
$i++;
}
ksort($hosts);
$h = 0;
$i = 0;
while (list($key,$value) = each($hosts)) {
$mxhosts[$i] = $value;
$weight[$i] = $key;
while (list($key_name,$hostname) = each($mxhosts[$i])) {
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("$i-$h: $key_name: $weight[$i] * $hostname");
}
$mx_sorted[$h] = $hostname;
$weight_sorted[$h] = $weight[$i];
$h++;
}
$i++;
}
$mxhosts = $mx_sorted;
$weight = $weight_sorted;
unset($weight_sorted);
unset($mx_sorted);
unset($hosts); /* end order mxhosts by weightness */
/* connect */
for ($i = 0; ($i < count ($mxhosts) && $connect_success <> 1); $i++) {
$smtp_socket = fsockopen ($mxhosts[$i], 25);
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("Ask-$i: $mxhosts[$i] * $weight[$i]");
}
/* SMTP-Socket open */
if ($smtp_socket) { /* ----------------------------------------------- SMTP-Socket */
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("Socket $smtp_socket open");
}
$s = 0;
$c = 0;
$out = "";
socket_set_blocking ($smtp_socket, false);
do {
$out = fgets ($smtp_socket, 2500);
if (ereg ( "^220", $out)) {
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("S:$s C:$c OUT: $out");
}
$connect_out = $out;
$s = 0;
$out = "";
$c++;
} elseif (($c > 0) && ($out == "")) {
break;
} else {
$s++;
}
if ($s == 99999) {
break;
}
} while ($out == "");
if (!ereg("^220",$connect_out)) {
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("No Connection to $mxhosts[$i] ($connect_out)");
}
$message = $connect_failed;
$server_answer = htmlentities($connect_out);
fclose($smtp_socket);
} else { /* start communication ---------------------------------- HELO */
$connect_success = 1;
socket_set_blocking ($smtp_socket, true);
$helo_success = 0;
fputs ($smtp_socket, "HELO $sender_domain\r\n");
$z = 0;
$helo_output = fgets ($smtp_socket, 2000);
if (ereg("^250",$helo_output)) { $helo_success = 1; }
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("$z: HELO SENT: $sender_domain");
drupal_set_message("$z: HELO GET: $helo_output");
}
socket_set_blocking ($smtp_socket, false);
do {
$helo_output = fgets ($smtp_socket, 2000);
$z++;
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("$z: HELO GET: $helo_output");
}
if ($z > 10) { break; }
} while (ereg("^[a-zA-Z0-9]",$helo_output)); /* ------------ end HELO */
socket_set_blocking ($smtp_socket, true);
if ($helo_success == 1) { /* ------------- helo_success => MAIL FROM */
fputs ($smtp_socket,'MAIL FROM: <'. $sender .">\r\n");
$from_output = fgets ($smtp_socket, 2000);
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("MAIL FROM SENT: <$sender>");
drupal_set_message("MAIL FROM GET: $from_output");
}
if (ereg("^250",$from_output)) { /* from_success => RCPT TO */
fputs ($smtp_socket, "RCPT TO: <$email>\r\n");
$rcpt_output = fgets ($smtp_socket, 2000);
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("RCPT TO SENT: <$email>");
drupal_set_message('RCPT TO GET: '. htmlentities($rcpt_output));
}
if (ereg("^250",$rcpt_output)) {
$success = 1;
$message = "";
} else {
$message = $rcpt_failed;
$server_answer = htmlentities($rcpt_output);
}
} else { /* ---------------------- end from_success RCPT TO */
$message = $from_failed;
$server_answer = htmlentities($from_output);
} /* end if (ereg("^250",$from_output) ------------- MAIL FROM */
} else {
$message = $helo_failed;
$server_answer = htmlentities($helo_output);
} /* end if $helo_success */
} /* end if ^220 $connect_out */
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("Send: QUIT");
}
fputs($smtp_socket,"QUIT\r\n");
if (CHECK_EMAIL_DEBUG > 0) {
drupal_set_message("Close $smtp_socket");
}
fclose($smtp_socket);
} /* end if smtp_socket open ----------------------------------------- SMTP-Socket */
} /* end for connect $mxhosts[$i] */
} /* end exists mxrr for $domain */
return array($message,$success,$server_answer);
}
?>