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 COOKIE设置为浏览器进程
Jun 21 PHP
php 将bmp图片转为jpg等其他任意格式的图片
Jun 21 PHP
javascript 小型动画组件与实现代码
Jun 02 PHP
PHP程序员最常犯的11个MySQL错误小结
Nov 20 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
Jul 25 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
Nov 04 PHP
php实现RSA加密类实例
Mar 26 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
Jul 31 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
Dec 07 PHP
php防止sql注入的方法详解
Feb 20 PHP
PHP chunk_split()函数讲解
Feb 12 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设计聊天室步步通
2006/10/09 PHP
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
PHP中设置时区,记录日志文件的实现代码
2013/01/07 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
php设计模式之单例模式代码
2016/06/11 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
JavaScript Chart 插件整理
2010/06/18 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
js树插件zTree获取所有选中节点数据的方法
2015/01/28 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
package.json文件配置详解
2017/06/15 Javascript
layui实现三级联动效果
2019/07/26 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
对Python中gensim库word2vec的使用详解
2018/05/08 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
2020/05/07 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
HTML5标签嵌套规则详解【必看】
2016/04/26 HTML / CSS
彪马美国官网:PUMA美国
2017/03/09 全球购物
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
C++的几个面试题附答案
2016/08/03 面试题
秘书专业自荐信范文
2013/12/26 职场文书
教师试用期自我鉴定
2014/02/12 职场文书
奠基仪式主持词
2014/03/20 职场文书
社区交通安全实施方案
2014/03/22 职场文书
演讲比赛策划方案
2014/06/11 职场文书
2015入党个人自传范文
2015/06/26 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书
golang中实现给gif、png、jpeg图片添加文字水印
2021/04/26 Golang
实操Python爬取觅知网素材图片示例
2021/11/27 Python