<?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;
}
}
?> 最佳答案