当前位置:编程学习 > php >>

简单的PHP邮件发送类源代码

把自己框架里的邮件发送类分享出来,希望对大家有帮助,同时做了一个小例子,方便大家使用。

SMTP类:Smtp.class.php

?
Code:
<?php
/**
 * SMTP类
 * @package         DolrPHP
 * @author          Joy chao <joy@joychao.cc>
 * @version         v2.0
 * @copyright       Copyright (c) 2012. DolrPHP.com
 * @modifier        Joy chao <joy@joychao.cc>
 * @lastmodified    Joy chao    2012-4-30
 */
class Smtp {
    public $smtp_host//SMTP主机,如: smtp.qq.com
    public $smtp_port = 25; //SMTP端口
    public $auth = TRUE;    //是否需要帐户认证
    public $user;       //帐户名
    public $pass;       //帐户密码
    public $debug = FALSE;  //开启调试
    public $time_out;
    public $host_name;
    public $log_file;
    public $sock;
  
    /**
     * 构造函数,连接smtp服务器
     * @param string    smtp服务器
     * @param int       smtp服务器端口
     * @param bool      smtp服务器是否需要认证
     * @param string    smtp服务器邮件帐号
     * @param string    smtp服务器邮件密码
     */
    function smtp($smtp_host, $smtp_port = 25, $auth = TRUE, $user = '', $pass = '') {
        $this->debug     = FALSE;
        $this->smtp_port = trim ( $smtp_port );
        $this->smtp_host = trim ( $smtp_host );
        $this->time_out  = 30; // is used in fsockopen()
        $this->auth      = trim ( $auth ); // auth
        $this->user      = trim ( $user );
        $this->pass      = trim ( $pass );
        $this->host_name = "localhost"; // is used in HELO command
        $this->log_file  = '';
        $this->sock      = FALSE;
    }
  
    /**
     * 发送邮件主方法
     * @param  string $to                 收件人
     * @param  string $mail_from          发件人
     * @param  string $subject            主题
     * @param  string $body               内容
     * @param  string $mailtype           邮件类型(HTML/TXT)
     * @param  string $cc                 抄送
     * @param  string $bcc                密送
     * @param  string $additional_headers 额外头信息
     * @return boolean                    成功或者失败
     */
    function sendmail($to, $mail_from, $subject = '', $body = '', $mailtype = "HTML", $cc = '', $bcc = '', $additional_headers = '') {
        $to           = trim ( $to );
        $stringEncode = mb_detect_encoding($body, array('UTF-8','GBK','ASCII','GB2312')); 
        $subject      = iconv($stringEncode,'UTF-8',$subject);
        $body         = iconv($stringEncode,'UTF-8',$body);
        $body         = preg_replace ( "/(^|(\r\n))(\.)/", "\\1.\\3", base64_encode($body));
        $header       = "MIME-Version:1.0\r\n";
        if (strtoupper ( $mailtype ) == "HTML") {
            $header .= "Content-Type:text/html;charset=utf-8\r\n";
        }
        $header .= "Content-Transfer-Encoding: base64\n";
        $header .= "To: " . $to . "\r\n";
        if ($cc != '') {
            $header .= "Cc: " . $cc . "\r\n";
        }
        $header .= "From: " . $this->get_mailfrom ( $this->user, $mail_from ) . "\r\n";
        $header .= "Subject: " . $subject . "\r\n";
        $header .= $additional_headers;
        $header .= "Date: " . date ( "r" ) . "\r\n";
        $header .= "X-Mailer:By Apache (PHP/" . phpversion() . ")\r\n";
        list ( $msec, $sec ) = explode ( ' ', microtime() );
        $header .= "Message-ID: <" . date ( 'YmdHis', $sec ) . "." . ($msec * 1000000) . "." . substr ( $mail_from, strpos ( $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, $this->user, $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;
    }
  
    /**
     * 发送邮件
     * @access public
     */
    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->smtp_host == '') {
            return $this->smtp_sockopen_mx ( $address );
        } else {
            return $this->smtp_sockopen_relay ();
        }
    }
  
    function smtp_sockopen_relay() {
        $this->log_write ( "Trying to " . $this->smtp_host . ":" . $this->smtp_port . "\n" );
        $this->sock = @fsockopen ( $this->smtp_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->smtp_host . "\n" );
            $this->log_write ( "Error: " . $errstr . " (" . $errno . ")\n" );
            return FALSE;
        }
        $this->log_write ( "Connected to relay host " . $this->smtp_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 (! preg_match("/^[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 ( preg_match( $comment, $address ) ) {
            $address = preg_replace ( $comment, '', $address );
        }
        return $address;
    }
  
    function get_address($address) {
        return trim ( preg_replace ( "/(.*[<])?([^<>]+)[>]?/i", "$2", $address ) );
    }
  
    function get_mailfrom($address,$mail_from) {
        return $mail_from . "<{$address}>";
    }
  
    function smtp_debug($message) {
        if ($this->debug) {
            return $message;
        }
    }
}//CLASS SMTP END-----

使用范例: mail.php

?
Code:
<?php
/**
 * SMTP邮件发送演示
 *
 * @author  Joychao <Joy@Joychao.cc>
 **/
//包含SMTP类文件
include './Smtp.class.php';
  
$smtpserver   = "smtp.exmail.qq.com";   //SMTP服务器 
$smtpport     = 25;                     //SMTP服务器端口 
$smtpusermail = "admin@joychao.cc";     //SMTP服务器的用户邮箱 
$smtpuser     = "admin@joychao.cc";     //SMTP服务器的用户帐号 
$smtppass     = "123456";               //SMTP服务器的用户密码 
  
$mailfrom     = "Joychao'Blog";         //发送者名称
$mailto       = '44294631@qq.com';      //发送给谁(QQ邮箱情况下不能和上面的登录帐户一样,否则发不出去)
$mailsubject  = "Hello world!这是一封测试邮件的标题"//邮件主题 
$mailbody     = '您好!这是一封测试邮件来自<a href="http://www.joychao.cc">Joychao\'Blog</a>';//邮件内容,支持HTML
$mailtype     = "HTML";                 //邮件格式(HTML/TXT),TXT为文本邮件 
########################################## 
//这里面的一个true是表示使用身份验证,否则不使用身份验证. 
$smtp = new Smtp($smtpserver,$smtpport,true,$smtpuser,$smtppass);//实例化SMTP类
//是否显示调试信息 
$smtp->debug = 1;
//发送邮件
$res=$smtp->sendmail($mailto, $mailfrom, $mailsubject, $mailbody, $mailtype);
if($res){
    echo '发送成功';
}else{
    echo '发送失败';
}

这里补充一点:QQ邮箱不让自己SMTP发给自己,所以测试时请留意这个问题。

代码呢 百度网盘:http://pan.baidu.com/share/link?shareid=78838&uk=453059967

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,