发个自己写的Email类;

浏览:1001 发布日期:2015/07/01 分类:技术分享
<?php
namespace Think;
/**
1. 发件人和收人昵称  中文乱码:  写成这样:: '"=?utf-8?B?'.base64_encode($to_name).'?="'; 注意保留双引号;
2. 注意: \r\n 必须按照格式;
3. socket_read() 如果不全部读取,下个回话还有上次遗留的内容;
4. 主要是SMTP的格式, 特别是 \r\n;
范例: 
$a = new Email();
$a -> sendMail();
*/
class Email{
    private $socket;
    public  $error;
    private $log;
    public $config =array(
        'mail_host' => 'smtp.126.com',
        'mail_port' => '25',
        'mail_from' => 'aaa@126.com', //发件人;
        'username'  => 'aaa',
        'password'  => 'aaaa',
        'charset'   => 'utf8',
    );
    
    //初始化;
    public function __construct($config=false){
        //配置
        if($config){
            $this->config = $config;
        }
        //创建socket;
        $this->socket = socket_create(AF_INET,SOCK_STREAM,6);
 
    }    
    public function __get($name){
        return $this->config[$name];
    }
    public function __set($name,$value){
        $this->config[$name] = $value;
        return;
    }
    /**
     * @param unknown $subject 标题
     * @param unknown $body 内容
     * @param unknown $to 收件人
     * @param string $to_name 收件人昵称
     * @param string $from_name 发件人昵称
     * @return boolean true 发送成功, false $this->error();
     */
    public function sendMail($subject,$body,$to,$to_name='尊贵的用户',$from_name='管理团队'){
        if($this->socket){
            //连接服务端;
            if(!socket_connect($this->socket,$this->mail_host,$this->mail_port)){
                $this->error='与SMTP服务器连接失败';
                return false;
            }else{
                if(substr($rep=socket_read($this->socket,1000,PHP_BINARY_READ),0,3)!=220){
                    $this->error =  'socket_connect错误: '.$reply;
                    return false;
                }
            }
            
            #####################################################################################
            //发送 HELO;
            if(!$this->send('EHLO ddd',250)) return false;
            //验证帐号;
            if(!$this->send('AUTH LOGIN '.base64_encode($this->username),334)) return false;
            //验证密码;
            if(!$this->send(base64_encode($this->password),235)) return false;            
           
            //发件人;
            if(!$this->send('MAIL FROM:<'.$this->mail_from.'>',250)) return false;
            //收件人;
            if(!$this->send('RCPT TO:<'.$to.'>',250)) return false;
            
            #####################################################################################
            //开始发送内容主体;
            if(!$this->send('DATA',354)) return false;
            #####################################################################################
            $rn   = "\r\n";
            
            //FROM;
            $data = 'FROM: "=?utf-8?B?'.base64_encode($from_name).'?="<'.$this->mail_from.'>'.$rn;
            
            //TO;
            $data.= 'TO: "=?utf-8?B?'.base64_encode($to_name).'?="'.'<'.$to.'>'.$rn;
            
            //标题;
            $data.= 'SUBJECT: '.$subject.$rn;
            
            //内容;
            $data.= $rn.$body.$rn;
            
            //结束;
            $data.= $rn.'.'.$rn;
            if(!$this->send($data,250)) return false;
            #####################################################################################
            
            //退出;
            socket_send($this->socket,'QUIT'.$rn,10,0);
            
            //释放;
            socket_close($this->socket);
            return true;
        }else{
            $this->error = '初始化失败,检查类的__construct()';
            return false;
        }
    }
    //发送socket;
    public function send($str,$code=250){
        //发送socket;
        /**
         * 这个函数很恶心的一点就是每次读取长度,如果不全读,下次还能读;
         */
        socket_send($this->socket,$str."\r\n",5000,0);
        $reply= socket_read($this->socket,6000,PHP_BINARY_READ);
        if(substr($reply,0,3)!=$code){
            $this->error =  '<font color="red">'.$str.'</font>: '.$reply;
            return false;
        }
        return true;
    }
}
?>
最佳答案
评论() 相关
后面还有条评论,点击查看>>