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中unlink()、mkdir()、rmdir()等方法的使用介绍
Dec 21 PHP
PHP对MongoDB[NoSQL]数据库的操作
Mar 01 PHP
php生成缩略图填充白边(等比缩略图方案)
Dec 25 PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
服务器上配置PHP运行环境教程
Feb 12 PHP
php生成图片缩略图的方法
Apr 07 PHP
php类的定义与继承用法实例
Jul 07 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
php多线程并发实现方法
Sep 30 PHP
Yii2.0 RESTful API 基础配置教程详解
Dec 26 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 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 木马攻击防御技巧
2009/06/13 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
学习php开源项目的源码指南
2014/12/21 PHP
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
js字符串转换成xml对象并使用技巧解读
2013/04/18 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
a标签的href与onclick事件的区别详解
2014/11/12 Javascript
JSON取值前判断
2014/12/23 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
浅谈微信页面入口文件被缓存解决方案
2018/09/29 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
3个用于数据科学的顶级Python库
2018/09/29 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
详解Flask前后端分离项目案例
2020/07/24 Python
澳大利亚相机之家:Camera House
2017/11/30 全球购物
高级技校毕业生自荐信
2013/11/18 职场文书
仓库主管的岗位职责
2013/12/04 职场文书
十岁生日家长答谢词
2014/01/17 职场文书
物业管理毕业生的自我评价
2014/02/17 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python