功能齐全的PHP发送邮件类代码附详细说明


Posted in PHP onJuly 10, 2008

<?php 
class Email { 
//---设置全局变量 
var $mailTo = ""; // 收件人 
var $mailCC = ""; // 抄送 
var $mailBCC = ""; // 秘密抄送 
var $mailFrom = ""; // 发件人 
var $mailSubject = ""; // 主题 
var $mailText = ""; // 文本格式的信件主体 
var $mailHTML = ""; // html格式的信件主体 
var $mailAttachments = ""; // 附件 
/* 函数setTo($inAddress) :用于处理邮件的地址 参数 $inAddress 
为包涵一个或多个字串,email地址变量,使用逗号来分割多个邮件地址 
默认返回值为true 
**********************************************************/ 
function setTo($inAddress){ 
//--用explode()函数根据”,”对邮件地址进行分割 
$addressArray = explode( ",",$inAddress); 
//--通过循环对邮件地址的合法性进行检查 
for($i=0;$i<count($addressArray);$i++){ if($this->checkEmail($addressArray[$i])==false) return false; } 
//--所有合法的email地址存入数组中 
$this->mailTo = implode($addressArray, ","); 
return true; } 
/************************************************** 
函数 setCC($inAddress) 设置抄送人邮件地址 
参数 $inAddress 为包涵一个或多个邮件地址的字串,email地址变量, 
使用逗号来分割多个邮件地址 默认返回值为true 
**************************************************************/ 
function setCC($inAddress){ 
//--用explode()函数根据”,”对邮件地址进行分割 
$addressArray = explode( ",",$inAddress); 
//--通过循环对邮件地址的合法性进行检查 
for($i=0;$i<count($addressArray);$i++){ if($this->checkEmail($addressArray[$i])==false) return false; } 
//--所有合法的email地址存入数组中 
$this->mailCC = implode($addressArray, ","); 
return true; } 
/*************************************************** 
函数setBCC($inAddress) 设置秘密抄送地址 参数 $inAddress 为包涵一个或多 
个邮件地址的字串,email地址变量,使用逗号来分割多个邮件地址 默认返回值为 
true 
******************************************/ 
function setBCC($inAddress){ 
//--用explode()函数根据”,”对邮件地址进行分割 
$addressArray = explode( ",",$inAddress); 
//--通过循环对邮件地址的合法性进行检查 
for($i=0;$i<count($addressArray);$i++) 
{ if($this->checkEmail($addressArray[$i])==false) 
return false; 

//--所有合法的email地址存入数组中 
$this->mailBCC = implode($addressArray, ","); 
return true; 

/***************************************************************** 
函数setFrom($inAddress):设置发件人地址 参数 $inAddress 为包涵邮件 
地址的字串默认返回值为true 
***************************************/ 
function setFrom($inAddress){ 
if($this->checkEmail($inAddress)){ 
$this->mailFrom = $inAddress; 
return true; 
} return false; } 
/********************** 
函数 setSubject($inSubject) 用于设置邮件主题参数$inSubject为字串, 
默认返回的是true 
*******************************************/ 
function setSubject($inSubject){ 
if(strlen(trim($inSubject)) > 0){ 
$this->mailSubject = ereg_replace( "n", "",$inSubject); 
return true; } 
return false; } 
/**************************************************** 
函数setText($inText) 设置文本格式的邮件主体参数 $inText 为文本内容默 
认返回值为true 
****************************************/ 
function setText($inText){ 
if(strlen(trim($inText)) > 0){ 
$this->mailText = $inText; 
return true; } 
return false; 

/********************************** 
函数setHTML($inHTML) 设置html格式的邮件主体参数$inHTML为html格式, 
默认返回值为true 
************************************/ 
function setHTML($inHTML){ 
if(strlen(trim($inHTML)) > 0){ 
$this->mailHTML = $inHTML; 
return true; } 
return false; } 
/********************** 
函数 setAttachments($inAttachments) 设置邮件的附件 参数$inAttachments 
为一个包涵目录的字串,也可以包涵多个文件用逗号进行分割 默认返回值为true 
*******************************************/ 
function setAttachments($inAttachments){ 
if(strlen(trim($inAttachments)) > 0){ 
$this->mailAttachments = $inAttachments; 
return true; } 
return false; } 
/********************************* 
函数 checkEmail($inAddress) :这个函数我们前面已经调用过了,主要就是 
用于检查email地址的合法性 
*****************************************/ 
function checkEmail($inAddress){ 
return (ereg( "^[^@ ]+@([a-zA-Z0-9-]+.)+([a-zA-Z0-9-]{2}|net|com|gov|mil|org|edu|int)$",$inAddress)); 

/************************************************* 
函数loadTemplate($inFileLocation,$inHash,$inFormat) 读取临时文件并且 
替换无用的信息参数$inFileLocation用于定位文件的目录 
$inHash 由于存储临时的值 $inFormat 由于放置邮件主体 
***********************************************************/ 
function loadTemplate($inFileLocation,$inHash,$inFormat){ 
/* 比如邮件内有如下内容: Dear ~!UserName~, 
Your address is ~!UserAddress~ */ 
//--其中”~!”为起始标志”~”为结束标志 
$templateDelim = "~"; 
$templateNameStart = "!"; 
//--找出这些地方并把他们替换掉 
$templateLineOut = ""; //--打开临时文件 
if($templateFile = fopen($inFileLocation, "r")){ 
while(!feof($templateFile)){ 
$templateLine = fgets($templateFile,1000); 
$templateLineArray = explode($templateDelim,$templateLine); 
for( $i=0; $i<count($templateLineArray);$i++){ 
//--寻找起始位置 
if(strcspn($templateLineArray[$i],$templateNameStart)==0){ 
//--替换相应的值 
$hashName = substr($templateLineArray[$i],1); 
//--替换相应的值 
$templateLineArray[$i] = ereg_replace($hashName,(string)$inHash[$hashName],$hashName); 


//--输出字符数组并叠加 
$templateLineOut .= implode($templateLineArray, ""); 
} //--关闭文件fclose($templateFile); 
//--设置主体格式(文本或html) 
if( strtoupper($inFormat)== "TEXT" ) 
return($this->setText($templateLineOut)); 
else if( strtoupper($inFormat)== "HTML" ) 
return($this->setHTML($templateLineOut)); 
} return false; 

/***************************************** 
函数 getRandomBoundary($offset) 返回一个随机的边界值 
参数 $offset 为整数 ? 用于多管道的调用 返回一个md5()编码的字串 
****************************************/ 
function getRandomBoundary($offset = 0){ 
//--随机数生成 
srand(time()+$offset); 
//--返回 md5 编码的32位 字符长度的字串 
return ( "----".(md5(rand()))); } 
/******************************************** 
函数: getContentType($inFileName)用于判断附件的类型 
**********************************************/ 
function getContentType($inFileName){ 
//--去除路径 
$inFileName = basename($inFileName); 
//--去除没有扩展名的文件 
if(strrchr($inFileName, ".") == false){ 
return "application/octet-stream"; 

//--提区扩展名并进行判断 
$extension = strrchr($inFileName, "."); 
switch($extension){ 
case ".gif": return "image/gif"; 
case ".gz": return "application/x-gzip"; 
case ".htm": return "text/html"; 
case ".html": return "text/html"; 
case ".jpg": return "image/jpeg"; 
case ".tar": return "application/x-tar"; 
case ".txt": return "text/plain"; 
case ".zip": return "application/zip"; 
default: return "application/octet-stream"; 

return "application/octet-stream"; 

/********************************************** 
函数formatTextHeader把文本内容加上text的文件头 
*****************************************************/ 
function formatTextHeader(){ $outTextHeader = ""; 
$outTextHeader .= "Content-Type: text/plain; 
charset=us-asciin"; 
$outTextHeader .= "Content-Transfer-Encoding: 7bitnn"; 
$outTextHeader .= $this->mailText. "n"; 
return $outTextHeader; 
} /************************************************ 
函数formatHTMLHeader()把邮件主体内容加上html的文件头 
******************************************/ 
function formatHTMLHeader(){ 
$outHTMLHeader = ""; 
$outHTMLHeader .= "Content-Type: text/html; 
charset=us-asciin"; 
$outHTMLHeader .= "Content-Transfer-Encoding: 7bitnn"; 
$outHTMLHeader .= $this->mailHTML. "n"; 
return $outHTMLHeader; 

/********************************** 
函数 formatAttachmentHeader($inFileLocation) 把邮件中的附件标识出来 
********************************/ 
function formatAttachmentHeader($inFileLocation){ 
$outAttachmentHeader = ""; 
//--用上面的函数getContentType($inFileLocation)得出附件类型 
$contentType = $this->getContentType($inFileLocation); 
//--如果附件是文本型则用标准的7位编码 
if(ereg( "text",$contentType)){ 
$outAttachmentHeader .= "Content-Type: ".$contentType. ";n"; 
$outAttachmentHeader .= ' name="'.basename($inFileLocation). '"'. "n"; 
$outAttachmentHeader .= "Content-Transfer-Encoding: 7bitn"; 
$outAttachmentHeader .= "Content-Disposition: attachment;n"; 
$outAttachmentHeader .= ' filename="'.basename($inFileLocation). '"'. "nn"; 
$textFile = fopen($inFileLocation, "r"); 
while(!feof($textFile)){ 
$outAttachmentHeader .= fgets($textFile,1000); 

//--关闭文件 fclose($textFile); 
$outAttachmentHeader .= "n"; 

//--非文本格式则用64位进行编码 
else{ $outAttachmentHeader .= "Content-Type: ".$contentType. ";n"; 
$outAttachmentHeader .= ' name="'.basename($inFileLocation). '"'. "n"; 
$outAttachmentHeader .= "Content-Transfer-Encoding: base64n"; 
$outAttachmentHeader .= "Content-Disposition: attachment;n"; 
$outAttachmentHeader .= ' filename="'.basename($inFileLocation). '"'. "nn"; 
//--调用外部命令uuencode进行编码 
exec( "uuencode -m $inFileLocation nothing_out",$returnArray); 
for ($i = 1; $i<(count($returnArray)); $i++){ 
$outAttachmentHeader .= $returnArray[$i]. "n"; 

} return $outAttachmentHeader; 

/****************************** 
函数 send()用于发送邮件,发送成功返回值为true 
************************************/ 
function send(){ 
//--设置邮件头为空 
$mailHeader = ""; 
//--添加抄送人 
if($this->mailCC != "") 
$mailHeader .= "CC: ".$this->mailCC. "n"; 
//--添加秘密抄送人 
if($this->mailBCC != "") 
$mailHeader .= "BCC: ".$this->mailBCC. "n"; 
//--添加发件人 
if($this->mailFrom != "") 
$mailHeader .= "FROM: ".$this->mailFrom. "n"; 
//---------------------------邮件格式------------------------------ 
//--文本格式 
if($this->mailText != "" && $this->mailHTML == "" && $this->mailAttachments == ""){ 
return mail($this->mailTo,$this->mailSubject,$this->mailText,$mailHeader); 

//--html或text格式 
else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments == ""){ 
$bodyBoundary = $this->getRandomBoundary(); 
$textHeader = $this->formatTextHeader(); 
$htmlHeader = $this->formatHTMLHeader(); 
//--设置 MIME-版本 
$mailHeader .= "MIME-Version: 1.0n"; 
$mailHeader .= "Content-Type: multipart/alternative;n"; 
$mailHeader .= ' boundary="'.$bodyBoundary. '"'; 
$mailHeader .= "nnn"; 
//--添加邮件主体和边界 
$mailHeader .= "--".$bodyBoundary. "n"; 
$mailHeader .= $textHeader; 
$mailHeader .= "--".$bodyBoundary. "n"; 
//--添加html标签 
$mailHeader .= $htmlHeader; 
$mailHeader .= "n--".$bodyBoundary. "--"; 
//--发送邮件 
return mail($this->mailTo,$this->mailSubject, "",$mailHeader); 

//--文本加html加附件 
else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments != ""){ 
$attachmentBoundary = $this->getRandomBoundary(); 
$mailHeader .= "Content-Type: multipart/mixed;n"; 
$mailHeader .= ' boundary="'.$attachmentBoundary. '"'. "nn"; 
$mailHeader .= "This is a multi-part message in MIME format.n"; 
$mailHeader .= "--".$attachmentBoundary. "n"; 
$bodyBoundary = $this->getRandomBoundary(1); 
$textHeader = $this->formatTextHeader(); 
$htmlHeader = $this->formatHTMLHeader(); 
$mailHeader .= "MIME-Version: 1.0n"; 
$mailHeader .= "Content-Type: multipart/alternative;n"; 
$mailHeader .= ' boundary="'.$bodyBoundary. '"'; 
$mailHeader .= "nnn"; 
$mailHeader .= "--".$bodyBoundary. "n"; 
$mailHeader .= $textHeader; 
$mailHeader .= "--".$bodyBoundary. "n"; 
$mailHeader .= $htmlHeader; 
$mailHeader .= "n--".$bodyBoundary. "--"; 
//--获取附件值 
$attachmentArray = explode( ",",$this->mailAttachments); 
//--根据附件的个数进行循环 
for($i=0;$i<count($attachmentArray);$i++){ 
//--分割 $mailHeader .= "n--".$attachmentBoundary. "n"; 
//--附件信息 
$mailHeader .= $this->formatAttachmentHeader($attachmentArray[$i]); 

$mailHeader .= "--".$attachmentBoundary. "--"; 
return mail($this->mailTo,$this->mailSubject, "",$mailHeader); 

return false; 


?>
使用方法: 

<?  
Include “email.class”  $mail->setTo("a@a.com"); //收件人  
$mail-> setCC("b@b.com,c@c.com"); //抄送  
$mail-> setCC("d@b.com,e@c.com"); //秘密抄送  
$mail->setFrom(“f@f.com”);//发件人  
$mail->setSubject(“主题”) ; //主题  
$mail->setText(“文本格式”) ;//发送文本格式也可以是变量  
$mail->setHTML(“html格式”) ;//发送html格式也可以是变量  
$mail->setAttachments(“c:a.jpg”) ;//添加附件,需表明路径  
$mail->send(); //发送邮件  
?>
PHP 相关文章推荐
php中explode与split的区别介绍
Oct 03 PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 PHP
使用PHP下载CSS文件中的图片的代码
Sep 24 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
Jun 23 PHP
Windows7下的php环境配置教程
Feb 28 PHP
php使用wordwrap格式化文本段落的方法
Mar 17 PHP
学习PHP session的传递方式
Jun 15 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 PHP
php 根据自增id创建唯一编号类
Apr 06 PHP
浅谈PHP各环境下的伪静态配置
Mar 13 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
使用PHP批量生成随机用户名
Jul 10 #PHP
用PHP与XML联手进行网站编程代码实例
Jul 10 #PHP
PHP写入WRITE编码为UTF8的文件的实现代码
Jul 07 #PHP
PHP远程连接MYSQL数据库非常慢的解决方法
Jul 05 #PHP
[原创]效率较高的php下读取文本文件的代码
Jul 02 #PHP
php5中date()得出的时间为什么不是当前时间的解决方法
Jun 30 #PHP
用PHP程序实现支持页面后退的两种方法
Jun 30 #PHP
You might like
PHP+JS+rsa数据加密传输实现代码
2011/03/23 PHP
php设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
php生成图形(Libchart)实例
2013/11/06 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
详解php实现页面静态化原理
2017/06/21 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
javascript继承之为什么要继承
2012/11/10 Javascript
js substr支持中文截取函数代码(中文是双字节)
2013/04/17 Javascript
Js中获取frames中的元素示例代码
2013/07/30 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
jQuery实现别踩白块儿网页版小游戏
2017/01/18 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
2018/07/13 Javascript
jQuery实现动态添加和删除input框代码实例
2019/03/29 jQuery
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
JavaScript函数Call、Apply原理实例解析
2020/02/17 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
python判断端口是否打开的实现代码
2013/02/10 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
2020/11/25 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
新闻学毕业生自荐信
2013/11/15 职场文书
工程测量与监理专业应届生求职信
2013/11/27 职场文书
英语生日邀请函
2014/01/23 职场文书
小学毕业感言50字
2014/02/16 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
家长对孩子的寒假评语
2015/10/09 职场文书