<?php  
//名称 ：一个完整的发送E-mail的PHP类  
//功能 ：可发送任意格式的邮件,附件个数、格式不限  
//作者 ：泰僧(hutaisheng)  
//E-mail : webmaster@softyi.com  
//OICQ : 22252491  
//主页 ：http://www.softyi.com ,http://www.webs168.com  
//说明 ：对本程序可作任意的改进，发布请保留作者信息，用于商业用途请与作者联系  


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)  
{  
$inAddress=str_replace("，",",",$inAddress);  
$addressArray = explode( ",",$inAddress); //--用explode()函数根据”,”对邮件地址进行分割  
for($i=0;$i<count($addressArray);$i++) //--通过循环对邮件地址的合法性进行检查  
{  
if($this->checkEmail($addressArray[$i])==false) return false;  
}  
$this->mailTo = implode(",",$addressArray ); //返回所有合法的EM地址  
return true;  
}  


/*********************************************************************************  
函数名称： setCC($inAddress)  
用途：设置抄送人邮件地址  
参数： $inAddress为包涵一个或多个邮件地址的字串,email地址变量，使用逗号来分割多个邮件地址  
返回：默认返回值为true  
***********************************************************************************/  
function setCC($inAddress)  
{  
$inAddress=str_replace("，",",",$inAddress);  
$addressArray = explode( ",",$inAddress);  
for($i=0;$i<count($addressArray);$i++)  
{  
if($this->checkEmail($addressArray[$i])==false) return false;  
}  
$this->mailCC = implode(",",$addressArray);  
return true;  
}  


/*******************************************************************************  
函数名称：setBCC($inAddress)  
用途：设置秘密抄送地址  
参数：$inAddress为包涵一个或多个邮件地址的字串,email地址变量,使用逗号来分割多个邮件地址  
返回：默认返回值为true  
*********************************************************************************/  
function setBCC($inAddress)  
{  
$inAddress=str_replace("，",",",$inAddress);  
$addressArray = explode( ",",$inAddress);  
for($i=0;$i<count($addressArray);$i++)  
{  
if($this->checkEmail($addressArray[$i])==false)  
return false;  
}  
$this->mailBCC = implode(",",$addressArray);  
return true;  
}  


/***********************************  
函数名称：setFrom($displayFrom,$inAddress)  
用途： 设置发件人地址  
参数： $inAddress为包涵邮件地址的字串  
$displayFrom为发件人的替换显示字符  
返回： 默认返回值为true  
*************************************/  
function setFrom($displayFrom="",$inAddress)  
{  
if(strlen(trim($displayFrom))>0)  
{  
if($this->checkEmail($inAddress))  
{  
$this->mailFrom=$displayFrom." <".$inAddress.">";  
}  
}  
else  
{  
if($this->checkEmail($inAddress)) $this->mailFrom=$inAddress;  
}  
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)  
{  
$inAttachments=str_replace("，",",",$inAttachments);  
if(strlen(trim($inAttachments)) > 0)  
{  
$this->mailAttachments = $inAttachments;  
return true;  
}  
return false;  
}  


/***************************************  
函数名称： checkEmail($inAddress)  
用途： 检查email地址的合法性  
参数： $inAddress为包含EM地址的字符串  
返回： EM地址正确返回TRUE  
****************************************/  
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)  
用途： 读取临时文件并且替换关键信息，如你要对你的所有客户发一封包含客户名称的贺电，你可  
以先写好贺电，将客户名称用~!UserName~表示，本函数会将此标志替换成相应的客户名称  
参数： $inFileLocation 为包含路径的文件名称字符串  
$inHash 用该值去替换文件中用标志包含的字符  
$inFormat： “TEXT”或“HTML”  
返回： 默认返回值为false，如果成功，将用替换后的结果作为邮件的主体  
**************************************************************************************/  

function loadTemplate($inFileLocation,$inHash,$inFormat){  

$Delim = "~";  
$Start = "!";  
$Out = "";  
if($fp = fopen($inFileLocation, "r"))  
{  
while(!feof($fp))  
{  
$Line = fgets($fp,1000);  
$Array = explode($Delim,$Line);  
for( $i=0; $i<count($Array);$i++)  
{  
//--寻找起始位置  
if(strcspn($Array[$i],$Start)==0)  
{  
$tmp = substr($Array[$i],0); //--替换相应的值  
$Array[$i]=@ereg_replace($tmp,$inHash,$Array[$i]);  
}  
}  
$Out.= implode( "",$Array);//--输出字符数组并叠加  

}  
fclose($fp);  
if( strtoupper($inFormat)== "TEXT" )  
return($this->setText($Out));  
else if( strtoupper($inFormat)== "HTML" )  
return($this->setHTML($Out));  
}  
return false;  
}  



/*************************************  
函数名称： getRandomBoundary($offset)  
用途： 返回一个随机的边界值  
参数： $offset为任意整数  
返回： MD5编码的字串  
*************************************/  
function getRandomBoundary($offset = 0)  
{  
srand(time()+$offset); //生成 随机数  
return md5(rand()); //返回MD5编码的32位字符长度的字串  
}  


/**********************************************  
函数名称： formatTextHeader（）  
用途： 设置文本格式邮件的消息头  
参数： 无  
返回： TEXT格式的消息头  
***********************************************/  
function formatTextHeader()  
{  
$outTextHeader = "";  
$outTextHeader .= "Content-Type:text/plain;charset=\"GB2312\""."\n";  
$outTextHeader .= "Content-Transfer-Encoding: 7bit\n";  
return $outTextHeader;  
}  


/**********************************************  
函数名称： formatHTMLHeader（）  
用途： 设置HTML格式邮件的消息头  
参数： 无  
返回： HTML格式的消息头  
***********************************************/  
function formatHTMLHeader()  
{  
$outHTMLHeader = "";  
$outHTMLHeader .= "Content-Type:text/html;"; //注：如果在此句后加上“chartset=gb2312”将会收到一堆乱码  
$outHTMLHeader .= "Content-Transfer-Encoding: base64\n";  
return $outHTMLHeader;  
}  



/*************************************  
函数名称: getContentType($inFileName)  
用途： 判断附件的类型  
参数： $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";  
}  



/*********************************************  
函数名称： getAttachment($inFileLocation)  
用途： 设置附件的段头，并对附件进行编码  
参数： 同上  
返回： 经过编码了的附件段头与主体  
**********************************************/  
function getAttachment($inFileLocation)  
{  
$outAttachmentHeader = "";  
$contentType = $this->getContentType($inFileLocation); //得出附件类型  
/******************************给文件格式的附件加上段头*****************************************/  
if(ereg("txt",$contentType))  
{$outAttachment .= "Content-Type:".$contentType. ";"; //注意“；”不能丢  
$outAttachment .= "name=\"".basename($inFileLocation). "\""."\n";  
$outAttachment .= "Content-Transfer-Encoding: 7bit\n"; //--如果附件是文本型则用标准的7位编码  

$outAttachment .= "Content-Disposition: attachment;"; //注意“；”不能丢  
$outAttachment .= "filename=\"".basename($inFileLocation)."\""."\n\n\n";  
/***********************************文本格式的附件主体****************************************/  
$fp=fopen($inFileLocation,"r");  
if($fp)  
{  
$outAttachmentBody=fread($fp,filesize($inFileLocation));  
$outAttachmentBody=chunk_split($outAttachmentBody);  
fclose($fp);  
}  
$outAttachment.=$outAttachmentBody."\n";  
return $outAttachment;  
}  
else  
{  
/***************************给非文本格式的附件加上段头*********************************************/  
$outAttachment .= "Content-Type: ".$contentType. ";";  
$outAttachment .= "name=\"".basename($inFileLocation)."\""."\n";  
$outAttachment .= "Content-Transfer-Encoding: base64\n";  
$outAttachment .= "Content-Disposition: attachment;";  
$outAttachment .= "filename=\"".basename($inFileLocation). "\""."\n\n\n";  
/********************************非文本格式的附件主体，用64位进行编码*********************************/  
$fp=fopen($inFileLocation,"r");  
if($fp)  
{  
$outAttachmentBody=fread($fp,filesize($inFileLocation));  
$outAttachmentBody=base64_encode($outAttachmentBody);  
$outAttachmentBody=chunk_split($outAttachmentBody);  
fclose($fp);  
}  
$outAttachment.=$outAttachmentBody."\n";  
return $outAttachment;  
}  
return false;  
}  




/***********************************  
函数名称：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(!empty($this->mailText))  
{  
if(empty($this->mailAttachments)) //文本格式且无附件  
{  
return mail($this->mailTo,$this->mailSubject,$this->mailText,$mailHeader);  
}  
else //文本格式带附件  
{  
//设置整个邮件的消息头$mailHeader  
$bodyBoundary=$this->getRandomBoundary(1);  
$textHeader=$this->formatTextHeader();  
$mailHeader.="Mime_Version:1.0\n";  
$mailHeader.="Content-Type:multipart/mixed;";  
$mailHeader.="boundary=\"$bodyBoundary\""."\n";  
$mailHeader.="This is a multi-part message in MIME format.\n";  
//设置边界、信息头和主体  
$mailHeader.="--".$bodyBoundary."\n";  
$mailHeader.=$this->formatTextHeader();  
$mailHeader.="\n";  
$mailHeader.=$this->mailText."\n";  
//添加附件边界、信息头和主体  
$attachmentArray=explode(",",$this->mailAttachments);  
for($i=0;$i<count($attachmentArray);$i++)  
{  
$mailHeader.="--".$bodyBoundary."\n";  
$mailHeader.=$this->getAttachment($attachmentArray[$i])."\n";  
}  
$mailHeader.="--".$bodyBoundary."--"."\n";  
//发送带附件的邮件  
return mail($this->mailTo,$this->mailSubject," ",$mailHeader);  
}  
return false;  
}  

/***********************发送HTML格式的消息及附件***********************************/  
if(!empty($this->mailHTML))  
{  
if(empty($this->mailAttachments)) //HTML格式的消息，无附件  
{  
$htmlHeader=$this->formatHTMLHeader();  
$mailHeader.="MIME_Version:1.0\n";  
$mailHeader.="Content-Type:text/html;";  

//--添加邮件边界和主体  
$mailBody="";  
$mailBody.=$this->htmlHeader;  
$mailBody.="\n";  
$mailBody.=$this->mailHTML."\n";  
return mail($this->mailTo,$this->mailSubject,$mailBody,$mailHeader);  
}  
else //HTML格式的消息和附件  
{  
$bodyBoundary=$this->getRandomBoundary(1);  
$htmlHeader=$this->formatHTMLHeader();  
$mailHeader.="Mime_Version:1.0\n";  
$mailHeader.="Content-Type:multipart/mixed;";  
$mailHeader.="boundary=\"$bodyBoundary\""."\n";  
$mailHeader.="This is a multi-part message in MIME format.\n\n\n";  

//--添加邮件边界和主体  
$mailHeader.="--".$bodyBoundary."\n";  
$mailHeader.=$htmlHeader;  
$mailHeader.="\n\n\n";  
$mailHeader.=$this->mailHTML."\n\n\n";  
//--获取附件值  
$attachmentArray=explode(",",$this->mailAttachments);  
for($i=0;$i<count($attachmentArray);$i++)  
{  
$mailHeader.="--".$bodyBoundary."\n";  
$mailHeader.=$this->getAttachment($attachmentArray[$i])."\n";  
}  
$mailHeader.="--".$bodyBoundary."--"."\n";  
//发送带附件的邮件  
return mail($this->mailTo,$this->mailSubject," ",$mailHeader);  
}  
return false;  
}  
}//end send  
//}//end class  

function sent_mail($cc,$bcc,$fname,$from,$subject,$bodytype,$sent_type,$dataemail,$mailincladd_name)
	{
	$filedata=file($GLOBALS["dataemail"]);
    echo "正在发送......(发送完成时间的长短视网速快慢及服务器性能而定)<br>";
	$this->setCC("$cc");
	$this->setBCC("$bcc");
	$this->setFrom("$fname","$from");  
	$this->setSubject("$subject");  
	$this->setAttachments("$mailincladd_name");
    if($sent_type=="html")
       $this->setHtml("$bodytype");
    else
       $this->setText("$bodytype");
    for($i=0;$i<sizeof($filedata);$i++)
    {
    $this->mailTo=trim($filedata[$i]);
    $p=$i+1;
    if($this->send()) $flag=1;
    }
    echo "已经发送完成<br>";
	}
function sent_mailtake($fname,$from,$mailadd,$subject,$body,$sent_type)
	{
//	$filedata=file($GLOBALS["dataemail"]);
//    echo "正在发送......(发送完成时间的长短视网速快慢及服务器性能而定)<br>";
	$this->setFrom("$fname","$from");  
	$this->setSubject("$subject");  
/*    if($sent_type=="html")
       $this->setHtml("$bodytype");
    else*/
       $this->setHtml("$body");
	   $this->mailTo=$mailadd;
	   $this->send();
/*    for($i=0;$i<sizeof($filedata);$i++)
    {
    $this->mailTo=trim($filedata[$i]);
    $p=$i+1;
    if($this->send()) $flag=1;
    }
    echo "已经发送完成<br>";*/
	}
}
?> 