note 23481 modified in function.fsockopen by betz
| From: | betz@php.net | 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