php基于socket实现SMTP发送邮件的方法
本文实例讲述了php基于socket实现SMTP发送邮件的方法。分享给大家供大家参考。具体分析如下:
php采用socket通过SMTP发送邮件。
用的是php的php-sockets扩展,可以发送纯文本和html格式的邮件。代码如下:
<?php
/**
*邮件发送类
*支持发送纯文本邮件和HTML格式的邮件
*@example
*$config=array(
* "from"=>"*****",
* "to"=>"***",
* "subject"=>"test",
* "body"=>"<b>test</b>",
* "username"=>"***",
* "password"=>"****",
* "isHTML"=>true
* );
*
*$mail=newMySendMail();
*
*$mail->setServer("smtp.126.com");
*
*$mail->setMailInfo($config);
*if(!$mail->sendMail()){
* echo$mail->error();
* return1;
*}
*/
classMySendMail{
/**
*@var邮件传输代理用户名
*@accessprivate
*/
private$_userName;
/**
*@var邮件传输代理密码
*@accessprivate
*/
private$_password;
/**
*@var邮件传输代理服务器地址
*@accessprotected
*/
protected$_sendServer;
/**
*@var邮件传输代理服务器端口
*@accessprotected
*/
protected$_port=25;
/**
*@var发件人
*@accessprotected
*/
protected$_from;
/**
*@var收件人
*@accessprotected
*/
protected$_to;
/**
*@var主题
*@accessprotected
*/
protected$_subject;
/**
*@var邮件正文
*@accessprotected
*/
protected$_body;
/**
*@var是否是HTML格式的邮件
*@accessprotected
*/
protected$_isHTML=false;
/**
*@varsocket资源
*@accessprotected
*/
protected$_socket;
/**
*@var错误信息
*@accessprotected
*/
protected$_errorMessage;
publicfunction__construct($from="",$to="",$subject="",$body="",$server="",$username="",$password="",$isHTML="",$port=""){
if(!empty($from)){
$this->_from=$from;
}
if(!empty($to)){
$this->_to=$to;
}
if(!empty($subject)){
$this->_subject=$subject;
}
if(!empty($body)){
$this->_body=$body;
}
if(!empty($isHTML)){
$this->_isHTML=$isHTML;
}
if(!empty($server)){
$this->_sendServer=$server;
}
if(!empty($port)){
$this->_port=$port;
}
if(!empty($username)){
$this->_userName=$username;
}
if(!empty($password)){
$this->_password=$password;
}
}
/**
*设置邮件传输代理
*@paramstring$server代理服务器的ip或者域名
*@paramint$port代理服务器的端口,smtp默认25号端口
*@paramint$localPort本地端口
*@returnboolean
*/
publicfunctionsetServer($server,$port=25){
if(!isset($server)||empty($server)||!is_string($server)){
$this->_errorMessage="firstoneisaninvalidparameter";
returnfalse;
}
if(!is_numeric($port)){
$this->_errorMessage="firsttwoisaninvalidparameter";
returnfalse;
}
$this->_sendServer=$server;
$this->_port=$port;
returntrue;
}
/**
*设置邮件
*@accesspublic
*@paramarray$config邮件配置信息
*包含邮件发送人、接收人、主题、内容、邮件传输代理的验证信息
*@returnboolean
*/
publicfunctionsetMailInfo($config){
if(!is_array($config)||count($config)<6){
$this->_errorMessage="parametersarerequired";
returnfalse;
}
$this->_from=$config['from'];
$this->_to=$config['to'];
$this->_subject=$config['subject'];
$this->_body=$config['body'];
$this->_userName=$config['username'];
$this->_password=$config['password'];
if(isset($config['isHTML'])){
$this->_isHTML=$config['isHTML'];
}
returntrue;
}
/**
*发送邮件
*@accesspublic
*@returnboolean
*/
publicfunctionsendMail(){
$command=$this->getCommand();
$this->socket();
foreach($commandas$value){
if($this->sendCommand($value[0],$value[1])){
continue;
}
else{
returnfalse;
}
}
$this->close();//其实这里也没必要关闭,smtp命令:QUIT发出之后,服务器就关闭了连接,本地的socket资源会自动释放
echo'MailOK!';
returntrue;
}
/**
*返回错误信息
*@returnstring
*/
publicfunctionerror(){
if(!isset($this->_errorMessage)){
$this->_errorMessage="";
}
return$this->_errorMessage;
}
/**
*返回mail命令
*@accessprotected
*@returnarray
*/
protectedfunctiongetCommand(){
if($this->_isHTML){
$mail="MIME-Version:1.0\r\n";
$mail.="Content-type:text/html;charset=utf-8\r\n";
$mail.="FROM:test<".$this->_from.">\r\n";
$mail.="TO:<".$this->_to.">\r\n";
$mail.="Subject:".$this->_subject."\r\n\r\n";
$mail.=$this->_body."\r\n.\r\n";
}
else{
$mail="FROM:test<".$this->_from.">\r\n";
$mail.="TO:<".$this->_to.">\r\n";
$mail.="Subject:".$this->_subject."\r\n\r\n";
$mail.=$this->_body."\r\n.\r\n";
}
$command=array(
array("HELOsendmail\r\n",250),
array("AUTHLOGIN\r\n",334),
array(base64_encode($this->_userName)."\r\n",334),
array(base64_encode($this->_password)."\r\n",235),
array("MAILFROM:<".$this->_from.">\r\n",250),
array("RCPTTO:<".$this->_to.">\r\n",250),
array("DATA\r\n",354),
array($mail,250),
array("QUIT\r\n",221)
);
return$command;
}
/**
*@accessprotected
*@paramstring$command发送到服务器的smtp命令
*@paramint$code期望服务器返回的响应吗
*@paramboolean
*/
protectedfunctionsendCommand($command,$code){
echo'Sendcommand:'.$command.',expectedcode:'.$code.'<br/>';
//发送命令给服务器
try{
if(socket_write($this->_socket,$command,strlen($command))){
//读取服务器返回
$data=trim(socket_read($this->_socket,1024));
echo'response:'.$data.'<br/><br/>';
if($data){
$pattern="/^".$code."/";
if(preg_match($pattern,$data)){
returntrue;
}
else{
$this->_errorMessage="Error:".$data."|**|command:";
returnfalse;
}
}
else{
$this->_errorMessage="Error:".socket_strerror(socket_last_error());
returnfalse;
}
}
else{
$this->_errorMessage="Error:".socket_strerror(socket_last_error());
returnfalse;
}
}catch(Exception$e){
$this->_errorMessage="Error:".$e->getMessage();
}
}
/**
*建立到服务器的网络连接
*@accessprivate
*@returnboolean
*/
privatefunctionsocket(){
if(!function_exists("socket_create")){
$this->_errorMessage="extensionphp-socketsmustbeenabled";
returnfalse;
}
//创建socket资源
$this->_socket=socket_create(AF_INET,SOCK_STREAM,getprotobyname('tcp'));
if(!$this->_socket){
$this->_errorMessage=socket_strerror(socket_last_error());
returnfalse;
}
//连接服务器
if(!socket_connect($this->_socket,$this->_sendServer,$this->_port)){
$this->_errorMessage=socket_strerror(socket_last_error());
returnfalse;
}
socket_read($this->_socket,1024);
returntrue;
}
/**
*关闭socket
*@accessprivate
*@returnboolean
*/
privatefunctionclose(){
if(isset($this->_socket)&&is_object($this->_socket)){
$this->_socket->close();
returntrue;
}
$this->_errorMessage="noresourcecantobeclose";
returnfalse;
}
}
/****************************Test***********************************/
$config=array(
"from"=>"XXXXX",
"to"=>"XXXXX",
"subject"=>"test",
"body"=>"<b>test</b>",
"username"=>"XXXXX",
"password"=>"******",
//"isHTML"=>true
);
$mail=newMySendMail();
$mail->setServer("smtp.126.com");
$mail->setMailInfo($config);
if(!$mail->sendMail()){
echo$mail->error();
return1;
}
希望本文所述对大家的php程序设计有所帮助。