php a simple smtp class


Posted in PHP onNovember 26, 2007

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  
?> 

PHP 相关文章推荐
PHP安全配置
Oct 09 PHP
PHP的FTP学习(四)
Oct 09 PHP
php 之 没有mysql支持时的替代方案
Oct 09 PHP
php 服务器调试 Zend Debugger 的安装教程
Sep 25 PHP
为PHP初学者的8点有效建议
Nov 20 PHP
php !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
Jan 07 PHP
php像数组一样存取和修改字符串字符
Mar 21 PHP
PHP读取大文件的类SplFileObject使用介绍
Apr 09 PHP
php分割合并两个字符串的函数实例
Jun 19 PHP
php实现编辑和保存文件的方法
Jul 20 PHP
PHP实现的XML操作类【XML Library】
Dec 29 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
May 29 PHP
PHP 文件上传进度条的两种实现方法的代码
Nov 25 #PHP
分页详解 从此分页无忧(PHP+mysql)
Nov 23 #PHP
php Mysql日期和时间函数集合
Nov 16 #PHP
PHP编程中字符串处理的5个技巧小结
Nov 13 #PHP
表单复选框向PHP传输数据的代码
Nov 13 #PHP
实用函数10
Nov 08 #PHP
实用函数9
Nov 08 #PHP
You might like
浅析PHP中Collection 类的设计
2013/06/21 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
php控制文件下载速度的方法
2015/03/24 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
js控制表单操作的常用代码小结
2013/08/15 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
Javascript 浮点运算精度问题分析与解决
2014/03/26 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
python笔记(2)
2012/10/24 Python
Python正规则表达式学习指南
2016/08/02 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
Born鞋子官网:Born Shoes
2017/04/06 全球购物
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
Yahoo的PHP面试题
2014/05/26 面试题
优秀党员主要事迹
2014/01/19 职场文书
投资意向书范本
2014/04/01 职场文书
大学第二课堂活动总结
2014/07/08 职场文书
离婚协议书格式
2015/01/26 职场文书
2015年实习单位评语
2015/03/25 职场文书
纪委立案决定书
2015/06/24 职场文书
浅谈Python列表嵌套字典转化的问题
2021/04/07 Python