php基于socket实现SMTP发送邮件的方法_php教程-查字典教程网
php基于socket实现SMTP发送邮件的方法
php基于socket实现SMTP发送邮件的方法
发布时间:2016-12-29 来源:查字典编辑
摘要:本文实例讲述了php基于socket实现SMTP发送邮件的方法。分享给大家供大家参考。具体分析如下: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 = new MySendMail();

*

* $mail->setServer("smtp.126.com");

*

* $mail->setMailInfo($config);

* if(!$mail->sendMail()) {

* echo $mail->error();

* return 1;

* }

*/

class MySendMail {

/**

* @var 邮件传输代理用户名

* @access private

*/

private $_userName;

/**

* @var 邮件传输代理密码

* @access private

*/

private $_password;

/**

* @var 邮件传输代理服务器地址

* @access protected

*/

protected $_sendServer;

/**

* @var 邮件传输代理服务器端口

* @access protected

*/

protected $_port=25;

/**

* @var 发件人

* @access protected

*/

protected $_from;

/**

* @var 收件人

* @access protected

*/

protected $_to;

/**

* @var 主题

* @access protected

*/

protected $_subject;

/**

* @var 邮件正文

* @access protected

*/

protected $_body;

/**

* @var 是否是HTML格式的邮件

* @access protected

*/

protected $_isHTML=false;

/**

* @var socket资源

* @access protected

*/

protected $_socket;

/**

* @var 错误信息

* @access protected

*/

protected $_errorMessage;

public function __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;

}

}

/**

* 设置邮件传输代理

* @param string $server 代理服务器的ip或者域名

* @param int $port 代理服务器的端口,smtp默认25号端口

* @param int $localPort 本地端口

* @return boolean

*/

public function setServer($server, $port=25) {

if(!isset($server) || empty($server) || !is_string($server)) {

$this->_errorMessage = "first one is an invalid parameter";

return false;

}

if(!is_numeric($port)){

$this->_errorMessage = "first two is an invalid parameter";

return false;

}

$this->_sendServer = $server;

$this->_port = $port;

return true;

}

/**

* 设置邮件

* @access public

* @param array $config 邮件配置信息

* 包含邮件发送人、接收人、主题、内容、邮件传输代理的验证信息

* @return boolean

*/

public function setMailInfo($config) {

if(!is_array($config) || count($config) < 6){

$this->_errorMessage = "parameters are required";

return false;

}

$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'];

}

return true;

}

/**

* 发送邮件

* @access public

* @return boolean

*/

public function sendMail() {

$command = $this->getCommand();

$this->socket();

foreach ($command as $value) {

if($this->sendCommand($value[0], $value[1])) {

continue;

}

else{

return false;

}

}

$this->close(); //其实这里也没必要关闭,smtp命令:QUIT发出之后,服务器就关闭了连接,本地的socket资源会自动释放

echo 'Mail OK!';

return true;

}

/**

* 返回错误信息

* @return string

*/

public function error(){

if(!isset($this->_errorMessage)) {

$this->_errorMessage = "";

}

return $this->_errorMessage;

}

/**

* 返回mail命令

* @access protected

* @return array

*/

protected function getCommand() {

if($this->_isHTML) {

$mail = "MIME-Version:1.0rn";

$mail .= "Content-type:text/html;charset=utf-8rn";

$mail .= "FROM:test<" . $this->_from . ">rn";

$mail .= "TO:<" . $this->_to . ">rn";

$mail .= "Subject:" . $this->_subject ."rnrn";

$mail .= $this->_body . "rn.rn";

}

else{

$mail = "FROM:test<" . $this->_from . ">rn";

$mail .= "TO:<" . $this->_to . ">rn";

$mail .= "Subject:" . $this->_subject ."rnrn";

$mail .= $this->_body . "rn.rn";

}

$command = array(

array("HELO sendmailrn", 250),

array("AUTH LOGINrn", 334),

array(base64_encode($this->_userName) . "rn", 334),

array(base64_encode($this->_password) . "rn", 235),

array("MAIL FROM:<" . $this->_from . ">rn", 250),

array("RCPT TO:<" . $this->_to . ">rn", 250),

array("DATArn", 354),

array($mail, 250),

array("QUITrn", 221)

);

return $command;

}

/**

* @access protected

* @param string $command 发送到服务器的smtp命令

* @param int $code 期望服务器返回的响应吗

* @param boolean

*/

protected function sendCommand($command, $code) {

echo 'Send command:' . $command . ',expected code:' . $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)) {

return true;

}

else{

$this->_errorMessage = "Error:" . $data . "|**| command:";

return false;

}

}

else{

$this->_errorMessage = "Error:" . socket_strerror(socket_last_error());

return false;

}

}

else{

$this->_errorMessage = "Error:" . socket_strerror(socket_last_error());

return false;

}

}catch(Exception $e) {

$this->_errorMessage = "Error:" . $e->getMessage();

}

}

/**

* 建立到服务器的网络连接

* @access private

* @return boolean

*/

private function socket() {

if(!function_exists("socket_create")) {

$this->_errorMessage = "extension php-sockets must be enabled";

return false;

}

//创建socket资源

$this->_socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));

if(!$this->_socket) {

$this->_errorMessage = socket_strerror(socket_last_error());

return false;

}

//连接服务器

if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) {

$this->_errorMessage = socket_strerror(socket_last_error());

return false;

}

socket_read($this->_socket, 1024);

return true;

}

/**

* 关闭socket

* @access private

* @return boolean

*/

private function close() {

if(isset($this->_socket) && is_object($this->_socket)) {

$this->_socket->close();

return true;

}

$this->_errorMessage = "no resource can to be close";

return false;

}

}

/**************************** Test ***********************************/

$config = array(

"from" => "XXXXX",

"to" => "XXXXX",

"subject" => "test",

"body" => "<b>test</b>",

"username" => "XXXXX",

"password" => "******",

//"isHTML" => true

);

$mail = new MySendMail();

$mail->setServer("smtp.126.com");

$mail->setMailInfo($config);

if(!$mail->sendMail()) {

echo $mail->error();

return 1;

}

希望本文所述对大家的php程序设计有所帮助。

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新php教程学习
    热门php教程学习
    编程开发子分类