首 页   · 站长博客 · 用户注册 · 会员登陆  · 会员排行  ·最新主题  ·最近回复  精华区  版权声明  ·论坛管理
  当前登录身份:游客,请先登录。  笔名: 口令: 验证码:   
楼 主  index »  PHP原创源码发布区 » 本站原创PHP邮件发送类【实测可运行】  


  作者:一起PHP
  注册时间:2004-02-27
  主题/回复:247/1521
  积分:4649
  等级:★★★★★☆(十一级)
  称号:论坛圣人

  nqp@nqp.me
  4304410
  www.nqp.me

 

 发表:2007-11-23 22:15:25 阅读 6545 次 回复 10 次 得分10  |   字号 字色
本站原创PHP邮件发送类【实测可运行】
 
[注]11月15日又增加了支持HTML邮件功能和显示发信人姓名的功能.
    本文涉及到的两个程序完全源代码可通过以下地址下载:
    http://bbs.17php.com/download/code/email.rar

    今天应群中“体会BOB”的要求,参考其他资料,编写了一个PHP邮件发送的类。经过实测运行高效稳定。不需要借助任何组件,只需要一个SMTP服务器和帐号即可。当前各大门户网站的免费信箱都提供SMTP服务。只需要注册一个免费信箱,即可通过此PHP类直接向其他任意信箱发送邮件。

全部代码如下:

PhpMailer.php
代码如下:
<?php
/************************************************
 * 有身份验证的电子邮件发送类(PHP)
 * 使用本类发送邮件需要一个SMTP服务器地址以及一个合法帐号
 * 如163的SMTP地址为:smtp.163.split.netease.com
 * 合法帐号可以通过随意注册一个免费信箱来获得。
 * 改编 一起PHP技术联盟 www.17php.com rznqp@163.com
 * 本类的SMTP协议实现部分借鉴了其他开发者的成果,一并致谢。
 *  2007.11 欢迎使用
 ***********************************************/
class PhpMailer{
var $smtpHost;
var $smtpUser;
var $smtpPass;
var $mailFrom;
 /* 邮件正文的格式,默认支持HTML代码
  * 可选项 plain :文本格式
  *    html  :HTML格式
  */
 var $contentType = "html";
var $errMsg = '';
/**
 * 3参数构造器
 * @param String $host SMTP服务器
 * @param String $user 帐号名
 * @param String $pass 密码
 * 无返回值
 */
function __construct($host,$user,$pass){
$this->smtpHost = $host;
$this->smtpUser = $user;
$this->smtpPass = $pass;
$this->mailFrom = $this->smtpUser;
}
    /**
 * 发送邮件
 * @param String $addr 收件人的E-mail地址
 * @param String $fromName 显示的发件人姓名
 * @param String $title 邮件标题
 * @param String $content 邮件正文
 * 返回 布尔型:成功返回true,否则返回false
 */
    function send($addr,$fromName,$title,$content){
     $headers = "Content-Type: text/".$this->contentType."; charset=\"gb2312\"
Content-Transfer-Encoding: base64"; 
     $lb="
"; 
     $hdr = explode($lb,$headers);
     if($content){
   $bdy = preg_replace("/^./","..",explode($lb,$content));

$smtp = array( 
array("EHLO hello".$lb,"220,250","EHLO error: "), 
array("AUTH LOGIN".$lb,"334","AUTH error:"), 
array(base64_encode($this->smtpUser).$lb,"334","AUTHENTIFICATION error : "), 
array(base64_encode($this->smtpPass).$lb,"235","AUTHENTIFICATION error : ")
); 
$smtp[] = array("MAIL FROM: <".$this->mailFrom.">".$lb,"250","MAIL FROM error: "); 
$smtp[] = array("RCPT TO: <".$addr.">".$lb,"250","RCPT TO error: "); 
$smtp[] = array("DATA".$lb,"354","DATA error: "); 
$smtp[] = array("From: ".$fromName.$lb,"",""); 
$smtp[] = array("To: ".$addr.$lb,"",""); 
$smtp[] = array("Subject: ".$title.$lb,"",""); 
foreach($hdr as $h) {
     $smtp[] = array($h.$lb,"","");

$smtp[] = array($lb,"",""); 
if($bdy) {
   foreach($bdy as $b) {
      $smtp[] = array(base64_encode($b.$lb).$lb,"","");
    }

$smtp[] = array(".".$lb,"250","DATA(end)error: "); 
$smtp[] = array("QUIT".$lb,"221","QUIT error: "); 
//打开SOCKET
$fp = @fsockopen($this->smtpHost, 25); 
if (!$fp) $this->errMsg = "<b>错误:</b> 无法连接到 ".$this->smtpHost.""; 
while($result = @fgets($fp, 1024)){
   if(substr($result,3,1) == " ") { break; }
}   
foreach($smtp as $req){ 
@fputs($fp, $req[0]); 
if($req[1]){ 
   while($result = @fgets($fp, 1024)){ 
    if(substr($result,3,1) == " ") { break; } 
   }; 
if (!strstr($req[1],substr($result,0,3))){ 
     $this->errMsg.=$req[2].$result.""; 



@fclose($fp); 
if($this->errMsg ==''){
return true; 
}else{
return false;
}
    }
}
?>



这个类文件对邮件发送操作进行了封装,使用时不需要做任何更改。只需要在需要发送邮件的程序中包含即可。下面是一个使用的例子:

example.php
代码如下:

<?php
/******************************************
 * PhpMailer类使用方法演示程序
 ******************************************/
 require_once('PhpMailer.php');
 $test =new PhpMailer("smtp.xxx.com","name@yourhost.com","yourpassword");
 $send =$test->send("rznqp@163.com","一起PHP","邮件标题","邮件内容(支持HTML)");

 if($send){
  echo "发送成功。";
 }else{
  echo "发送失败。错误信息:".$test->errMsg;
 }
?>



注释:

$test = new PhpMailer(参数1,参数2,参数3)

  创建类对象。三个参数为必填。分别表示 SMTP服务器地址、用户名、密码(用户名为完整的邮件地址格式)。
  如使用163的SMTP: smtp.163.split.netease.com 用户名abc@163.com 密码 123456。

$send = $test->send(参数1,参数2,参数3,参数4)

  调用 send()方法发送邮件,四个参数为必填。分别表示收信人地址、发信人姓名、邮件标题、邮件正文。
   $send接收返回结果。发送成功返回true,失败返回false。并将失败原因存放在errMsg变量中。


经测试本程序运行稳定。
本类欢迎使用、转载。但使用或转载请注明出处和作者,谢谢合作。  

(本帖被作者修改过1次,最后一次修改时间2009-01-06 11:13:37)

 
 1#楼  
 
  回复人:hxh7252
  注册时间:2008-01-12
  主题/回复:1/1
  积分:33
  等级:★(二级)
  称号:初出茅庐

   
 1#楼 发表于2008-01-12 11:47:06  评分:1 

回复给楼主(一起PHP)
 2#楼  
 
  回复人:lc0633
  注册时间:2007-08-08
  主题/回复:1/8
  积分:427
  等级:★★☆(五级)
  称号:略有小成

   
 2#楼 发表于2008-04-02 14:28:30  评分:1 

回复给楼主(一起PHP)
先收藏·
 3#楼  
 
  回复人:lc0633
  注册时间:2007-08-08
  主题/回复:1/8
  积分:427
  等级:★★☆(五级)
  称号:略有小成

   
 3#楼 发表于2008-04-02 14:33:17  评分:1 

回复给楼主(一起PHP)
先收藏·
 4#楼  
 
  回复人:kiril
  注册时间:2008-06-13
  主题/回复:12/38
  积分:113
  等级:★☆(三级)
  称号:牛刀小试

用户联系方式已设置为保密
 4#楼 发表于2008-06-13 16:22:39  评分:1 

回复给楼主(一起PHP)
非常好,谢谢了,下载下来学习下
 5#楼  
 
  回复人:kiril
  注册时间:2008-06-13
  主题/回复:12/38
  积分:113
  等级:★☆(三级)
  称号:牛刀小试

用户联系方式已设置为保密
 5#楼 发表于2008-06-13 16:55:50  评分:1 

回复给楼主(一起PHP)
非常好,谢谢了,下载下来学习下
 6#楼  
 
  回复人:coolboy0316
  注册时间:2008-03-11
  主题/回复:19/44
  积分:367
  等级:★★(四级)
  称号:崭露头角

   
 6#楼 发表于2008-09-24 10:36:22  评分:1 

回复给楼主(一起PHP)
试了一下,但是不行?
不过谢谢楼主啊!
 7#楼  
 
  回复人:hello123
  注册时间:2009-11-27
  主题/回复:0/1
  积分:23
  等级:★(二级)
  称号:初出茅庐

   
 7#楼 发表于2009-11-27 19:08:32  评分:1 

回复给楼主(一起PHP)
呵呵good
 8#楼  
 
  回复人:ljw
  注册时间:2010-06-24
  主题/回复:0/1
  积分:22
  等级:★(二级)
  称号:初出茅庐

   
 8#楼 发表于2010-06-24 16:03:48  评分:1 

回复给楼主(一起PHP
不错
 9#楼  
 
  回复人:liooil
  注册时间:2010-10-25
  主题/回复:0/1
  积分:22
  等级:★(二级)
  称号:初出茅庐

用户联系方式已设置为保密
 9#楼 发表于2010-10-25 11:18:39  评分:1 

回复给楼主(一起PHP)
支持一个!谢谢!!
 10#楼  
 
  回复人:lixiuran1991
  注册时间:2012-05-05
  主题/回复:2/2
  积分:52
  等级:★(二级)
  称号:初出茅庐

   
 10#楼 发表于2012-05-06 22:37:12  评分:1 

回复给楼主(一起PHP)
perfect,copy first........
  页数1/1首页 « 1 » 末页
  发表回复:您还没有登陆,无法发表回复。请先[登陆]

一起PHP技术联盟 主办:一起PHP 联系方式:站长QQ:4304410 QQ群:8423742 20159565 站长博客 E-mail: nqp@nqp.me 执行时间:0.022sec
SimsmaBBS 2008 (v6.0) Developed by 17php.com,Copyright(C)2003-2010 All rights reserved. 副本授权:一起PHP官方专用版