php发送邮件类

分类:

<?php 
/* 
********************************** 
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 <mail1@163.com>,收件人2 <mail2@sina.com>"); //收件人 
//$mail->setCC("mail3@21cn.com"); //抄送 
//$mail-> setBCC("mail4@21cn.com,mail5@21cn.com"); //秘密抄送 
$mail->setFrom("Monkey <monkeye@vip.bbn.cn>");//发件人 
$mail->setSubject("email 标题") ; //主题 
$mail->setText("文本格式") ;//发送文本格式也可以是变量 
//$mail->setHTML("<title>主题</title>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 http://www.vbulletin.com/license.html 

*/
 
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 (!emptyempty($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 && !emptyempty($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<count($addressArray);$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<count($addressArray);$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<count($addressArray);$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<count($inAttachmentsArray);$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<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)); 
} $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<count($attachmentArray);$i++){ 
   $mailHeader .= "--".$bodyBoundary. " "; 
   $mailHeader .= $this->formatAttachmentHeader($attachmentArray[$i]); 
  } 
 }//$mailHeader .= "--".$bodyBoundary. " "; 

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



附加资料:

下载该组件后,按如下示例编写代码即可实现php在线发送邮件.


  一:前台表单

<html>
<body>
<h3>phpmailer Unit Test</h3>
请你输入<font color="#FF6666">收信</font>的邮箱地址:
<form name="phpmailer" action="send.php" method="post">
<input type="hidden" name="submitted" value="1"/>
邮箱地址: <input type="text" size="50" name="address" />
<br/>
<input type="submit" value="发送"/>
</form>
</body>
</html>

二:后台PHP程序


<?php
require("class.phpmailer.php"); //下载的文件必须放在该文件所在目录
$mail = new PHPMailer(); //建立邮件发送类
$address = $_POST['address'];
$mail->IsSMTP(); // 使用SMTP方式发送
$mail->Host = "mail.xxxxx.com"; // 您的企业邮局域名
$mail->SMTPAuth = true; // 启用SMTP验证功能
$mail->Username = "user@xxxx.com"; // 邮局用户名(请填写完整的email地址)
$mail->Password = "******"; // 邮局密码

$mail->From = "user@xxxx.com"; //邮件发送者email地址
$mail->FromName = "您的名称";
$mail->AddAddress("$address", "");//收件人地址,可以替换成任何想要接收邮件的email信箱,格式是AddAddress("收件人email","收件人姓名")
//$mail->AddReplyTo("", "");

//$mail->AddAttachment("/var/tmp/file.tar.gz"); // 添加附件
//$mail->IsHTML(true); // set email format to HTML //是否使用HTML格式

$mail->Subject = "PHPMailer测试邮件"; //邮件标题
$mail->Body = "Hello,这是测试邮件"; //邮件内容
$mail->AltBody = "This is the body in plain text for non-HTML mail clients"; //附加信息,可以省略

if(!$mail->Send())
{
 echo "邮件发送失败. <p>";
 echo "错误原因: " . $mail->ErrorInfo;
 exit;
}

echo "邮件发送成功";
?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值