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写的serv-u的web申请账号的程序
Oct 09 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
Jan 10 PHP
php实现执行某一操作时弹出确认、取消对话框
Dec 30 PHP
回帖脱衣服的图片实现代码
Feb 15 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
Mar 17 PHP
Yii实现显示静态页的方法
Apr 25 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
PHP耦合设计模式实例分析
Aug 08 PHP
PHP封装的mysqli数据库操作类示例
Feb 16 PHP
PHP levenshtein()函数用法讲解
Mar 08 PHP
PHP之认识(二)关于Traits的用法详解
Apr 11 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
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
杏林同学录(七)
2006/10/09 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
php验证session无效的解决方法
2014/11/04 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
php格式化金额函数分享
2015/02/02 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
2016/12/25 PHP
兼容IE与firefox火狐的回车事件(js与jquery)
2010/10/20 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
vue高德地图之玩转周边
2017/06/16 Javascript
js 倒计时(高效率服务器时间同步)
2017/09/12 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
Python模块学习 re 正则表达式
2011/05/19 Python
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
Python端口扫描简单程序
2016/11/10 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
大四本科生的自我评价
2013/12/30 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技