当前位置: 首页 > 图文教程 > 网络编程 > PHP > php a simple smtp class

PHP
需要发散思维学习PHP
php 图片上添加透明度渐变的效果
php 图片上传类代码
PHP 生成的XML以FLASH获取为乱码终极解决
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
PHP DataGrid 实现代码
MayFish PHP的MVC架构的开发框架
PHP 实现多服务器共享 SESSION 数据
PHP 开源框架22个简单简介
PHP 数组遍历顺序理解
PHPLog php 程序调试追踪工具
PHP 分页类(模仿google)-面试题目解答
火车头discuz6.1 完美采集的php接口文件
Discuz 6.0+ 批量注册用户名
使用php来实现网络服务
火车采集器 免费版使出收费版本功能实现原理
php程序之die调试法 快速解决错误
PHP 日常开发小技巧
PHP下通过系统信号量加锁方式获取递增序列ID
php 代码优化的42条建议 推荐

PHP 中的 php a simple smtp class


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 94 ::
收藏到网摘: n/a

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