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 相关文章推荐
简单介绍下 PHP5 中引入的 MYSQLI的用途
Mar 19 PHP
discuz安全提问算法
Jun 06 PHP
php获取post中的json数据的实现方法
Jun 08 PHP
PHP页面中文乱码分析
Oct 29 PHP
PHP Curl出现403错误的解决办法
May 29 PHP
PHP比你想象的好得多
Nov 27 PHP
php+ajax实时输入自动搜索匹配的方法
Dec 26 PHP
php开发中的页面跳转方法总结
Apr 26 PHP
php模板引擎技术简单实现
Mar 15 PHP
php微信公众号开发之翻页查询
Oct 20 PHP
php测试kafka项目示例
Feb 06 PHP
laravel与thinkphp之间的区别与优缺点
Mar 02 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和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
解析smarty 截取字符串函数 truncate的用法介绍
2013/06/20 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
JavaScript模块随意拖动示例代码
2014/05/27 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
利用jquery操作Radio方法小结
2014/10/20 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
[56:18]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python实现根据图标提取分类应用程序实例
2014/09/28 Python
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
python爬虫的工作原理
2017/03/05 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
公司采购主管岗位职责
2014/06/17 职场文书
公司证明怎么写
2014/09/22 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
工作感想范文
2015/08/07 职场文书
Python实现简繁体转换
2021/06/07 Python
Java实现简易的分词器功能
2021/06/15 Java/Android
python中subplot大小的设置步骤
2021/06/28 Python
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL