php通过socket,以SMTP发送邮件

 

 扫码关注公众号,每天推送不同的技术文章,公众号私聊获取学习资料,期待你我之间一起进步!

 

   

php通过socket编程,以SMTP将邮件发送到指定的QQ邮箱里面。

   这里简单介绍部分HTTP状态内容:

   220 smtp.qq.com Esmtp QQ Mail Server 
   250-smtp.qq.com 
   250-PIPELINING 
   250-SIZE 52428800 
   250-STARTTLS 
   250-AUTH LOGIN PLAIN 
   250-AUTH=LOGIN SMTP用户验证
   250-MAILCOMPRESS 
   250 8BITMIME 
   334 VXNlcm5hbWU6 输入使用BASE64编码的用户名
   334 UGFzc3dvcmQ6 输入使用BASE64编码的密码
   235 Authentication successful 验证通过
   250 Ok 接受者邮件地址

   250 Ok 告诉服务器我要开始发送邮件数据了
   354 End data with . 
     250 Ok: queued as 
    邮件发送成功

 下面便是发送邮件的一个SMTP类,class.mail.php:

<?php  
define('SMTP_STATUS_NOT_CONNECTED', 1, TRUE);  
define('SMTP_STATUS_CONNECTED', 2, TRUE);  
/** 
* @desc   SMTP 邮件服务器 
* @param  服务器参数和邮件信息 
*/  
class p8_smtp  
{  
    var $connection;  
    var $recipients;  
    var $headers;  
    var $timeout;  
    var $errors;  
    var $status;  
    var $body;  
    var $from;  
    var $host;  
    var $port;  
    var $helo;  
    var $auth;  
    var $user;  
    var $pass;  
      
    /** 
     *  参数为一个数组 
     *  host        SMTP 服务器的主机       默认:localhost 
     *  port        SMTP 服务器的端口       默认:25 
     *  helo        发送HELO命令的名称      默认:localhost 
     *  user        SMTP 服务器的用户名     默认:空值 
     *  pass        SMTP 服务器的登陆密码   默认:空值 
     *  timeout     连接超时的时间          默认:5 
     *  @return  bool 
     */  
      
    function p8_smtp($params = array())  
    {  
        if(!defined('CRLF')) define('CRLF', "\r\n", TRUE);  
          
        $this->timeout  = 5;  
        $this->status   = SMTP_STATUS_NOT_CONNECTED;  
        $this->host     = 'localhost';  
        $this->port     = 25;  
        $this->auth     = FALSE;  
        $this->user     = '';  
        $this->pass     = '';  
        $this->errors   = array();  
        foreach($params as $key => $value)  
        {  
            $this->$key = $value;  
        }  
          
        $this->helo     = $this->host;  
        //  如果没有设置用户名则不验证           
        $this->auth = ('' == $this->user) ? FALSE : TRUE;  
    }  
    function connect($params = array())  
    {  
        if(!isset($this->status))  
        {  
            $obj = new p8_smtp($params);  
              
            if($obj->connect())  
            {  
                $obj->status = SMTP_STATUS_CONNECTED;  
            }  
            return $obj;  
        }  
        else  
        {      
            $this->connection = fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout);  
            socket_set_timeout($this->connection, 0, 250000);  
            $greeting = $this->get_data();  
              
            if(is_resource($this->connection))  
            {  
                $this->status = 2;  
                return $this->auth ? $this->ehlo() : $this->helo();  
            }  
            else  
            {                             
                $this->errors[] = 'Failed to connect to server: '.$errstr;  
                return FALSE;  
            }  
        }  
    }  
      
    /** 
     * 参数为数组 
     * recipients      接收人的数组 
     * from            发件人的地址,也将作为回复地址 
     * headers         头部信息的数组 
     * body            邮件的主体 
     */  
      
    function send($params = array())  
    {  
        foreach($params as $key => $value)  
        {  
            $this->set($key, $value);  
        }       
        if($this->is_connected())  
        {  
            //  服务器是否需要验证   
            if($this->auth)  
            {  
                if(!$this->auth())  return FALSE;  
            }  
            $this->mail($this->from);  
            if(is_array($this->recipients))  
            {  
                foreach($this->recipients as $value)  
                {  
                    $this->rcpt($value);  
                }                 
            }  
            else  
            {  
                $this->rcpt($this->recipients);  
            }            
            if(!$this->data()) return FALSE;  
            $headers = str_replace(CRLF.'.', CRLF.'..', trim(implode(CRLF, $this->headers)));  
            $body    = str_replace(CRLF.'.', CRLF.'..', $this->body);  
            $body    = $body[0] == '.' ? '.'.$body : $body;  
            $this->send_data($headers);  
            $this->send_data('');  
            $this->send_data($body);  
            $this->send_data('.');  
            return (substr(trim($this->get_data()), 0, 3) === '250');  
        }  
        else  
        {  
            $this->errors[] = 'Not connected!';  
            return FALSE;  
        }  
    }  
      
    function helo()  
    {  
        if(is_resource($this->connection)  
                AND $this->send_data('HELO '.$this->helo)  
                AND substr(trim($error = $this->get_data()), 0, 3) === '250' )  
        {  
            return TRUE;  
        }  
        else  
        {  
            $this->errors[] = 'HELO command failed, output: ' . trim(substr(trim($error),3));  
            return FALSE;  
        }  
    }  
      
      
    function ehlo()  
    {  
        if(is_resource($this->connection)  
                AND $this->send_data('EHLO '.$this->helo)  
                AND substr(trim($error = $this->get_data()), 0, 3) === '250' )  
        {  
            return TRUE;  
        }  
        else  
        {  
            $this->errors[] = 'EHLO command failed, output: ' . trim(substr(trim($error),3));  
            return FALSE;  
        }  
    }  
      
    function auth()  
    {     
        if(is_resource($this->connection)  
                AND $this->send_data('AUTH LOGIN')  
                AND substr(trim($error = $this->get_data()),0,3) === '334'  
                AND $this->send_data(base64_encode($this->user))            // Send username  
                AND substr(trim($error = $this->get_data()),0,3) === '334'  
                AND $this->send_data(base64_encode($this->pass))            // Send password  
                AND substr(trim($error = $this->get_data()),0,3) === '235' )  
        {  
            return TRUE;  
        }  
        else  
        {      
            $this->errors[] = 'AUTH command failed: ' . trim(substr(trim($error),3));  
            return FALSE;  
        }  
    }  
      
    function mail($from)  
    {  
        if($this->is_connected()  
            AND $this->send_data('MAIL FROM:<'.$from.'>')  
            AND substr(trim($this->get_data()), 0, 2) === '250' )  
        {  
            return TRUE;  
        }  
        else  
        {  
            return FALSE;  
        }  
    }  
    function rcpt($to)  
    {  
        if($this->is_connected()  
            AND $this->send_data('RCPT TO:<'.$to.'>')  
            AND substr(trim($error = $this->get_data()), 0, 2) === '25' )  
        {  
            return TRUE;  
        }  
        else  
        {  
            $this->errors[] = trim(substr(trim($error), 3));  
            return FALSE;  
        }  
    }  
    function data()  
    {        
        if($this->is_connected()  
            AND $this->send_data('DATA')  
            AND substr(trim($error = $this->get_data()), 0, 3) === '354' )  
        {   
            return TRUE;  
        }  
        else  
        {  
            $this->errors[] = trim(substr(trim($error), 3));  
            return FALSE;  
        }  
    }  
    function is_connected()  
    {               
        return (is_resource($this->connection) AND ($this->status === SMTP_STATUS_CONNECTED));  
    }  
    function send_data($data)  
    {  
        if(is_resource($this->connection))  
        {          
            return fwrite($this->connection, $data.CRLF, strlen($data)+2);  
        }  
        else  
        {  
            return FALSE;  
        }  
    }  
    function &get_data()  
    {  
        $return = '';  
        $line   = '';  
        if(is_resource($this->connection))  
        {  
            while(strpos($return, CRLF) === FALSE OR substr($line,3,1) !== ' ')  
            {  
                $line    = fgets($this->connection, 512);  
                echo $line."<br/>";  
                $return .= $line;  
            }  
            return $return;  
        }  
        else  
        {  
            return FALSE;  
        }  
    }  
    function set($var, $value)  
    {  
        $this->$var = $value;  
        return TRUE;  
    }  
} // End of class  
  
  
  
class smtp  
{  
    var $debug;  
    var $host;  
    var $port;  
    var $auth;  
    var $user;  
    var $pass;  
  
    function smtp($host = "", $port = 25,$auth = false,$user,$pass){  
        $this->host=$host;  
        $this->port=$port;  
        $this->auth=$auth;  
        $this->user=$user;  
        $this->pass=$pass;  
    }  
  
    function sendmail($to,$from, $subject, $content, $T=0){  
        //$name, $email, $subject, $content, $type=0  
        $type=1;  
        $name=array($from);  
        $email=array($to);  
        $_CFG['smtp_host']= $this->host;  
        $_CFG['smtp_port']= $this->port;  
        $_CFG['smtp_user']= $this->user;  
        $_CFG['smtp_pass']= $this->pass;  
        $_CFG['name']= $from;  
        $_CFG['smtp_mail']= $from;  
  
        $subject = "=?UTF-8?B?".base64_encode($subject)."==?=";  
        $content = base64_encode($content);  
        $headers[] = "To:=?gbk?B?".base64_encode($name[0])."?= <$email[0]>";  
        $headers[] = "From:=?gbk?B?".base64_encode($_CFG['name'])."?= <$_CFG[smtp_mail]>";  
        $headers[] = "MIME-Version: Blueidea v1.0";  
        $headers[] = "X-Mailer: 9gongyu Mailer v1.0";  
        $headers[] = "Subject:$subject";  
        $headers[] = ($type == 0) ? "Content-Type: text/plain; charset=gbk; format=flowed" : "Content-Type: text/html; charset=utf-8; format=flowed";  
        $headers[] = "Content-Transfer-Encoding: base64";  
        $headers[] = "Content-Disposition: inline";  
        //    SMTP 服务器信息  
        $params['host'] = $_CFG['smtp_host'];  
        $params['port'] = $_CFG['smtp_port'];  
        $params['user'] = $_CFG['smtp_user'];  
        $params['pass'] = $_CFG['smtp_pass'];  
        if (empty($params['host']) || empty($params['port']))  
        {  
            // 如果没有设置主机和端口直接返回 false  
            return false;  
        }  
        else  
        {  
            //  发送邮件  
            $send_params['recipients']    = $email;  
            $send_params['headers']        = $headers;  
            $send_params['from']        = $_CFG['smtp_mail'];  
            $send_params['body']        = $content;  
  
            /*  用于测试信息 
            echo "<pre>"; 
            print_r($params); 
            print_r($send_params); 
            echo "</pre>"; 
            exit; 
            */  
            $smtp = new p8_smtp($params);  
            if($smtp->connect() AND $smtp->send($send_params))  
            {  
                return TRUE;  
            }  
            else   
            {  
                return FALSE;  
            }   
        }  
    }  
}  
  
?> 

下面我们来测试:

[php] view plain copy
<?php  
/** 
* @desc   SMTP 邮件服务器 
* @param  服务器参数和邮件信息 
*/  
header("Content-type:text/html;charset=utf-8");  
require_once("class.mail.php");  
/** 
*服务器信息 
*/  
$MailServer = 'smtp.qq.com';      //SMTP 服务器  
$MailPort   = '25';                  //SMTP服务器端口号 默认25  
$MailId     = '请填写自己QQ邮箱';  //服务器邮箱帐号  
$MailPw     = '自己QQ邮箱密码';                //服务器邮箱密码  
  
/** 
*客户端信息 
*/  
$Title      = 'TESTMAIL成功';        //邮件标题  
$Content    = '测试邮件内容';        //邮件内容  
$email      = '要发送到的QQ邮箱';   //接收者邮箱  
$smtp = new smtp($MailServer,$MailPort,true,$MailId,$MailPw);  
$smtp->debug = false;  
if($smtp->sendmail($email,$MailId, $Title, $Content, "HTML")){  
     echo '邮件发送成功';            //返回结果  
} else {  
     echo '邮件发送失败';            //$succeed = 0;  
}  
?>  


如果有问题,请大家提出,一起解决,本人QQ:546210058

写的不好大家勿喷!谢谢!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值