php a simple smtp class

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

(0)

相关推荐

  • php利用smtp类实现电子邮件发送

    smtp类发送邮件的方法既简单又稳定,几行简单的配置就能发邮件,是不是很期待的试一试呢! 以下就是核心代码: <?php require_once "email.class.php"; //******************** 配置信息 ******************************** $smtpserver = "smtp.126.com";//SMTP服务器 $smtpserverport =25;//SMTP服务器端口 $smtpus

  • PHP mail 通过Windows的SMTP发送邮件失败的解决方案

    原因必定在WordPress的php邮件发送类中.轻松Google到了原因:原来Windows的SMTP服务不支持Name<address@domain.com>这样的邮件格式,必须直接写成address@domain.com.于是把WordPress的class-phpmailer.php中的这行 复制代码 代码如下: $from[0][1] = $this->FromName; 注释掉就OK了.

  • php中通过curl smtp发送邮件

    先google了一下,发现很多问相关问题的但没有相关的解答,在phpclasses里也没有找到相关的类于是自己边看stmp的相关协议边开始尝试curl SMTP协议 这个在网上可以找到多相关的例子,可以自己实验一下使用telnet去连接mail服务器 复制代码 代码如下: $ telnet 邮箱SMTP服务地址 25 Trying 邮箱服务IP地址... Connected to 邮箱SMTP服务地址. Escape character is '^]'. exchange邮箱服务器地址 Micr

  • php基于socket实现SMTP发送邮件的方法

    本文实例讲述了php基于socket实现SMTP发送邮件的方法.分享给大家供大家参考.具体分析如下: php采用socket通过SMTP发送邮件. 用的是php的php-sockets扩展,可以发送纯文本和html格式的邮件.代码如下: 复制代码 代码如下: <?php /** * 邮件发送类 * 支持发送纯文本邮件和HTML格式的邮件 * @example * $config = array( *       "from" => "*****", * 

  • PHP实现支持SSL连接的SMTP邮件发送类

    本文实例讲述了PHP实现支持SSL连接的SMTP邮件发送类.分享给大家供大家参考.具体如下: 该实例代码测试过了gmail和QQ邮箱的SMTP.具体代码如下: 复制代码 代码如下: <?php /** * 邮件发送类 * 支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送,带附件(单个或多个附件),支持到服务器的ssl连接 * 需要的php扩展:sockets.Fileinfo和openssl. * 编码格式是UTF-8,传输编码格式是base64 * @example *

  • PHPMailer邮件类利用smtp.163.com发送邮件方法

    第一步:需要下载PHPMailer文件包phpmailer-1.73.tar.gz 来自开源社区: http://phpmailer.sourceforge.net/ 第二步:确认你的服务器系统已经支持socket 如下图,通过phpinfo();查看是否支持sockets 如果没有这一项就请注意: socket 是属于PHP扩展部分,编译时必须给定一个用于./configure --enable-sockets 的配置选项. 第三步:把文件解压到你的web服务器目录下,调用类就可以了,说明:首

  • php中通过smtp发邮件的类,测试通过

    smtp.php 复制代码 代码如下: <?php class smtp {     /* Public Variables */     var $smtp_port;     var $time_out;     var $host_name;     var $log_file;     var $relay_host;     var $debug;     var $auth;     var $user;     var $pass; /* Private Variables */ 

  • php使用pear_smtp发送邮件

    PHP自带的mail函数比较蛋疼,在win下配置了sendmail还是无法发送邮件.而使用第三方的pear/mail可以直接通过smtp连接邮件发送服务器.如(smtp.163.com).从而没有必要在本机上安装sendmail等类似软件. 确保PEAR Mail包已经安装. <?php require_once "vendor/autoload.php"; $from = "test<test@163.com>"; $to = "tes

  • php使用smtp发送支持附件的邮件示例

    轻量级PHP邮件发送,需要有smtp服务器,代码经过多次实战使用,现在把代码分享给大家 复制代码 代码如下: <?php/*邮件发送smtp服务联结smtp服务器,进行邮件发送,版权所有,不能复制@author:jackbrown;@qq: 610269963 @time:2011-8-20;@version:1.0.3;*/class smtp{ /*邮件用户名*/ public $mailUser = MAIL_USER; /*邮件密码*/ public $mailPwd = MAIL_PW

  • php mailer类调用远程SMTP服务器发送邮件实现方法

    本文实例讲述了php mailer类调用远程SMTP服务器发送邮件实现方法.分享给大家供大家参考,具体如下: php mailer 是一款很好用的php电子邮件发送类模块,可以调用本地的smtp发送电子邮件,也可以调用远程的smtp发送电子邮件,但是使用时需要注意一些事项,否则就会造成发送失败,或者根本不能调用的情况,本文就我在使用这个类时,遇到的问题和解决办法进行展开,简要说明一下php mailer的用法,及注意事项. 首先下载phpmailer类库文件,在这里下载,只需一个资源分. 下载地

  • php下使用SMTP发邮件的代码

    最近一个项目需要用到SMTP发送邮件,之前的库类不存在了,又不喜欢安装pear或者使用pear的net/smtp类,感觉太复杂了.就直接从discuz中抽取出核心稍微修改了下.    从协议分析网上,查找到SMTP协议的命令和应答,SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP命令和接收SMTP反馈的应答来完成的.常用的命令如下:    HELLO<domain><CRLF>识别发送方到接收SMTP的一个HELLO命令    MAIL FROM:<

  • PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)

    smtp.php <?phpclass smtp { /* Public Variables */ var $smtp_port; var $time_out; var $host_name; var $log_file; var $relay_host; var $debug; var $auth; var $user; var $pass; /* Private Variables */ var $sock; /* Constractor */ function smtp($relay_ho

  • php通过smtp邮件验证登陆的方法

    本文实例讲述了php通过smtp邮件验证登陆的方法.分享给大家供大家参考,具体如下: 内网的系统为了统一账号,都采用用邮件账号登陆的方式,所以有了以下程序 /** * 通过邮件 验证登陆 * 这里要明白的是用户名是 带域名的:aaa@163.com */ function valideEmailLogin($user, $pass, $smtp_server= 'smtp.163.com', $port=25) { $handle = fsockopen($smtp_server, $port)

随机推荐