当前位置: 移动技术网 > IT编程>开发语言>PHP > php a simple smtp class

php a simple smtp class

2019年05月13日  | 移动技术网IT编程  | 我要评论
smtp.class.php
复制代码 代码如下:

<?php  

define('smtp_status_not_connected', 1, true); 
define('smtp_status_connected', 2, true); 

class smtp 


var $connection; 
var $recipients; 
var $headers; 
var $timeout; 
var $errors; 
var $status; 
var $body; 
var $from; 
var $host; 
var $port; 
var $helo; 
var $auth; 
var $user; 
var $pass; 
var $debug; 

/** 
* 参数为一个数组 
* host smtp 服务器的主机 默认:localhost 
* port smtp 服务器的端口 默认:25 
* helo 发送helo命令的名称 默认:localhost 
* user smtp 服务器的用户名 默认:空值 
* pass smtp 服务器的登陆密码 默认:空值 
* timeout 连接超时的时间 默认:5 
* @return bool 
*/ 

function smtp($params = array()) 


if(!defined('crlf')) define('crlf', “\r\n”, true); 

$this->timeout = 5; 
$this->status = smtp_status_not_connected; 
$this->host = ‘localhost'; 
$this->port = 25; 
$this->auth = false; 
$this->user = ”; 
$this->pass = ”; 
$this->errors = array(); 
$this->debug = false; 
foreach($params as $key => $value) 

$this->$key = $value; 


$this->helo = $this->host; 

// 如果没有设置用户名则不验证 
$this->auth = (” == $this->user) ? false : true; 


function connect($params = array()) 


if(!isset($this->status)) 

$obj = new smtp($params); 

if($obj->connect()) 

$obj->status = smtp_status_connected; 


return $obj; 


else 


$this->connection = fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout); 
socket_set_timeout($this->connection, 0, 250000); 

$greeting = $this->get_data(); 

if(is_resource($this->connection)) 

$this->status = 2; 
return $this->auth ? $this->ehlo() : $this->helo(); 

else 

$this->errors[] = ‘failed to connect to server: ‘.$errstr; 
return false; 




/** 
* 参数为数组 
* recipients 接收人的数组 
* from 发件人的地址,也将作为回复地址 
* headers 头部信息的数组 
* body 邮件的主体 
*/ 

function send($params = array()) 


foreach($params as $key => $value) 

$this->set($key, $value); 


if($this->is_connected()) 

// 服务器是否需要验证 
if($this->auth) 

if(!$this->auth()) return false; 


$this->mail($this->from); 

if(is_array($this->recipients)) 

foreach($this->recipients as $value) 

$this->rcpt($value); 


else 

$this->rcpt($this->recipients); 


if(!$this->data()) return false; 

$headers = str_replace(crlf.'.', crlf.'..', trim(implode(crlf, $this->headers))); 
$body = str_replace(crlf.'.', crlf.'..', $this->body); 
$body = $body[0] == ‘.' ? ‘.'.$body : $body; 

$this->send_data($headers); 
$this->send_data(”); 
$this->send_data($body); 
$this->send_data('.'); 

return (substr(trim($this->get_data()), 0, 3) === ‘250′); 

else 

$this->errors[] = ‘not connected!'; 
return false; 



function helo() 

if(is_resource($this->connection) 
and $this->send_data('helo ‘.$this->helo) 
and substr(trim($error = $this->get_data()), 0, 3) === ‘250′ ) 

return true; 


else 

$this->errors[] = ‘helo command failed, output: ‘ . trim(substr(trim($error),3)); 
return false; 



function ehlo() 

if(is_resource($this->connection) 
and $this->send_data('ehlo ‘.$this->helo) 
and substr(trim($error = $this->get_data()), 0, 3) === ‘250′ ) 

return true; 

else 

$this->errors[] = ‘ehlo command failed, output: ‘ . trim(substr(trim($error),3)); 
return false; 



function auth() 

if(is_resource($this->connection) 
and $this->send_data('auth login') 
and substr(trim($error = $this->get_data()), 0, 3) === ‘334′ 
and $this->send_data(base64_encode($this->user)) // send username 
and substr(trim($error = $this->get_data()),0,3) === ‘334′ 
and $this->send_data(base64_encode($this->pass)) // send password 
and substr(trim($error = $this->get_data()),0,3) === ‘235′ ) 

return true; 

else 

$this->errors[] = ‘auth command failed: ‘ . trim(substr(trim($error),3)); 
return false; 



function mail($from) 


if($this->is_connected() 
and $this->send_data('mail from:<'.$from.'>') 
and substr(trim($this->get_data()), 0, 2) === ‘250′ ) 

return true; 

else 

return false; 



function rcpt($to) 

if($this->is_connected() 
and $this->send_data('rcpt to:<'.$to.'>') 
and substr(trim($error = $this->get_data()), 0, 2) === ‘25′ ) 

return true; 

else 

$this->errors[] = trim(substr(trim($error), 3)); 
return false; 



function data() 


if($this->is_connected() 
and $this->send_data('data') 
and substr(trim($error = $this->get_data()), 0, 3) === ‘354′ ) 

return true; 

else 

$this->errors[] = trim(substr(trim($error), 3)); 
return false; 



function is_connected() 

return (is_resource($this->connection) and ($this->status === smtp_status_connected)); 


function send_data($data) 

if(is_resource($this->connection)) 

if($this->debug) 
echo nl2br($data.crlf); 
return fwrite($this->connection, $data.crlf, strlen($data)+2); 

else 

return false; 



function &get_data() 


$return = ”; 
$line = ”; 

if(is_resource($this->connection)) 

while(strpos($return, crlf) === false or substr($line,3,1) !== ‘ ‘) 

$line = fgets($this->connection, 512); 
$return .= $line; 

if($this->debug===true) 
echo nl2br($return.crlf); 
return $return; 


else 

return false; 



function set($var, $value) 

$this->$var = $value; 
return true; 

} // end of class 
?> 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网