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程序设计有所帮助。