Chinaunix首页 | 论坛 | 博客
  • 博客访问: 317960
  • 博文数量: 52
  • 博客积分: 6130
  • 博客等级: 准将
  • 技术积分: 470
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-16 16:44
文章分类

全部博文(52)

文章存档

2012年(4)

2011年(2)

2010年(1)

2009年(5)

2008年(2)

2007年(2)

2006年(14)

2005年(22)

我的朋友

分类:

2005-12-21 14:02:19

从PHPSo MVC 中挖出来的邮件发送类

/*
**********************************
PHPSo MVC System * Mail 邮件发送类
Lastdate:2005-12-16 9:30
QQ:10433182(Monkey)
Copyright:PHPSo.Com
**********************************

$mail = new email (
'smtp',   //smtp方式方式时填写'smtp',mail函数发送时填写'mail'
//以下为smtp方式时需要填写的参数
'smtp.vip.bbn.cn', //邮箱smtp地址
'user',   //邮箱帐户
'pass',   //邮箱口令
'25',   //端口,不填缺省为25
);

$mail->setCharset("gb2312");
$mail->setTo("收件人1 <>,收件人2 <>"); //收件人
//$mail->setCC(""); //抄送
//$mail-> setBCC(""); //秘密抄送
$mail->setFrom("Monkey <发件人
$mail->setSubject("email 标题") ; //主题
$mail->setText("文本格式") ;//发送文本格式也可以是变量
//$mail->setHTML("主题HTML格式") ;//发送html格式也可以是变量
$mail->setAttachments("c:/www/phpsomvc/_sample/5.htm|附件1,c:/www/phpsomvc/readme.txt|附件2") ;
//添加附件,需表明路径,多附件用逗号分割,文件名“|”后为自定义文件名
$mail->send(); //发送邮件
*/

class Mail
{
 /**
 * Standard email parameters
 *
 * This is where we keep the most important stuff like who to send the mail to etc.
 *
 * @var fromEmail
 * @var toEmail
 * @var subject
 * @var headers
 * @var message
 * @var success
 */
 var $fromEmail = '';
 var $toEmail = '';
 var $subject = '';
 var $headers = '';
 var $message = '';
 var $success = false;

 /**
 * Constructor
 *
 * @param string Destination Email Address
 * @param string Email Subject
 * @param string Email Message Body
 * @param string Extra Email Headers
 * @param string Webmaster (From) Email Address
 * @param boolean Require '-f' parameter to sendmail?
 */
 function SendMail($toemail, $subject, $message, $headers, $fromemail, $minusf = false)
 {
  if ($minusf)
  {
   $this->success = @mail($toemail, $subject, $message, trim($headers), "-f $fromemail");
  }
  else
  {
   $this->success = @mail($toemail, $subject, $message, trim($headers));
  }
  return $this->success;
 }
}

/**
* SMTP Mail Sending Object
*
* This class sends email from vBulletin using an SMTP wrapper
*
* @package   vBulletin
* @version  $Revision: 1.5 $
* @date   $Date: 2004/07/04 20:52:01 $
* @copyright  
*
*/
class Smtp extends Mail
{
 /**
 * SMTP email parameters
 *
 * Variables used to work with the SMTP protocol.
 *
 * @var    smtpHost
 * @var    smtpPort
 * @var    smtpUser
 * @var    smtpPass
 * @var    smtpSocket
 */
 var $smtpHost = "";
 var $smtpPort = 25;
 var $smtpUser = "";
 var $smtpPass = "";
 var $smtpSocket = null;

 /**
 * Constructor
 *
 * @param string Destination Email Address
 * @param string Email Subject
 * @param string Email Message Body
 * @param string Extra Email Headers
 * @param string Webmaster (From) Email Address
 * @param boolean Require '-f' parameter to sendmail?
 */
 function SendMail($toemail, $subject, $message, $headers, $fromemail, $minusf = false)
 {
  // this class doesn't handle BCC or CC at the moment
  $this->toEmail = $toemail;
  $this->subject = $subject;
  $this->message = $message;
  $this->headers = trim($headers);

  $matches = array();

  preg_match('#From: ".*" <(.*)>#siU', $this->headers, $matches);
  if (!empty($matches))
  {
   $this->fromEmail = "<$matches[1]>";
  }
  else
  {
   $this->fromEmail = "<$fromemail>";
  }

  $this->success = $this->send();
  return $this->success;
 }

 /**
 * Sends instruction to SMTP server
 *
 * @param string Message to be sent to server
 * @param mixed Message code expected to be returned or false if non expected
 *
 * @return boolean Returns false on error
 */
 function sendMessage($msg, $expectedResult = false)
 {
  if ($msg !== false && !empty($msg))
  {
   fputs($this->smtpSocket, $msg . " ");
  }
  if ($expectedResult !== false)
  {
   $result = '';
   while ($line = fgets($this->smtpSocket, 1024))
   {
    $result .= $line;
    if (substr($result, 3, 1) == ' ')
    {
     break;
    }
   }
   return (intval(substr($result, 0, 3)) == $expectedResult);
  }
  return true;
 }

 /**
 * Triggers PHP warning on error
 *
 * @param string Error message to be shown
 *
 * @return boolean Always returns false (error)
 */
 function errorMessage($msg)
 {
  echo $msg;exit;
  return false;
 }

 /**
 * Attempts to send email based on parameters passed into the constructor
 *
 * @return boolean Returns false on error
 */
 function send()
 {
  $this->smtpSocket = fsockopen($this->smtpHost, intval($this->smtpPort), $errno, $errstr, 30);
  if ($this->smtpSocket)
  {
   if (!$this->sendMessage(false, 220))
   {
    return $this->errorMessage("Unexpected response from SMTP server");
   }

   if (!$this->sendMessage("HELO " . $this->smtpHost, 250))
   {
    return $this->errorMessage("Unexpected response from SMTP server");
   }

   if ($this->smtpUser AND $this->smtpPass)
   {
    if ($this->sendMessage("AUTH LOGIN", 334))
    {
     if (!$this->sendMessage(base64_encode($this->smtpUser), 334) OR !$this->sendMessage(base64_encode($this->smtpPass), 235))
     {
      return $this->errorMessage("Authorization to the SMTP server failed");
     }
    }
   }

   if (!$this->sendMessage("MAIL FROM:" . $this->fromEmail, 250))
   {
    return $this->errorMessage("Unexpected response from SMTP server");
   }

   // we could have multiple addresses since a few people might expect this to be the same as PHP
   $addresses = explode(',', $this->toEmail);
   foreach ($addresses AS $address)
   {
    if (!$this->sendMessage("RCPT TO:<" . trim($address) . ">", 250))
    {
     return $this->errorMessage("Unexpected response from SMTP server");
    }
   }
   if ($this->sendMessage("DATA", 354))
   {
    $this->sendMessage("To: " . $this->toEmail, false);
    $this->sendMessage("Subject: " . $this->subject, false);
    $this->sendMessage($this->headers, false);
    $this->sendMessage($this->message, false);
   }
   else
   {
    return $this->errorMessage("Unexpected response from SMTP server");
   }

   if (!$this->sendMessage(".", 250))
   {
    return $this->errorMessage("Unexpected response from SMTP server");
   }

   if (!$this->sendMessage("QUIT", 221))
   {
    return $this->errorMessage("Unexpected response from SMTP server");
   }

   fclose($this->smtpSocket);
   return true;
  }
  else
  {
   return $this->errorMessage("Unable to connect to SMTP server");
  }
 }
}

class email {
//---设置全局变量
var $mailTo = ""; // 收件人
var $mailCC = ""; // 抄送
var $mailBCC = ""; // 秘密抄送
var $mailFrom = ""; // 发件人
var $mailSubject = ""; // 主题
var $mailText = ""; // 文本格式的信件主体
var $mailHTML = ""; // html格式的信件主体
var $main_charset = "US-ASCII";  // 信件主体的编码
var $mailAttachments = ""; // 附件
var $send;
var $error = false; // 错误

function Email($method,$host='',$user='',$pass='',$post=25,$socket=null) {

 if ($method=='mail') $this->send = new Mail();
 if ($method=='smtp') {
  $this->send = new Smtp();
  $this->send->smtpHost = $host;
  $this->send->smtpPort = $post;
  $this->send->smtpUser = $user;
  $this->send->smtpPass = $pass;
  $this->send->smtpSocket = $socket;
 }

}

/**
* 函数 setCharset($charset) 设置邮件的默认字符集
* @parm string $charset 邮件的字符集,默认为US-ASCII
*/
function setCharset($charset) {
 $this->main_charset=$charset;
}

/**
* 函数 setTo($inAddress) 设置邮件的地址
* @parm string $inAddress 为包涵一个或多个字串,email地址变量,使用逗号来分割多个邮件地址
* @return 默认返回值为true
*/
function setTo($inAddress){
 //--用explode()函数根据”,”对邮件地址进行分割
 $addressArray = explode( ",",$inAddress);
 //--通过循环对邮件地址的合法性进行检查
 for($i=0;$i  if($this->checkEmail($addressArray[$i])==false) {$this->error=true;return false;}
 }
 //--所有合法的email地址存入数组中
 $this->mailTo = implode($addressArray, ",");
 return true;
}
/**
* 函数 setCC($inAddress) 设置抄送人邮件地址
* @parm string $inAddress 为包涵一个或多个邮件地址的字串,email地址变量,使用逗号来分割多个邮件地址
* @return 默认返回值为true
*/
function setCC($inAddress){
 //--用explode()函数根据”,”对邮件地址进行分割
 $addressArray = explode( ",",$inAddress);
 //--通过循环对邮件地址的合法性进行检查
 for($i=0;$i  if($this->checkEmail($addressArray[$i])==false) {$this->error=true;return false;}
 }
 //--所有合法的email地址存入数组中
 $this->mailCC = implode($addressArray, ",");
 return true;
}
/**
* 函数 setBCC($inAddress) 设置秘密抄送地址
* @parm string $inAddress 为包涵一个或多个邮件地址的字串,email地址变量,使用逗号来分割多个邮件地址
* @return 默认返回值为 true
*/
function setBCC($inAddress){
 //--用explode()函数根据”,”对邮件地址进行分割
 $addressArray = explode( ",",$inAddress);
 //--通过循环对邮件地址的合法性进行检查
 for($i=0;$i  if($this->checkEmail($addressArray[$i])==false) {$this->error=true;return false;}
 }
 //--所有合法的email地址存入数组中
 $this->mailBCC = implode($addressArray, ",");
 return true;
}
/**
* 函数 setFrom($inAddress) 设置发件人地址
* @parm string $inAddress 为包涵邮件地址的字串
* @return 默认返回值为true
*/
function setFrom($inAddress){
 if($this->checkEmail($inAddress)){
  $this->mailFrom = $inAddress;
  return true;
 } $this->error=true;return false;
}
/**
* 函数 setSubject($inSubject) 设置邮件主题
* @parm string $inSubject 为主题字串
* @return 默认返回的是true
*/
function setSubject($inSubject){
 if(strlen(trim($inSubject)) > 0){
  $this->mailSubject = ereg_replace( " ", "",$inSubject);
  $this->mailSubject = "=?".$this->main_charset."?B?".base64_encode($this->mailSubject)."?=";
  return true;
 } $this->error=true;return false;
}
/**
* 函数 setText($inText) 设置文本格式的邮件主体
* @parm string $inText 为文本内容
* @return 默认返回值为true
*/
function setText($inText){
 if(strlen(trim($inText)) > 0){
  $this->mailText = $inText;
  return true;
 } $this->error=true;return false;
}
/**
* 函数 setHTML($inHTML) 设置html格式的邮件主体
* @parm string $inHTML 为html格式内容
* @return 默认返回值为true
*/
function setHTML($inHTML){
 if(strlen(trim($inHTML)) > 0){
  $this->mailHTML = $inHTML;
  return true;
 } $this->error=true;return false;
}
/**
* 函数 setAttachments($inAttachments) 设置邮件的附件
* @parm string $inAttachments 为一个包涵目录的字串,也可以包涵多个文件用逗号进行分割
               文件名"|"后的字串可以为附件自定义文件名,用于显示在邮件中
* @return 默认返回值为true
*/
function setAttachments($inAttachments){
 $inAttachmentsArray = explode( ",",$inAttachments);
 for($inAttachments='',$i=0;$i  $Attach=explode("|",$inAttachmentsArray[$i]);
  if (file_exists($Attach[0])) $inAttachmentsArray_new[] = $inAttachmentsArray[$i];
 }
 if(count($inAttachmentsArray_new)){
  $this->mailAttachments = $inAttachmentsArray_new;
  return true;
 } $this->error=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) 读取临时文件并且替换无用的信息
* @parm string $inFileLocation 用于定位文件的目录
* @parm string $inHash 由于存储临时的值
* @parm string $inFormat 由于放置邮件主体 TEXT or HTML
*/
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   //--寻找起始位置
   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));
 } $this->error=true;return false;
}
/**
* 函数 getRandomBoundary($offset) 返回一个随机的边界值
* @parm integer $offset 为整数 – 用于多管道的调用
* @return 返回一个md5()编码的字串
*/
function getRandomBoundary($offset = 0){
 //--随机数生成
 srand(time()+$offset);
 //--返回 md5 编码的32位 字符长度的字串
 return ( "--PHPSoMVC_".(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=" .$this->main_charset. " ";
 $outTextHeader .= "Content-Transfer-Encoding: 7BIT ";
 $outTextHeader .= $this->mailText." ";
 return $outTextHeader;
}
/**
函数formatHTMLHeader()把邮件主体内容加上html的文件头
*/
function formatHTMLHeader(){
 $outHTMLHeader = "";
 $outHTMLHeader .= "Content-Type: text/html;charset=" .$this->main_charset. " ";
 $outHTMLHeader .= "Content-Transfer-Encoding: base64 ";
 $outHTMLHeader .= chunk_split(base64_encode($this->mailHTML));
 return $outHTMLHeader;
}
/**
函数 formatAttachmentHeader($inFileLocation) 把邮件中的附件标识出来
*/
function formatAttachmentHeader($inFileLocation){
 $Attach=explode("|",$inFileLocation);
 if ($Attach[1]=='') $Attach[1]=basename($Attach[0]);
 $outAttachmentHeader = "";
 //--用上面的函数getContentType($inFileLocation)得出附件类型
 $contentType = $this->getContentType($Attach[0]);
 $outAttachmentHeader .= "Content-Type: ".$contentType. "; ";
 $outAttachmentHeader .= ' name="'.$Attach[1]. '"'. " ";
 $outAttachmentHeader .= "Content-Transfer-Encoding: base64 ";
 $outAttachmentHeader .= "Content-Disposition: attachment; ";
 $outAttachmentHeader .= ' filename="'.$Attach[1]. '"'. " ";
 $otherFile = fopen($Attach[0], "r");$FileContent='';
 while(!feof($otherFile)){
  $FileContent .= fgets($otherFile,1000);
 }
 $outAttachmentHeader .= chunk_split(base64_encode($FileContent));
  return $outAttachmentHeader;
}
/**
函数 send()用于发送邮件,发送成功返回值为true
如果前面邮件资料准备阶段出现错误,则直接返回false
*/
function send(){
 if ($this->error) return false;
 //--设置邮件头为空
 $mailHeader = "";
 //--添加抄送人
 if($this->mailCC != "") $mailHeader .= "CC: ".$this->mailCC. " ";
 //--添加秘密抄送人
 if($this->mailBCC != "") $mailHeader .= "BCC: ".$this->mailBCC. " ";
 //--添加发件人
 if($this->mailFrom != "") $mailHeader .= "FROM: ".$this->mailFrom. " ";
 //---------------------------邮件格式------------------------------
 if($this->mailText != "" || $this->mailHTML != "" || $this->mailAttachments != ""){
  $bodyBoundary = $this->getRandomBoundary();
  //--设置 MIME-版本
  $mailHeader .= "MIME-Version: 1.0 ";
  $mailHeader .= "Content-Type: multipart/mixed; ";
  $mailHeader .= ' boundary="'.$bodyBoundary. '"';
  $mailHeader .= " ";
  if ($this->mailText!='') {
   $mailHeader .= "This is a multi-part message in MIME format. ";
   $textHeader = $this->formatTextHeader();
   $mailHeader .= "--".$bodyBoundary. " ";
   $mailHeader .= $textHeader;
  }else if ($this->mailHTML!='') {
   $htmlHeader = $this->formatHTMLHeader();
   $mailHeader .= "--".$bodyBoundary. " ";
   $mailHeader .= $htmlHeader;
  }

  if ($this->mailAttachments!='') {
   $attachmentArray = $this->mailAttachments;
   //--根据附件的个数进行循环
   for($i=0;$i    $mailHeader .= "--".$bodyBoundary. " ";
    $mailHeader .= $this->formatAttachmentHeader($attachmentArray[$i]);
   }
  }//$mailHeader .= "--".$bodyBoundary. " ";

  return $this->send->SendMail($this->mailTo,$this->mailSubject, "",$mailHeader,$this->mailFrom);
 } return false;
}

}
?>


阅读(2508) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~