note 23481 modified in function.fsockopen by betz

From: Date: Tue, 22 Oct 2002 09:55:54 +0000
Subject: note 23481 modified in function.fsockopen by betz
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-38410@lists.php.net to get a copy of this message
Here's how to send an email using SMTP. This includes rudimentary checking on server responses during the process of sending an email. Could be improved by more comprehensive processing of the result codes...or going on to the next mail exchanger when you fail after connecting to the first. <? function another_mail($to,$subject,$headers,$message) { // Could get this from the php ini? $from="me@here.com"; list($me,$mydomain) = split("@",$from); // Now look up the mail exchangers for the recipient list($user,$domain) = split("@",$to,2); if(getmxrr($domain,$mx,$weight) == 0) return FALSE; // Try them in order of lowest weight first array_multisort($mx,$weight); $success=0; foreach($mx as $host) { // Open an SMTP connection $connection = fsockopen ($host, 25, &$errno, &$errstr, 1); if (!$connection) continue; $res=fgets($connection,256); if(substr($res,0,3) != "220") break; // Introduce ourselves fputs($connection, "HELO $mydomain\n"); $res=fgets($connection,256); if(substr($res,0,3) != "250") break; // Envelope from fputs($connection, "MAIL FROM: $from\n"); $res=fgets($connection,256); if(substr($res,0,3) != "250") break; // Envelope to fputs($connection, "RCPT TO: $to\n"); $res=fgets($connection,256); if(substr($res,0,3) != "250") break; // The message fputs($connection, "DATA\n"); $res=fgets($connection,256); if(substr($res,0,3) != "354") break; // Send To:, From:, Subject:, other headers, blank line, message, and finish // with a period on its own line. fputs($connection, "To: $to\nFrom: $from\nSubject: $subject\n$headers\n\n$message\n.\n"); $res=fgets($connection,256); if(substr($res,0,3) != "250") break; // Say bye bye fputs($connection,"QUIT\n"); $res=fgets($connection,256); if(substr($res,0,3) != "221") break; // It worked! So break out of the loop which tries all the mail exchangers. $success=1; break; } // Debug for if we fall over - uncomment as desired // print $success?"Mail sent":"Failure: $res\n"; if($connection) { if($success==0) fputs($connection, "QUIT\n"); fclose ($connection); } return $success?TRUE:FALSE; } another_mail("recipient@some.domain","My Subject","X-mailer: PHP Script\nX-another-header: Whatever","Test email body.\n\nNote if you actually put a period on a line\nby itself, the function will terminate prematurely.\n\nYou will get a partial email sent though.\n"); ?> --was-- Here's how to send an email using SMTP. This includes rudimentary checking on server responses during the process of sending an email. Could be improved by more comprehensive processing of the result codes...or going on to the next mail exchanger when you fail after connecting to the first. <? function another_mail($to,$subject,$headers,$message) { // Could get this from the php ini? $from="me@here.com"; list($me,$mydomain) = split("@",$from); // Now look up the mail exchangers for the recipient list($user,$domain) = split("@",$to,2); if(getmxrr($domain,$mx,$weight) == 0) return FALSE; // Try them in order of lowest weight first array_multisort($mx,$weight); $success=0; foreach($mx as $host) { // Open an SMTP connection $connection = fsockopen ($host, 25, &$errno, &$errstr, 1); if (!$connection) continue; $res=fgets($connection,256); if(substr($res,0,3) != "220") break; // Introduce ourselves fputs($connection, "HELO $mydomain\n"); $res=fgets($connection,256); if(substr($res,0,3) != "250") break; // Envelope from fputs($connection, "MAIL FROM: $from\n"); $res=fgets($connection,256); if(substr($res,0,3) != "250") break; // Envelope to fputs($connection, "RCPT TO: $to\n"); $res=fgets($connection,256); if(substr($res,0,3) != "250") break; // The message fputs($connection, "DATA\n"); $res=fgets($connection,256); if(substr($res,0,3) != "354") break; // Send To:, From:, Subject:, other headers, blank line, message, and finish // with a period on its own line. fputs($connection, "To: $to\nFrom: $from\nSubject: $subject\n$headers\n\n$message\n.\n"); $res=fgets($connection,256); if(substr($res,0,3) != "250") break; // Say bye bye fputs($connection,"QUIT\n"); $res=fgets($connection,256); if(substr($res,0,3) != "221") break; // It worked! So break out of the loop which tries all the mail exchangers. $success=1; break; } // Debug for if we fall over - uncomment as desired // print $success?"Mail sent":"Failure: $res\n"; if($connection) { if($success==0) fputs($connection, "QUIT\n"); close ($connection); } return $success?TRUE:FALSE; } another_mail("recipient@some.domain","My Subject","X-mailer: PHP Script\nX-another-header: Whatever","Test email body.\n\nNote if you actually put a period on a line\nby itself, the function will terminate prematurely.\n\nYou will get a partial email sent though.\n"); ?> http://www.php.net/manual/en/function.fsockopen.php

« previous php.notes (#38410) next »