A-A+

网页上发送mail(PHP)

2008年12月11日 PHP 暂无评论 阅读 1 次

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 ( " (^|(rn))(.) " ,   " 1.3 " ,   $body );
        
$header   =   " MIME-Version:1.0rn " ;

        
if ( $mailtype == " HTML " )
        {
            
$header   .=   " Content-Type:text/htmlrn " ;
        }

        
$header   .=   " To:  " . $to . " rn " ;

        
if  ( $cc   !=   ""
        {
            
$header   .=   " Cc:  " . $cc . " rn " ;
        }

        
$header   .=   " From: $from< " . $from . " >rn " ;
        
$header   .=   " Subject:  " . $subject . " rn " ;
        
$header   .=   $additional_headers ;
        
$header   .=   " Date:  " . date ( " r " ) . " rn " ;
        
$header   .=   " X-Mailer:By Redhat (PHP/ " . phpversion () . " )rn " ;

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

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

        
$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 hostn " );
        }

        
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 . " rn " . $body );
        
$this -> smtp_debug( " " . str_replace ( " rn " ,   " n " . " " ,   $header . " n>  " . $body . " n>  " ));
        
return   TRUE ;
    }

    
function  smtp_eom()
    {
        
fputs ( $this -> sock ,   " rn.rn " );
        
$this -> smtp_debug( " . [EOM]n " );
        
return   $this -> smtp_ok();
    }

    
function  smtp_ok()
    {
        
$response   =   str_replace ( " rn " ,   "" ,   fgets ( $this -> sock ,   512 ));
        
$this -> smtp_debug( $response . " n " );
     
        
if  ( ! ereg ( " ^[23] " ,   $response )) 
        {
            
fputs ( $this -> sock ,   " QUITrn " );
            
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 . " rn " );
        
$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 ( " ([ trn])+ " ,   "" ,   $address );
        
$address   =   ereg_replace ( " ^.*<(.+)>.*$ " ,   " 1 " ,   $address );
        
return   $address ;
    }
    
    
function  smtp_debug( $message )
    {
        
if  ( $this -> debug) 
        {
            
echo   $message ;
        }
    }
}
?>

DEMO:TEST.PHP

<? php
require   " smtp.php " ;
$smtpserver   =   " smtp.xxx.com " ; // SMTP服务器
$smtpserverport   = 25 ; // SMTP服务器端口
$smtpusermail   =   " xxxx@xxx.com " ; // SMTP服务器的用户邮箱
$smtpemailto   =   " xxxx@xxx.com " ; // 发送给谁
$smtpuser   =   " xxxx " ; // SMTP服务器的用户帐号
$smtppass   =   " xxxx " ; // SMTP服务器的用户密码
$mailsubject   =   " 客户反馈意见! " ; // 邮件主题
$mailbody   =   " <h1>这是我的一个测试~~~</h1> " ; // 邮件内容
$mailtype   =   " HTML " ; // 邮件格式(HTML/TXT),TXT为文本邮件

$smtp   =   new  smtp( $smtpserver , $smtpserverport , true , $smtpuser , $smtppass ); // 这里面的一个true是表示使用身份验证,否则不使用身份验证.
$smtp -> debug  =   false ; // 是否显示发送的调试信息
$return   =  ( $smtp -> sendmail( $smtpemailto ,   $smtpusermail ,   $mailsubject ,   $mailbody ,   $mailtype ));
echo   $return ;
?>

 

给我留言

Copyright © 浩然东方 保留所有权利.   Theme  Ality 07032740

用户登录