php基于socket实现SMTP发送邮件的方法
来源: 阅读:885 次 日期:2015-03-09 15:55:23
温馨提示: 小编为您整理了“php基于socket实现SMTP发送邮件的方法”,方便广大网友查阅!

这篇文章主要介绍了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.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("HELO sendmail\r\n", 250),

array("AUTH LOGIN\r\n", 334),

array(base64_encode($this->_userName) . "\r\n", 334),

array(base64_encode($this->_password) . "\r\n", 235),

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

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

array("DATA\r\n", 354),

array($mail, 250),

array("QUIT\r\n", 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程序设计有所帮助。

更多信息请查看IT技术专栏

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2025国考·省考课程试听报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map