PHP的一个完整SMTP类(解决当mail()遇上邮件服务器需要验证时的问题)



smtp.php

<?php



class smtp

{

/* Public Variables */

var $smtp_port ;

var
$time_out ;

var
$host_name ;

var
$log_file ;

var
$relay_host ;

var
$debug ;

var
$auth ;

var
$user ;

var
$pass ;



/* Private Variables */
var $sock ;



/* Constractor */

function smtp ( $relay_host = "" , $smtp_port = 25 , $auth = false , $user , $pass )

{

$this -> debug = FALSE ;

$this -> smtp_port = $smtp_port ;

$this -> relay_host = $relay_host ;

$this -> time_out = 30 ; //is used in fsockopen()
#

$this -> auth = $auth ; //auth

$this -> user = $user ;

$this -> pass = $pass ;

#

$this -> host_name = "localhost" ; //is used in HELO command
$this -> log_file = "" ;



$this -> sock = FALSE ;

}



/* Main Function */

function sendmail ( $to , $from , $subject = "" , $body = "" , $mailtype , $cc = "" , $bcc = "" , $additional_headers = "" )

{

$mail_from = $this -> get_address ( $this -> strip_comment ( $from ));

$body = ereg_replace ( "(^|(/r/n))(/.)" , "/1./3" , $body );

$header .= "MIME-Version:1.0/r/n" ;

if(
$mailtype == "HTML" ){

$header .= "Content-Type:text/html/r/n" ;

}

$header .= "To: " . $to . "/r/n" ;

if (
$cc != "" ) {

$header .= "Cc: " . $cc . "/r/n" ;

}

$header .= "From: $from<" . $from . ">/r/n" ;

$header .= "Subject: " . $subject . "/r/n" ;

$header .= $additional_headers ;

$header .= "Date: " . date ( "r" ). "/r/n" ;

$header .= "X-Mailer:By Redhat (PHP/" . phpversion (). ")/r/n" ;

list(
$msec , $sec ) = explode ( " " , microtime ());

$header .= "Message-ID: <" . date ( "YmdHis" , $sec ). "." .( $msec * 1000000 ). "." . $mail_from . ">/r/n" ;

$TO = explode ( "," , $this -> strip_comment ( $to ));



if (
$cc != "" ) {

$TO = array_merge ( $TO , explode ( "," , $this -> strip_comment ( $cc )));

}



if (
$bcc != "" ) {

$TO = array_merge ( $TO , explode ( "," , $this -> strip_comment ( $bcc )));

}



$sent = TRUE ;

foreach (
$TO as $rcpt_to ) {

$rcpt_to = $this -> get_address ( $rcpt_to );

if (!
$this -> smtp_sockopen ( $rcpt_to )) {

$this -> log_write ( "Error: Cannot send email to " . $rcpt_to . "/n" );

$sent = FALSE ;

continue;

}

if (
$this -> smtp_send ( $this -> host_name , $mail_from , $rcpt_to , $header , $body )) {

$this -> log_write ( "E-mail has been sent to <" . $rcpt_to . ">/n" );

} else {

$this -> log_write ( "Error: Cannot send email to <" . $rcpt_to . ">/n" );

$sent = FALSE ;

}

fclose ( $this -> sock );

$this -> log_write ( "Disconnected from remote host/n" );

}

return
$sent ;

}



/* Private Functions */



function smtp_send ( $helo , $from , $to , $header , $body = "" )

{

if (!
$this -> smtp_putcmd ( "HELO" , $helo )) {

return
$this -> smtp_error ( "sending HELO command" );

}

#auth

if( $this -> auth ){

if (!
$this -> smtp_putcmd ( "AUTH LOGIN" , base64_encode ( $this -> user ))) {

return
$this -> smtp_error ( "sending HELO command" );

}



if (!
$this -> smtp_putcmd ( "" , base64_encode ( $this -> pass ))) {

return
$this -> smtp_error ( "sending HELO command" );

}

}

#

if (! $this -> smtp_putcmd ( "MAIL" , "FROM:<" . $from . ">" )) {

return
$this -> smtp_error ( "sending MAIL FROM command" );

}



if (!
$this -> smtp_putcmd ( "RCPT" , "TO:<" . $to . ">" )) {

return
$this -> smtp_error ( "sending RCPT TO command" );

}



if (!
$this -> smtp_putcmd ( "DATA" )) {

return
$this -> smtp_error ( "sending DATA command" );

}



if (!
$this -> smtp_message ( $header , $body )) {

return
$this -> smtp_error ( "sending message" );

}



if (!
$this -> smtp_eom ()) {

return
$this -> smtp_error ( "sending <CR><LF>.<CR><LF> [EOM]" );

}



if (!
$this -> smtp_putcmd ( "QUIT" )) {

return
$this -> smtp_error ( "sending QUIT command" );

}



return
TRUE ;

}



function
smtp_sockopen ( $address )

{

if (
$this -> relay_host == "" ) {

return
$this -> smtp_sockopen_mx ( $address );

} else {

return
$this -> smtp_sockopen_relay ();

}

}



function
smtp_sockopen_relay ()

{

$this -> log_write ( "Trying to " . $this -> relay_host . ":" . $this -> smtp_port . "/n" );

$this -> sock = @ fsockopen ( $this -> relay_host , $this -> smtp_port , $errno , $errstr , $this -> time_out );

if (!(
$this -> sock && $this -> smtp_ok ())) {

$this -> log_write ( "Error: Cannot connenct to relay host " . $this -> relay_host . "/n" );

$this -> log_write ( "Error: " . $errstr . " (" . $errno . ")/n" );

return
FALSE ;

}

$this -> log_write ( "Connected to relay host " . $this -> relay_host . "/n" );

return
TRUE ;;

}



function
smtp_sockopen_mx ( $address )

{

$domain = ereg_replace ( "^.+@( [ ^@ ] +) $ " , "/1" , $address );

if (!@
getmxrr ( $domain , $MXHOSTS )) {

$this -> log_write ( "Error: Cannot resolve MX /"" . $domain . "/"/n" );

return
FALSE ;

}

foreach (
$MXHOSTS as $host ) {

$this -> log_write ( "Trying to " . $host . ":" . $this -> smtp_port . "/n" );

$this -> sock = @ fsockopen ( $host , $this -> smtp_port , $errno , $errstr , $this -> time_out );

if (!(
$this -> sock && $this -> smtp_ok ())) {

$this -> log_write ( "Warning: Cannot connect to mx host " . $host . "/n" );

$this -> log_write ( "Error: " . $errstr . " (" . $errno . ")/n" );

continue;

}

$this -> log_write ( "Connected to mx host " . $host . "/n" );

return
TRUE ;

}

$this -> log_write ( "Error: Cannot connect to any mx hosts (" . implode ( ", " , $MXHOSTS ). ")/n" );

return
FALSE ;

}



function
smtp_message ( $header , $body )

{

fputs ( $this -> sock , $header . "/r/n" . $body );

$this -> smtp_debug ( "> " . str_replace ( "/r/n" , "/n" . "> " , $header . "/n> " . $body . "/n> " ));



return
TRUE ;

}



function
smtp_eom ()

{

fputs ( $this -> sock , "/r/n./r/n" );

$this -> smtp_debug ( ". [EOM]/n" );



return
$this -> smtp_ok ();

}



function
smtp_ok ()

{

$response = str_replace ( "/r/n" , "" , fgets ( $this -> sock , 512 ));

$this -> smtp_debug ( $response . "/n" );



if (!
ereg ( "^[23]" , $response )) {

fputs ( $this -> sock , "QUIT/r/n" );

fgets ( $this -> sock , 512 );

$this -> log_write ( "Error: Remote host returned /"" . $response . "/"/n" );

return
FALSE ;

}

return
TRUE ;

}



function
smtp_putcmd ( $cmd , $arg = "" )

{

if (
$arg != "" ) {

if(
$cmd == "" ) $cmd = $arg ;

else
$cmd = $cmd . " " . $arg ;

}



fputs ( $this -> sock , $cmd . "/r/n" );

$this -> smtp_debug ( "> " . $cmd . "/n" );



return
$this -> smtp_ok ();

}



function
smtp_error ( $string )

{

$this -> log_write ( "Error: Error occurred while " . $string . "./n" );

return
FALSE ;

}



function
log_write ( $message )

{

$this -> smtp_debug ( $message );



if (
$this -> log_file == "" ) {

return
TRUE ;

}



$message = date ( "M d H:i:s " ). get_current_user (). "[" . getmypid (). "]: " . $message ;

if (!@
file_exists ( $this -> log_file ) || !( $fp = @ fopen ( $this -> log_file , "a" ))) {

$this -> smtp_debug ( "Warning: Cannot open log file /"" . $this -> log_file . "/"/n" );

return
FALSE ;;

}

flock ( $fp , LOCK_EX );

fputs ( $fp , $message );

fclose ( $fp );



return
TRUE ;

}



function
strip_comment ( $address )

{

$comment = "/([^()]*/)" ;

while (
ereg ( $comment , $address )) {

$address = ereg_replace ( $comment , "" , $address );

}



return
$address ;

}



function
get_address ( $address )

{

$address = ereg_replace ( "([ /t/r/n])+" , "" , $address );

$address = ereg_replace ( "^.*<(.+)>.* $ " , "/1" , $address );



return
$address ;

}



function
smtp_debug ( $message )

{

if (
$this -> debug ) {

echo
$message ;

}

}

}

?>











test.php

<?php

/*

这是一个测试程序!!!

请按照说明设置好以下的参数,以下是以tom.com的用户为例设置好的.

*/

require( "sm.php" );

##########################################

$smtpserver = "smtp.tom.com" ; //SMTP服务器

$smtpserverport = 25 ; //SMTP服务器端口

$smtpusermail = "someone@tom.com" ; //SMTP服务器的用户邮箱

$smtpemailto = "someone@hotmail.com" ; //发送给谁

$smtpuser = "someone" ; //SMTP服务器的用户帐号

$smtppass = "someonepass" ; //SMTP服务器的用户密码

$mailsubject = "Test Subject" ; //邮件主题

$mailbody = "<h1>This is a test mail</h1>" ; //邮件内容

$mailtype = "HTML" ; //邮件格式(HTML/TXT),TXT为文本邮件

##########################################

$smtp = new smtp ( $smtpserver , $smtpserverport , true , $smtpuser , $smtppass ); //这里面的一个true是表示使用身份验证,否则不使用身份验证.

$smtp -> debug = TRUE ; //是否显示发送的调试信息

$smtp -> sendmail ( $smtpemailto , $smtpusermail , $mailsubject , $mailbody , $mailtype );

?>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值