使用SMTP发送邮件



[复制到剪切板]
CODE:
<?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($TOexplode(","$this->strip_comment($cc)));
        }
        
        if (
$bcc != "") {
            
$TO array_merge($TOexplode(","$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->sock512));
        
$this->smtp_debug($response."\n"); 
        if (!
ereg("^[23]"$response)) {
            
fputs($this->sock"QUIT\r\n");
            
fgets($this->sock512);
            
$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($fpLOCK_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;
        }
    }
}
?>
<?
//如下用163的SMTP服务器为例
$smtpserver "smtp.163.com";//SMTP服务器
$smtpserverport =25;//SMTP服务器端口
$smtpusermail "***@163.com";//SMTP服务器的用户邮箱
$smtpemailto "**@**.**";//发送给谁
$smtpuser "***@163.com";//SMTP服务器的用户帐号
$smtppass "****";//SMTP服务器的用户密码
$mailsubject "Test Subject";//邮件主题
$mailbody "<h1>This is a test mail 11:13</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);
?> ;