当前位置:网站首页>使用PHPMailer发送邮件
使用PHPMailer发送邮件
2022-08-02 03:24:00 【auspi12341】
$mail = new PHPMailer();
//服务器配置
$mail->CharSet ="UTF-8"; //设定邮件编码
$mail->SMTPDebug = 0; // 调试模式输出
$mail->isSMTP(); // 使用SMTP
$mail->Host = 'smtp.qq.com'; // SMTP服务器
$mail->SMTPAuth = true; // 允许 SMTP 认证
$mail->Username = '[email protected]'; // SMTP 用户名 即邮箱的用户名
$mail->Password = 'xxxxxxx'; // SMTP 密码 部分邮箱是授权码(例如163邮箱)
$mail->SMTPSecure = 'ssl'; // 允许 TLS 或者ssl协议
$mail->Port = 465; // 服务器端口 25 或者465 具体要看邮箱服务器支持
$mail->setFrom('[email protected]'); //发件人
$mail->addAddress('[email protected]'); // 收件人
//$mail->addAddress('[email protected]'); // 可添加多个收件人
$mail->isHTML(true);// 是否以HTML文档格式发送 发送后客户端可直接显示对应HTML内容
$mail->Subject = '邮件标题';
$html ="html内容";
$mail->Body = $html;
$a = $mail->send();
<?php
if(version_compare(PHP_VERSION,'5.0.0','<')){
exit("Sorry, this version of PHPMailer will only run on PHP version 5 or greater!\n");
}
class PHPMailer{
public $Priority=3;
public $CharSet='iso-8859-1';
public $ContentType='text/plain';
public $Encoding='8bit';
public $ErrorInfo='';
public $From='[email protected]';
public $FromName='Root User';
public $Sender='';
public $Subject='';
public $Body='';
public $AltBody='';
public $WordWrap=0;
public $Mailer='mail';
public $Sendmail='/usr/sbin/sendmail';
public $PluginDir='';
public $ConfirmReadingTo='';
public $Hostname='';
public $MessageID='';
public $Host='localhost';
public $Port=25;
public $Helo='';
public $SMTPSecure='';
public $SMTPAuth=false;
public $Username='';
public $Password='';
public $Timeout=10;
public $SMTPDebug=false;
public $SMTPKeepAlive=false;
public $SingleTo=false;
public $SingleToArray=array();
public $LE="\n";
public $DKIM_selector='phpmailer';
public $DKIM_identity='';
public $DKIM_domain='';
public $DKIM_private='';
public $action_function='';
public $Version='5.1';
private $smtp=NULL;
private $to=array();
private $cc=array();
private $bcc=array();
private $ReplyTo=array();
private $all_recipients=array();
private $attachment=array();
private $CustomHeader=array();
private $message_type='';
private $boundary=array();
protected $language=array();
private $error_count=0;
private $sign_cert_file="";
private $sign_key_file="";
private $sign_key_pass="";
private $exceptions=false;
const STOP_MESSAGE=0;
const STOP_CONTINUE=1;
const STOP_CRITICAL=2;
public function __construct($exceptions=false){
$this->exceptions=($exceptions==true);
}
public function IsHTML($ishtml=true){
if($ishtml){
$this->ContentType='text/html';
}else{
$this->ContentType='text/plain';
}
}
public function IsSMTP(){
$this->Mailer='SMTP';
}
public function IsMail(){
$this->Mailer='mail';
}
public function IsSendmail(){
if(!stristr(ini_get('sendmail_path'),'sendmail')){
$this->Sendmail='/var/qmail/bin/sendmail';
}
$this->Mailer='sendmail';
}
public function IsQmail(){
if(stristr(ini_get('sendmail_path'),'qmail')){
$this->Sendmail='/var/qmail/bin/sendmail';
}
$this->Mailer='sendmail';
}
public function AddAddress($address,$name=''){
return $this->AddAnAddress('to',$address,$name);
}
public function AddCC($address,$name=''){
return $this->AddAnAddress('cc',$address,$name);
}
public function AddBCC($address,$name=''){
return $this->AddAnAddress('bcc',$address,$name);
}
public function AddReplyTo($address,$name=''){
return $this->AddAnAddress('ReplyTo',$address,$name);
}
private function AddAnAddress($kind,$address,$name=''){
if(!preg_match('/^(to|cc|bcc|ReplyTo)$/',$kind)){
if($this->exceptions){
throw new phpmailerException('Invalid recipient array: '.$kind);
}
return false;
}
$address=trim($address);
$name=trim(preg_replace('/[\r\n]+/','',$name));
if(!self::ValidateAddress($address)){
$this->SetError($this->Lang('invalid_address').': '.$address);
if($this->exceptions){
throw new phpmailerException($this->Lang('invalid_address').': '.$address);
}
return false;
}
if($kind!='ReplyTo'){
if(!isset($this->all_recipients[strtolower($address)])){
array_push($this->$kind,array($address,$name));
$this->all_recipients[strtolower($address)]=true;
return true;
}
}else{
if(!array_key_exists(strtolower($address),$this->ReplyTo)){
$this->ReplyTo[strtolower($address)]=array($address,$name);
return true;
}
}
return false;
}
public function SetFrom($address,$name='',$auto=1){
$address=trim($address);
$name=trim(preg_replace('/[\r\n]+/','',$name));
if(!self::ValidateAddress($address)){
$this->SetError($this->Lang('invalid_address').': '.$address);
if($this->exceptions){
throw new phpmailerException($this->Lang('invalid_address').': '.$address);
}
return false;
}
$this->From=$address;
$this->FromName=$name;
if($auto){
if(empty($this->ReplyTo)){
$this->AddAnAddress('ReplyTo',$address,$name);
}
if(empty($this->Sender)){
$this->Sender=$address;
}
}
return true;
}
public static function ValidateAddress($address){
if(function_exists('filter_var')){
if(filter_var($address,FILTER_VALIDATE_EMAIL)===FALSE){
return false;
}else{
return true;
}
}else{
return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~][email protected](?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/',$address);
}
}
public function Send(){
try{
if((count($this->to)+count($this->cc)+count($this->bcc))<1){
throw new phpmailerException($this->Lang('provide_address'),self::STOP_CRITICAL);
}
if(!empty($this->AltBody)){
$this->ContentType='multipart/alternative';
}
$this->error_count=0;
$this->SetMessageType();
$header=$this->CreateHeader();
$body=$this->CreateBody();
if(empty($this->Body)){
throw new phpmailerException($this->Lang('empty_message'),self::STOP_CRITICAL);
}
if($this->DKIM_domain&&$this->DKIM_private){
$header_dkim=$this->DKIM_Add($header,$this->Subject,$body);$header=str_replace("\r\n","\n",$header_dkim).$header;
}
switch($this->Mailer){
case 'sendmail':
return $this->SendmailSend($header,$body);
case 'SMTP':
return $this->SmtpSend($header,$body);
default:
return $this->MailSend($header,$body);
}
}catch(phpmailerException $e){
$this->SetError($e->getMessage());
if($this->exceptions){
throw $e;
}
return false;
}
}
protected function SendmailSend($header,$body){
if($this->Sender!=''){
$sendmail=sprintf("%s -oi -f %s -t",escapeshellcmd($this->Sendmail),escapeshellarg($this->Sender));
}else{
$sendmail=sprintf("%s -oi -t",escapeshellcmd($this->Sendmail));
}if($this->SingleTo===true){
foreach($this->SingleToArray as $key=>$val){
if([email protected]$mail=popen($sendmail,'w')){
throw new phpmailerException($this->Lang('execute').$this->Sendmail,self::STOP_CRITICAL);
}
fputs($mail,"To: ".$val."\n");
fputs($mail,$header);
fputs($mail,$body);
$result=pclose($mail);
$isSent=($result==0)?1:0;
$this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body);
if($result!=0){
throw new phpmailerException($this->Lang('execute').$this->Sendmail,self::STOP_CRITICAL);
}
}
}else{
if([email protected]$mail=popen($sendmail,'w')){
throw new phpmailerException($this->Lang('execute').$this->Sendmail,self::STOP_CRITICAL);
}
fputs($mail,$header);
fputs($mail,$body);
$result=pclose($mail);
$isSent=($result==0)?1:0;
$this->doCallback($isSent,$this->to,$this->cc,$this->bcc,$this->Subject,$body);
if($result!=0){
throw new phpmailerException($this->Lang('execute').$this->Sendmail,self::STOP_CRITICAL);
}
}
return true;
}
protected function MailSend($header,$body){
$toArr=array();
foreach($this->to as $t){
$toArr[]=$this->AddrFormat($t);
}
$to=implode(', ',$toArr);
$params=sprintf("-oi -f %s",$this->Sender);
if($this->Sender!=''&&strlen(ini_get('safe_mode'))<1){
$old_from=ini_get('sendmail_from');
ini_set('sendmail_from',$this->Sender);
if($this->SingleTo===true&&count($toArr)>1){
foreach($toArr as $key=>$val){
[email protected]($val,$this->EncodeHeader($this->SecureHeader($this->Subject)),$body,$header,$params);
$isSent=($rt==1)?1:0;
$this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body);
}
}else{
[email protected]($to,$this->EncodeHeader($this->SecureHeader($this->Subject)),$body,$header,$params);
$isSent=($rt==1)?1:0;
$this->doCallback($isSent,$to,$this->cc,$this->bcc,$this->Subject,$body);
}
}else{
if($this->SingleTo===true&&count($toArr)>1){
foreach($toArr as $key=>$val){
[email protected]($val,$this->EncodeHeader($this->SecureHeader($this->Subject)),$body,$header,$params);
$isSent=($rt==1)?1:0;
$this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body);
}
}else{
[email protected]($to,$this->EncodeHeader($this->SecureHeader($this->Subject)),$body,$header);
$isSent=($rt==1)?1:0;
$this->doCallback($isSent,$to,$this->cc,$this->bcc,$this->Subject,$body);
}
}
if(isset($old_from)){
ini_set('sendmail_from',$old_from);
}
if(!$rt){
throw new phpmailerException($this->Lang('instantiate'),self::STOP_CRITICAL);
}
return true;
}
protected function SmtpSend($header,$body){
$bad_rcpt=array();
if(!$this->SmtpConnect()){
throw new phpmailerException($this->Lang('smtp_connect_failed'),self::STOP_CRITICAL);
}
$smtp_from=($this->Sender=='')?$this->From:$this->Sender;
if(!$this->smtp->Mail($smtp_from)){
throw new phpmailerException($this->Lang('from_failed').$smtp_from,self::STOP_CRITICAL);
}
foreach($this->to as $to){
if(!$this->smtp->Recipient($to[0])){
$bad_rcpt[]=$to[0];
$isSent=0;
$this->doCallback($isSent,$to[0],'','',$this->Subject,$body);
}else{
$isSent=1;
$this->doCallback($isSent,$to[0],'','',$this->Subject,$body);
}
}
foreach($this->cc as $cc){
if(!$this->smtp->Recipient($cc[0])){
$bad_rcpt[]=$cc[0];
$isSent=0;
$this->doCallback($isSent,'',$cc[0],'',$this->Subject,$bodySendMail);
}else{
$isSent=1;
$this->doCallback($isSent,'',$cc[0],'',$this->Subject,$body);
}
}
foreach($this->bcc as $bcc){
if(!$this->smtp->Recipient($bcc[0])){
$bad_rcpt[]=$bcc[0];
$isSent=0;
$this->doCallback($isSent,'','',$bcc[0],$this->Subject,$body);
}else{
$isSent=1;
$this->doCallback($isSent,'','',$bcc[0],$this->Subject,$body);
}
}
if(count($bad_rcpt)>0){
$badaddresses=implode(', ',$bad_rcpt);
throw new phpmailerException($this->Lang('recipients_failed').$badaddresses);
}
if(!$this->smtp->Data($header.$body)){
throw new phpmailerException($this->Lang('data_not_accepted'),self::STOP_CRITICAL);
}
if($this->SMTPKeepAlive==true){
$this->smtp->Reset();
}
return true;
}
public function SmtpConnect(){
if(is_null($this->smtp)){
$this->smtp=new SMTP();
}
$this->smtp->do_debug=$this->SMTPDebug;
$hosts=explode(';',$this->Host);
$index=0;
$connection=$this->smtp->Connected();
try{
while($index<count($hosts)&&!$connection){
$hostinfo=array();
if(preg_match('/^(.+):([0-9]+)$/',$hosts[$index],$hostinfo)){
$host=$hostinfo[1];
$port=$hostinfo[2];
}else{
$host=$hosts[$index];
$port=$this->Port;
}
$tls=($this->SMTPSecure=='tls');
$ssl=($this->SMTPSecure=='ssl');
if($this->smtp->Connect(($ssl?'ssl://':'').$host,$port,$this->Timeout)){
$hello=($this->Helo!=''?$this->Helo:$this->ServerHostname());
$this->smtp->Hello($hello);
if($tls){
if(!$this->smtp->StartTLS()){
throw new phpmailerException($this->Lang('tls'));
}
$this->smtp->Hello($hello);
}
$connection=true;
if($this->SMTPAuth){
if(!$this->smtp->Authenticate($this->Username,$this->Password)){
throw new phpmailerException($this->Lang('authenticate'));
}
}
}
$index++;
if(!$connection){
throw new phpmailerException($this->Lang('connect_host'));
}
}
}catch(phpmailerException$e){
$this->smtp->Reset();
throw $e;
}
return true;
}
public function SmtpClose(){
if(!is_null($this->smtp)){
if($this->smtp->Connected()){
$this->smtp->Quit();
$this->smtp->Close();
}
}
}
function SetLanguage($langcode='en',$lang_path='language/'){
$PHPMAILER_LANG=array();
$PHPMAILER_LANG['authenticate']='SMTP 错误:登录失败。';
$PHPMAILER_LANG['connect_host']='SMTP 错误:无法连接到 SMTP 主机。';
$PHPMAILER_LANG['data_not_accepted']='SMTP 错误:数据不被接受。';
$PHPMAILER_LANG['encoding']='未知编码: ';
$PHPMAILER_LANG['execute']='无法执行:';
$PHPMAILER_LANG['file_access']='无法访问文件:';
$PHPMAILER_LANG['file_open']='文件错误:无法打开文件:';
$PHPMAILER_LANG['from_failed']='发送地址错误:';
$PHPMAILER_LANG['instantiate']='未知函数调用。';
$PHPMAILER_LANG['mailer_not_supported']='发信客户端不被支持。';
$PHPMAILER_LANG['provide_address']='必须提供至少一个收件人地址。';
$PHPMAILER_LANG['recipients_failed']='SMTP 错误:收件人地址错误:';
$l=true;
$this->language=$PHPMAILER_LANG;
return ($l==true);
}
public function GetTranslations(){
return $this->language;
}
public function AddrAppend($type,$addr){
$addr_str=$type.': ';
$addresses=array();
foreach($addr as $a){
$addresses[]=$this->AddrFormat($a);
}
$addr_str.=implode(', ',$addresses);
$addr_str.=$this->LE;
return $addr_str;
}
public function AddrFormat($addr){
if(empty($addr[1])){
return $this->SecureHeader($addr[0]);
}else{
return $this->EncodeHeader($this->SecureHeader($addr[1]),'phrase')." <".$this->SecureHeader($addr[0]).">";
}
}
public function WrapText($message,$length,$qp_mode=false){
$soft_break=($qp_mode)?sprintf(" =%s",$this->LE):$this->LE;
$is_utf8=(strtolower($this->CharSet)=="utf-8");
$message=$this->FixEOL($message);
if(substr($message,-1)==$this->LE){
$message=substr($message,0,-1);
}
$line=explode($this->LE,$message);
$message='';
for($i=0;$i<count($line);$i++){
$line_part=explode(' ',$line[$i]);
$buf='';
for($e=0;$e<count($line_part);$e++){
$word=$line_part[$e];
if($qp_mode and (strlen($word)>$length)){
$space_left=$length-strlen($buf)-1;
if($e!=0){
if($space_left>20){
$len=$space_left;
if($is_utf8){
$len=$this->UTF8CharBoundary($word,$len);
}elseif(substr($word,$len-1,1)=="="){
$len--;
}elseif(substr($word,$len-2,1)=="="){
$len-=2;
}
$part=substr($word,0,$len);
$word=substr($word,$len);
$buf.=' '.$part;
$message.=$buf.sprintf("=%s",$this->LE);
}else{
$message.=$buf.$soft_break;
}
$buf='';
}
while(strlen($word)>0){
$len=$length;
if($is_utf8){
$len=$this->UTF8CharBoundary($word,$len);
}elseif(substr($word,$len-1,1)=="="){
$len--;
}elseif(substr($word,$len-2,1)=="="){
$len-=2;
}
$part=substr($word,0,$len);
$word=substr($word,$len);
if(strlen($word)>0){
$message.=$part.sprintf("=%s",$this->LE);
}else{
$buf=$part;
}
}
}else{
$buf_o=$buf;
$buf.=($e==0)?$word:(' '.$word);
if(strlen($buf)>$length and $buf_o!=''){
$message.=$buf_o.$soft_break;$buf=$word;
}
}
}
$message.=$buf.$this->LE;
}
return $message;
}
public function UTF8CharBoundary($encodedText,$maxLength){
$foundSplitPos=false;
$lookBack=3;
while(!$foundSplitPos){
$lastChunk=substr($encodedText,$maxLength-$lookBack,$lookBack);
$encodedCharPos=strpos($lastChunk,"=");
if($encodedCharPos!==false){
$hex=substr($encodedText,$maxLength-$lookBack+$encodedCharPos+1,2);
$dec=hexdec($hex);
if($dec<128){
$maxLength=($encodedCharPos==0)?$maxLength:$maxLength-($lookBack-$encodedCharPos);
$foundSplitPos=true;
}elseif($dec>=192){
$maxLength=$maxLength-($lookBack-$encodedCharPos);
$foundSplitPos=true;
}elseif($dec<192){
$lookBack+=3;
}
}else{
$foundSplitPos=true;
}
}
return $maxLength;
}
public function SetWordWrap(){
if($this->WordWrap<1){
return ;
}
switch($this->message_type){
case 'alt':
case 'alt_attachments':
$this->AltBody=$this->WrapText($this->AltBody,$this->WordWrap);
break;
default:
$this->Body=$this->WrapText($this->Body,$this->WordWrap);
break;
}
}
public function CreateHeader(){
$result='';
$uniq_id=md5(uniqid(time()));
$this->boundary[1]='b1_'.$uniq_id;
$this->boundary[2]='b2_'.$uniq_id;
$result.=$this->HeaderLine('Date',self::RFCDate());
if($this->Sender==''){
$result.=$this->HeaderLine('Return-Path',trim($this->From));
}else{
$result.=$this->HeaderLine('Return-Path',trim($this->Sender));
}
if($this->Mailer!='mail'){
if($this->SingleTo===true){
foreach($this->to as $t){
$this->SingleToArray[]=$this->AddrFormat($t);
}
}else{
if(count($this->to)>0){
$result.=$this->AddrAppend('To',$this->to);
}elseif(count($this->cc)==0){
$result.=$this->HeaderLine('To','undisclosed-recipients:;');
}
}
}
$from=array();
$from[0][0]=trim($this->From);
$from[0][1]=$this->FromName;
$result.=$this->AddrAppend('From',$from);
if(count($this->cc)>0){
$result.=$this->AddrAppend('Cc',$this->cc);
}
if((($this->Mailer=='sendmail')||($this->Mailer=='mail'))&&(count($this->bcc)>0)){
$result.=$this->AddrAppend('Bcc',$this->bcc);
}
if(count($this->ReplyTo)>0){
$result.=$this->AddrAppend('Reply-to',$this->ReplyTo);
}
if($this->Mailer!='mail'){
$result.=$this->HeaderLine('Subject',$this->EncodeHeader($this->SecureHeader($this->Subject)));
}
if($this->MessageID!=''){
$result.=$this->HeaderLine('Message-ID',$this->MessageID);
}else{
$result.=sprintf("Message-ID: <%[email protected]%s>%s",$uniq_id,$this->ServerHostname(),$this->LE);
}
$result.=$this->HeaderLine('X-Priority',$this->Priority);
$result.=$this->HeaderLine('X-Mailer','PHPMailer '.$this->Version.' (phpmailer.sourceforge.net)');
if($this->ConfirmReadingTo!=''){
$result.=$this->HeaderLine('Disposition-Notification-To','<'.trim($this->ConfirmReadingTo).'>');
}
for($index=0;$index<count($this->CustomHeader);$index++){
$result.=$this->HeaderLine(trim($this->CustomHeader[$index][0]),$this->EncodeHeader(trim($this->CustomHeader[$index][1])));
}
if(!$this->sign_key_file){
$result.=$this->HeaderLine('MIME-Version','1.0');
$result.=$this->GetMailMIME();
}
return $result;
}
public function GetMailMIME(){
$result='';
switch($this->message_type){
case 'plain':
$result.=$this->HeaderLine('Content-Transfer-Encoding',$this->Encoding);
$result.=sprintf("Content-Type: %s; charset=\"%s\"",$this->ContentType,$this->CharSet);
break;
case 'attachments':
case 'alt_attachments':
if($this->InlineImageExists()){
$result.=sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s",'multipart/related',$this->LE,$this->LE,$this->boundary[1],$this->LE);
}else{
$result.=$this->HeaderLine('Content-Type','multipart/mixed;');
$result.=$this->TextLine("\tboundary=\"".$this->boundary[1].'"');
}
break;
case 'alt':
$result.=$this->HeaderLine('Content-Type','multipart/alternative;');
$result.=$this->TextLine("\tboundary=\"".$this->boundary[1].'"');
break;
}
if($this->Mailer!='mail'){
$result.=$this->LE.$this->LE;
}
return $result;
}
public function CreateBody(){
$body='';
if($this->sign_key_file){
$body.=$this->GetMailMIME();
}
$this->SetWordWrap();
switch($this->message_type){
case 'alt':
$body.=$this->GetBoundary($this->boundary[1],'','text/plain','');
$body.=$this->EncodeString($this->AltBody,$this->Encoding);
$body.=$this->LE.$this->LE;
$body.=$this->GetBoundary($this->boundary[1],'','text/html','');
$body.=$this->EncodeString($this->Body,$this->Encoding);
$body.=$this->LE.$this->LE;
$body.=$this->EndBoundary($this->boundary[1]);
break;
case 'plain':
$body.=$this->EncodeString($this->Body,$this->Encoding);
break;
case 'attachments':
$body.=$this->GetBoundary($this->boundary[1],'','','');
$body.=$this->EncodeString($this->Body,$this->Encoding);
$body.=$this->LE;
$body.=$this->AttachAll();
break;
case 'alt_attachments':
$body.=sprintf("--%s%s",$this->boundary[1],$this->LE);
$body.=sprintf("Content-Type: %s;%s"."\tboundary=\"%s\"%s",'multipart/alternative',$this->LE,$this->boundary[2],$this->LE.$this->LE);
$body.=$this->GetBoundary($this->boundary[2],'','text/plain','').$this->LE;
$body.=$this->EncodeString($this->AltBody,$this->Encoding);
$body.=$this->LE.$this->LE;
$body.=$this->GetBoundary($this->boundary[2],'','text/html','').$this->LE;
$body.=$this->EncodeString($this->Body,$this->Encoding);
$body.=$this->LE.$this->LE;
$body.=$this->EndBoundary($this->boundary[2]);
$body.=$this->AttachAll();
break;
}
if($this->IsError()){
$body='';
}elseif($this->sign_key_file){
try{
$file=tempnam('','mail');
file_put_contents($file,$body);
$signed=tempnam("","signed");
if(@openssl_pkcs7_sign($file,$signed,"file://".$this->sign_cert_file,array("file://".$this->sign_key_file,$this->sign_key_pass),NULL)){
@unlink($file);
@unlink($signed);
$body=file_get_contents($signed);
}else{
@unlink($file);
@unlink($signed);
throw new phpmailerException($this->Lang("signing").openssl_error_string());
}
}catch(phpmailerException$e){
$body='';
if($this->exceptions){
throw $e;
}
}
}
return $body;
}
private function GetBoundary($boundary,$charSet,$contentType,$encoding){
$result='';
if($charSet==''){
$charSet=$this->CharSet;
}
if($contentType==''){
$contentType=$this->ContentType;
}
if($encoding==''){
$encoding=$this->Encoding;
}
$result.=$this->TextLine('--'.$boundary);
$result.=sprintf("Content-Type: %s; charset = \"%s\"",$contentType,$charSet);
$result.=$this->LE;
$result.=$this->HeaderLine('Content-Transfer-Encoding',$encoding);
$result.=$this->LE;
return $result;
}
private function EndBoundary($boundary){
return $this->LE.'--'.$boundary.'--'.$this->LE;
}
private function SetMessageType(){
if(count($this->attachment)<1&&strlen($this->AltBody)<1){
$this->message_type='plain';
}else{
if(count($this->attachment)>0){
$this->message_type='attachments';
}
if(strlen($this->AltBody)>0&&count($this->attachment)<1){
$this->message_type='alt';
}
if(strlen($this->AltBody)>0&&count($this->attachment)>0){
$this->message_type='alt_attachments';
}
}
}
public function HeaderLine($name,$value){
return $name.': '.$value.$this->LE;
}
public function TextLine($value){
return $value.$this->LE;
}
public function AddAttachment($path,$name='',$encoding='base64',$type='application/octet-stream'){
try{
if([email protected]_file($path)){
throw new phpmailerException($this->Lang('file_access').$path,self::STOP_CONTINUE);
}
$filename=basename($path);
if($name==''){
$name=$filename;
}
$this->attachment[]=array(0=>$path,1=>$filename,2=>$name,3=>$encoding,4=>$type,5=>false,6=>'attachment',7=>0);
}catch(phpmailerException$e){
$this->SetError($e->getMessage());
if($this->exceptions){
throw $e;
}
if($e->getCode()==self::STOP_CRITICAL){
return false;
}
}
return true;
}
public function GetAttachments(){
return $this->attachment;
}
private function AttachAll(){
$mime=array();
$cidUniq=array();
$incl=array();
foreach($this->attachment as $attachment){
$bString=$attachment[5];
if($bString){
$string=$attachment[0];
}else{
$path=$attachment[0];
}
if(in_array($attachment[0],$incl)){
continue;
}
$filename=$attachment[1];
$name=$attachment[2];
$encoding=$attachment[3];
$type=$attachment[4];
$disposition=$attachment[6];
$cid=$attachment[7];
$incl[]=$attachment[0];
if($disposition=='inline'&&isset($cidUniq[$cid])){
continue;
}
$cidUniq[$cid]=true;
$mime[]=sprintf("--%s%s",$this->boundary[1],$this->LE);
$mime[]=sprintf("Content-Type: %s; name=\"%s\"%s",$type,$this->EncodeHeader($this->SecureHeader($name)),$this->LE);
$mime[]=sprintf("Content-Transfer-Encoding: %s%s",$encoding,$this->LE);
if($disposition=='inline'){
$mime[]=sprintf("Content-ID: <%s>%s",$cid,$this->LE);
}
$mime[]=sprintf("Content-Disposition: %s; filename=\"%s\"%s",$disposition,$this->EncodeHeader($this->SecureHeader($name)),$this->LE.$this->LE);
if($bString){
$mime[]=$this->EncodeString($string,$encoding);
if($this->IsError()){
return '';
}
$mime[]=$this->LE.$this->LE;
}else{
$mime[]=$this->EncodeFile($path,$encoding);
if($this->IsError()){
return '';
}
$mime[]=$this->LE.$this->LE;
}
}
$mime[]=sprintf("--%s--%s",$this->boundary[1],$this->LE);
return join('',$mime);
}
private function EncodeFile($path,$encoding='base64'){
try{
if(!is_readable($path)){
throw new phpmailerException($this->Lang('file_open').$path,self::STOP_CONTINUE);
}
if(function_exists('get_magic_quotes')){
function get_magic_quotes(){
return false;
}
}
if(PHP_VERSION<6){
$magic_quotes=get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
}
$file_buffer=file_get_contents($path);
$file_buffer=$this->EncodeString($file_buffer,$encoding);
if(PHP_VERSION<6){
set_magic_quotes_runtime($magic_quotes);
}
return $file_buffer;
}catch(Exception$e){
$this->SetError($e->getMessage());return '';
}
}
public function EncodeString($str,$encoding='base64'){
$encoded='';
switch(strtolower($encoding)){
case 'base64':
$encoded=chunk_split(base64_encode($str),76,$this->LE);
break;
case '7bit':
case '8bit':
$encoded=$this->FixEOL($str);
if(substr($encoded,-(strlen($this->LE)))!=$this->LE)$encoded.=$this->LE;
break;
case 'binary':
$encoded=$str;
break;
case 'quoted-printable':
$encoded=$this->EncodeQP($str);
break;
default:
$this->SetError($this->Lang('encoding').$encoding);
break;
}
return $encoded;
}
public function EncodeHeader($str,$position='text'){
$x=0;
switch(strtolower($position)){
case 'phrase':
if(!preg_match('/[\200-\377]/',$str)){
$encoded=addcslashes($str,"\0..\37\177\\\"");
if(($str==$encoded)&&!preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/',$str)){
return ($encoded);
}else{
return ("\"$encoded\"");
}
}
$x=preg_match_all('/[^\040\041\043-\133\135-\176]/',$str,$matches);
break;
case 'comment':
$x=preg_match_all('/[()"]/',$str,$matches);
case 'text':
default:
$x+=preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/',$str,$matches);break;
}
if($x==0){
return ($str);
}
$maxlen=75-7-strlen($this->CharSet);
if(strlen($str)/3<$x){
$encoding='B';
if(function_exists('mb_strlen')&&$this->HasMultiBytes($str)){
$encoded=$this->Base64EncodeWrapMB($str);
}else{
$encoded=base64_encode($str);
$maxlen-=$maxlen%4;
$encoded=trim(chunk_split($encoded,$maxlen,"\n"));
}
}else{
$encoding='Q';
$encoded=$this->EncodeQ($str,$position);
$encoded=$this->WrapText($encoded,$maxlen,true);
$encoded=str_replace('='.$this->LE,"\n",trim($encoded));
}
$encoded=preg_replace('/^(.*)$/m'," =?".$this->CharSet."?$encoding?\\1?=",$encoded);
$encoded=trim(str_replace("\n",$this->LE,$encoded));
return $encoded;
}
public function HasMultiBytes($str){
if(function_exists('mb_strlen')){
return (strlen($str)>mb_strlen($str,$this->CharSet));
}else{
return false;
}
}
public function Base64EncodeWrapMB($str){
$start="=?".$this->CharSet."?B?";
$end="?=";
$encoded="";
$mb_length=mb_strlen($str,$this->CharSet);
$length=75-strlen($start)-strlen($end);
$ratio=$mb_length/strlen($str);
$offset=$avgLength=floor($length*$ratio*.75);
for($i=0;$i<$mb_length;$i+=$offset){
$lookBack=0;
do{
$offset=$avgLength-$lookBack;
$chunk=mb_substr($str,$i,$offset,$this->CharSet);
$chunk=base64_encode($chunk);$lookBack++;
}while(strlen($chunk)>$length);
$encoded.=$chunk.$this->LE;
}
$encoded=substr($encoded,0,-strlen($this->LE));
return $encoded;
}
public function EncodeQPphp($input='',$line_max=76,$space_conv=false){
$hex=array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
$lines=preg_split('/(?:\r\n|\r|\n)/',$input);
$eol="\r\n";
$escape='=';
$output='';
while(list(,$line)=each($lines)){
$linlen=strlen($line);
$newline='';
for($i=0;$i<$linlen;$i++){
$c=substr($line,$i,1);
$dec=ord($c);
if(($i==0)&&($dec==46)){
$c='=2E';
}
if($dec==32){
if($i==($linlen-1)){
$c='=20';
}elseif($space_conv){
$c='=20';
}
}elseif(($dec==61)||($dec<32)||($dec>126)){
$h2=floor($dec/16);
$h1=floor($dec%16);
$c=$escape.$hex[$h2].$hex[$h1];
}
if((strlen($newline)+strlen($c))>=$line_max){
$output.=$newline.$escape.$eol;
$newline='';
if($dec==46){
$c='=2E';
}
}
$newline.=$c;
}
$output.=$newline.$eol;
}
return $output;
}
public function EncodeQP($string,$line_max=76,$space_conv=false){
if(function_exists('quoted_printable_encode')){
return quoted_printable_encode($string);
}
$filters=stream_get_filters();
if(!in_array('convert.*',$filters)){
return $this->EncodeQPphp($string,$line_max,$space_conv);
}
$fp=fopen('php://temp/','r+');
$string=preg_replace('/\r\n?/',$this->LE,$string);
$params=array('line-length'=>$line_max,'line-break-chars'=>$this->LE);
$s=stream_filter_append($fp,'convert.quoted-printable-encode',STREAM_FILTER_READ,$params);
fputs($fp,$string);
rewind($fp);
$out=stream_get_contents($fp);
stream_filter_remove($s);
$out=preg_replace('/^\./m','=2E',$out);
fclose($fp);
return $out;
}
public function EncodeQ($str,$position='text'){
$encoded=preg_replace('/[\r\n]*/','',$str);
switch(strtolower($position)){
case 'phrase':
$encoded=preg_replace("/([^A-Za-z0-9!*+\/ -])/e","'='.sprintf('%02X', ord('\\1'))",$encoded);
break;
case 'comment':
$encoded=preg_replace("/([\(\)\"])/e","'='.sprintf('%02X', ord('\\1'))",$encoded);
case 'text':
default:
$encoded=preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',"'='.sprintf('%02X', ord('\\1'))",$encoded);
break;
}
$encoded=str_replace(' ','_',$encoded);
return $encoded;
}
public function AddStringAttachment($string,$filename,$encoding='base64',$type='application/octet-stream'){
$this->attachment[]=array(0=>$string,1=>$filename,2=>basename($filename),3=>$encoding,4=>$type,5=>true,6=>'attachment',7=>0);
}
public function AddEmbeddedImage($path,$cid,$name='',$encoding='base64',$type='application/octet-stream'){
if([email protected]_file($path)){
$this->SetError($this->Lang('file_access').$path);
return false;
}
$filename=basename($path);
if($name==''){
$name=$filename;
}
$this->attachment[]=array(0=>$path,1=>$filename,2=>$name,3=>$encoding,4=>$type,5=>false,6=>'inline',7=>$cid);
return true;
}
public function InlineImageExists(){
foreach($this->attachment as $attachment){
if($attachment[6]=='inline'){
return true;
}
}
return false;
}
public function ClearAddresses(){
foreach($this->to as $to){
unset($this->all_recipients[strtolower($to[0])]);
}
$this->to=array();
}
public function ClearCCs(){
foreach($this->cc as $cc){
unset($this->all_recipients[strtolower($cc[0])]);
}
$this->cc=array();
}
public function ClearBCCs(){
foreach($this->bcc as $bcc){
unset($this->all_recipients[strtolower($bcc[0])]);
}
$this->bcc=array();
}
public function ClearReplyTos(){
$this->ReplyTo=array();
}
public function ClearAllRecipients(){
$this->to=array();
$this->cc=array();
$this->bcc=array();
$this->all_recipients=array();
}
public function ClearAttachments(){
$this->attachment=array();
}
public function ClearCustomHeaders(){
$this->CustomHeader=array();
}
protected function SetError($msg){
$this->error_count++;
if($this->Mailer=='smtp' and !is_null($this->smtp)){
$lasterror=$this->smtp->getError();
if(!empty($lasterror) and array_key_exists('smtp_msg',$lasterror)){
$msg.='<p>'.$this->Lang('smtp_error').$lasterror['smtp_msg']."</p>\n";
}
}
$this->ErrorInfo=$msg;
}
public static function RFCDate(){
$tz=date('Z');
$tzs=($tz<0)?'-':'+';
$tz=abs($tz);
$tz=(int)($tz/3600)*100+($tz%3600)/60;
$result=sprintf("%s %s%04d",date('D, j M Y H:i:s'),$tzs,$tz);
return $result;
}
private function ServerHostname(){
if(!empty($this->Hostname)){
$result=$this->Hostname;
}elseif(isset($_SERVER['SERVER_NAME'])){
$result=$_SERVER['SERVER_NAME'];
}else{
$result='localhost.localdomain';
}
return $result;
}
private function Lang($key){
if(count($this->language)<1){
$this->SetLanguage('en');
}
if(isset($this->language[$key])){
return $this->language[$key];
}else{
return 'Language string failed to load: '.$key;
}
}
public function IsError(){
return ($this->error_count>0);
}
private function FixEOL($str){
$str=str_replace("\r\n","\n",$str);
$str=str_replace("\r","\n",$str);
$str=str_replace("\n",$this->LE,$str);
return $str;
}
public function AddCustomHeader($custom_header){
$this->CustomHeader[]=explode(':',$custom_header,2);
}
public function MsgHTML($message,$basedir=''){
preg_match_all("/(src|background)=\"(.*)\"/Ui",$message,$images);
if(isset($images[2])){
foreach($images[2] as $i=>$url){
if(!preg_match('#^[A-z]+://#',$url)){
$filename=basename($url);
$directory=dirname($url);
($directory=='.')?$directory='':'';
$cid='cid:'.md5($filename);
$ext=pathinfo($filename,PATHINFO_EXTENSION);
$mimeType=self::_mime_types($ext);
if(strlen($basedir)>1&&substr($basedir,-1)!='/'){
$basedir.='/';
}
if(strlen($directory)>1&&substr($directory,-1)!='/'){
$directory.='/';
}
if($this->AddEmbeddedImage($basedir.$directory.$filename,md5($filename),$filename,'base64',$mimeType)){
$message=preg_replace("/".$images[1][$i]."=\"".preg_quote($url,'/')."\"/Ui",$images[1][$i]."=\"".$cid."\"",$message);
}
}
}
}
$this->IsHTML(true);
$this->Body=$message;
$textMsg=trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message)));
if(!empty($textMsg)&&empty($this->AltBody)){
$this->AltBody=html_entity_decode($textMsg);
}
if(empty($this->AltBody)){
$this->AltBody='To view this email message, open it in a program that understands HTML!'."\n\n";
}
}
public static function _mime_types($ext=''){
$mimes=array(
'hqx'=>'application/mac-binhex40',
'cpt'=>'application/mac-compactpro',
'doc'=>'application/msword',
'bin'=>'application/macbinary',
'dms'=>'application/octet-stream',
'lha'=>'application/octet-stream',
'lzh'=>'application/octet-stream',
'exe'=>'application/octet-stream',
'class'=>'application/octet-stream',
'psd'=>'application/octet-stream',
'so'=>'application/octet-stream',
'sea'=>'application/octet-stream',
'dll'=>'application/octet-stream',
'oda'=>'application/oda',
'pdf'=>'application/pdf',
'ai'=>'application/postscript',
'eps'=>'application/postscript',
'ps'=>'application/postscript',
'smi'=>'application/smil',
'smil'=>'application/smil',
'mif'=>'application/vnd.mif',
'xls'=>'application/vnd.ms-excel',
'ppt'=>'application/vnd.ms-powerpoint',
'wbxml'=>'application/vnd.wap.wbxml',
'wmlc'=>'application/vnd.wap.wmlc',
'dcr'=>'application/x-director',
'dir'=>'application/x-director',
'dxr'=>'application/x-director',
'dvi'=>'application/x-dvi',
'gtar'=>'application/x-gtar',
'php'=>'application/x-httpd-php',
'php4'=>'application/x-httpd-php',
'php3'=>'application/x-httpd-php',
'phtml'=>'application/x-httpd-php',
'phps'=>'application/x-httpd-php-source',
'js'=>'application/x-javascript',
'swf'=>'application/x-shockwave-flash',
'sit'=>'application/x-stuffit',
'tar'=>'application/x-tar',
'tgz'=>'application/x-tar',
'xhtml'=>'application/xhtml+xml',
'xht'=>'application/xhtml+xml',
'zip'=>'application/zip',
'mid'=>'audio/midi',
'midi'=>'audio/midi',
'mpga'=>'audio/mpeg',
'mp2'=>'audio/mpeg',
'mp3'=>'audio/mpeg',
'aif'=>'audio/x-aiff',
'aiff'=>'audio/x-aiff',
'aifc'=>'audio/x-aiff',
'ram'=>'audio/x-pn-realaudio',
'rm'=>'audio/x-pn-realaudio',
'rpm'=>'audio/x-pn-realaudio-plugin',
'ra'=>'audio/x-realaudio',
'rv'=>'video/vnd.rn-realvideo',
'wav'=>'audio/x-wav',
'bmp'=>'image/bmp',
'gif'=>'image/gif',
'jpeg'=>'image/jpeg',
'jpg'=>'image/jpeg',
'jpe'=>'image/jpeg',
'png'=>'image/png',
'tiff'=>'image/tiff',
'tif'=>'image/tiff',
'css'=>'text/css',
'html'=>'text/html',
'htm'=>'text/html',
'shtml'=>'text/html',
'txt'=>'text/plain',
'text'=>'text/plain',
'log'=>'text/plain',
'rtx'=>'text/richtext',
'rtf'=>'text/rtf',
'xml'=>'text/xml',
'xsl'=>'text/xml',
'mpeg'=>'video/mpeg',
'mpg'=>'video/mpeg',
'mpe'=>'video/mpeg',
'qt'=>'video/quicktime',
'mov'=>'video/quicktime',
'avi'=>'video/x-msvideo',
'movie'=>'video/x-sgi-movie',
'doc'=>'application/msword',
'word'=>'application/msword',
'xl'=>'application/excel',
'eml'=>'message/rfc822'
);
return (!isset($mimes[strtolower($ext)]))?'application/octet-stream':$mimes[strtolower($ext)];
}
public function set($name,$value=''){
try{
if(isset($this->$name)){
$this->$name=$value;
}else{
throw new phpmailerException($this->Lang('variable_set').$name,self::STOP_CRITICAL);
}
}catch(Exception$e){
$this->SetError($e->getMessage());
if($e->getCode()==self::STOP_CRITICAL){
return false;
}
}
return true;
}
public function SecureHeader($str){
$str=str_replace("\r",'',$str);
$str=str_replace("\n",'',$str);
return trim($str);
}
public function Sign($cert_filename,$key_filename,$key_pass){
$this->sign_cert_file=$cert_filename;
$this->sign_key_file=$key_filename;
$this->sign_key_pass=$key_pass;
}
public function DKIM_QP($txt){
$tmp="";
$line="";
for($i=0;$i<strlen($txt);$i++){
$ord=ord($txt[$i]);
if(((0x21<=$ord)&&($ord<=0x3A))||$ord==0x3C||((0x3E<=$ord)&&($ord<=0x7E))){
$line.=$txt[$i];
}else{
$line.="=".sprintf("%02X",$ord);
}
}
return $line;
}
public function DKIM_Sign($s){
$privKeyStr=file_get_contents($this->DKIM_private);
if($this->DKIM_passphrase!=''){
$privKey=openssl_pkey_get_private($privKeyStr,$this->DKIM_passphrase);
}else{
$privKey=$privKeyStr;
}
if(openssl_sign($s,$signature,$privKey)){
return base64_encode($signature);
}
}
public function DKIM_HeaderC($s){
$s=preg_replace("/\r\n\s+/"," ",$s);
$lines=explode("\r\n",$s);
foreach($lines as $key=>$line){
list($heading,$value)=explode(":",$line,2);
$heading=strtolower($heading);
$value=preg_replace("/\s+/"," ",$value);
$lines[$key]=$heading.":".trim($value);
}
$s=implode("\r\n",$lines);
return $s;
}
public function DKIM_BodyC($body){
if($body=='')return "\r\n";
$body=str_replace("\r\n","\n",$body);
$body=str_replace("\n","\r\n",$body);
while(substr($body,strlen($body)-4,4)=="\r\n\r\n"){
$body=substr($body,0,strlen($body)-2);
}
return $body;
}
public function DKIM_Add($headers_line,$subject,$body){
$DKIMsignatureType='rsa-sha1';
$DKIMcanonicalization='relaxed/simple';
$DKIMquery='dns/txt';
$DKIMtime=time();
$subject_header="Subject: $subject";
$headers=explode("\r\n",$headers_line);
foreach($headers as $header){
if(strpos($header,'From:')===0){
$from_header=$header;
}elseif(strpos($header,'To:')===0){
$to_header=$header;
}
}
$from=str_replace('|','=7C',$this->DKIM_QP($from_header));
$to=str_replace('|','=7C',$this->DKIM_QP($to_header));
$subject=str_replace('|','=7C',$this->DKIM_QP($subject_header));
$body=$this->DKIM_BodyC($body);
$DKIMlen=strlen($body);
$DKIMb64=base64_encode(pack("H*",sha1($body)));
$ident=($this->DKIM_identity=='')?'':" i=".$this->DKIM_identity.";";
$dkimhdrs="DKIM-Signature: v=1; a=".$DKIMsignatureType."; q=".$DKIMquery."; l=".$DKIMlen."; s=".$this->DKIM_selector.";\r\n"."\tt=".$DKIMtime."; c=".$DKIMcanonicalization.";\r\n"."\th=From:To:Subject;\r\n"."\td=".$this->DKIM_domain.";".$ident."\r\n"."\tz=$from\r\n"."\t|$to\r\n"."\t|$subject;\r\n"."\tbh=".$DKIMb64.";\r\n"."\tb=";
$toSign=$this->DKIM_HeaderC($from_header."\r\n".$to_header."\r\n".$subject_header."\r\n".$dkimhdrs);
$signed=$this->DKIM_Sign($toSign);
return "X-PHPMAILER-DKIM: phpmailer.worxware.com\r\n".$dkimhdrs.$signed."\r\n";
}
protected function doCallback($isSent,$to,$cc,$bcc,$subject,$body){
if(!empty($this->action_function)&&function_exists($this->action_function)){
$params=array($isSent,$to,$cc,$bcc,$subject,$body);
call_user_func_array($this->action_function,$params);
}
}
}
class phpmailerException extends Exception{
public function errorMessage(){
return $this->getMessage();
}
}
class SMTP{
public $SMTP_PORT=25;
public $CRLF="\r\n";
public $do_debug;
public $do_verp=false;
private $smtp_conn;
private $error;
private $helo_rply;
public function __construct(){
$this->smtp_conn=0;
$this->error=null;
$this->helo_rply=null;
$this->do_debug=0;
}
public function Connect($host,$port=0,$tval=30){
$this->error=null;
if($this->connected()){
$this->error=array("error"=>"Already connected to a server");
return false;
}
if(empty($port)){
$port=$this->SMTP_PORT;
}
$this->[email protected]($host,$port,$errno,$errstr,$tval);
stream_set_blocking($this->smtp_conn, true); //重要,设置为非阻塞模式
stream_set_timeout($this->smtp_conn,10); //设置超时
if(empty($this->smtp_conn)){
$this->error=array("error"=>"Failed to connect to server","errno"=>$errno,"errstr"=>$errstr);
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$this->error["error"].": $errstr ($errno)".$this->CRLF.'<br />';
}
return false;
}
if(substr(PHP_OS,0,3)!="WIN")socket_set_timeout($this->smtp_conn,$tval,0);
$announce=$this->get_lines();
if($this->do_debug>=2){
echo "SMTP -> FROM SERVER:".$announce.$this->CRLF.'<br />';
}
return true;
}
public function StartTLS(){
$this->error=null;
if(!$this->connected()){
$this->error=array("error"=>"Called StartTLS() without being connected");
return false;
}
fputs($this->smtp_conn,"STARTTLS".$this->CRLF);
$rply=$this->get_lines();
$code=substr($rply,0,3);
if($this->do_debug>=2){
echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.'<br />';
}
if($code!=220){
$this->error=array("error"=>"STARTTLS not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.'<br />';
}
return false;
}if(!stream_socket_enable_crypto($this->smtp_conn,true,STREAM_CRYPTO_METHOD_TLS_CLIENT)){
return false;
}
return true;
}
public function Authenticate($username,$password){
fputs($this->smtp_conn,"AUTH LOGIN".$this->CRLF);
$rply=$this->get_lines();
$code=substr($rply,0,3);
if($code!=334){
$this->error=array("error"=>"AUTH not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.'<br />';
}
return false;
}
fputs($this->smtp_conn,base64_encode($username).$this->CRLF);
$rply=$this->get_lines();
$code=substr($rply,0,3);
if($code!=334){
$this->error=array("error"=>"Username not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.'<br />';
}
return false;
}
fputs($this->smtp_conn,base64_encode($password).$this->CRLF);
$rply=$this->get_lines();
$code=substr($rply,0,3);
if($code!=235){
$this->error=array("error"=>"Password not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.'<br />';
}
return false;
}
return true;
}
public function Connected(){
if(!empty($this->smtp_conn)){
$sock_status=socket_get_status($this->smtp_conn);
if($sock_status["eof"]){
if($this->do_debug>=1){
echo "SMTP -> NOTICE:".$this->CRLF."EOF caught while checking if connected";
}
$this->Close();
return false;
}
return true;
}
return false;
}
public function Close(){
$this->error=null;
$this->helo_rply=null;
if(!empty($this->smtp_conn)){
fclose($this->smtp_conn);
$this->smtp_conn=0;
}
}
public function Data($msg_data){
$this->error=null;
if(!$this->connected()){
$this->error=array("error"=>"Called Data() without being connected");
return false;
}
fputs($this->smtp_conn,"DATA".$this->CRLF);
$rply=$this->get_lines();
$code=substr($rply,0,3);
if($this->do_debug>=2){
echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.'<br />';
}
if($code!=354){
$this->error=array("error"=>"DATA command not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.'<br />';
}
return false;
}
$msg_data=str_replace("\r\n","\n",$msg_data);
$msg_data=str_replace("\r","\n",$msg_data);
$lines=explode("\n",$msg_data);
$field=substr($lines[0],0,strpos($lines[0],":"));
$in_headers=false;
if(!empty($field)&&!strstr($field," ")){
$in_headers=true;
}
$max_line_length=998;
while(list(,$line)[email protected]($lines)){
$lines_out=null;
if($line==""&&$in_headers){
$in_headers=false;
}
while(strlen($line)>$max_line_length){
$pos=strrpos(substr($line,0,$max_line_length)," ");
if(!$pos){
$pos=$max_line_length-1;
$lines_out[]=substr($line,0,$pos);
$line=substr($line,$pos);
}else{
$lines_out[]=substr($line,0,$pos);
$line=substr($line,$pos+1);
}
if($in_headers){
$line="\t".$line;
}
}
$lines_out[]=$line;
while(list(,$line_out)[email protected]($lines_out)){
if(strlen($line_out)>0){
if(substr($line_out,0,1)=="."){
$line_out=".".$line_out;
}
}
fputs($this->smtp_conn,$line_out.$this->CRLF);
}
}
fputs($this->smtp_conn,$this->CRLF.".".$this->CRLF);
$rply=$this->get_lines();
$code=substr($rply,0,3);
if($this->do_debug>=2){
echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.'<br />';
}
if($code!=250){
$this->error=array("error"=>"DATA not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.'<br />';
}
return false;
}
return true;
}
public function Hello($host=''){
$this->error=null;
if(!$this->connected()){
$this->error=array("error"=>"Called Hello() without being connected");
return false;
}
if(empty($host)){
$host="localhost";
}
if(!$this->SendHello("EHLO",$host)){
if(!$this->SendHello("HELO",$host)){
return false;
}
}
return true;
}
private function SendHello($hello,$host){
fputs($this->smtp_conn,$hello." ".$host.$this->CRLF);
$rply=$this->get_lines();
$code=substr($rply,0,3);
if($this->do_debug>=2){
echo "SMTP -> FROM SERVER: ".$rply.$this->CRLF.'<br />';
}
if($code!=250){
$this->error=array("error"=>$hello." not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.'<br />';
}
return false;
}
$this->helo_rply=$rply;
return true;
}
public function Mail($from){
$this->error=null;
if(!$this->connected()){
$this->error=array("error"=>"Called Mail() without being connected");
return false;
}
$useVerp=($this->do_verp?"XVERP":"");
fputs($this->smtp_conn,"MAIL FROM:<".$from.">".$useVerp.$this->CRLF);
$rply=$this->get_lines();
$code=substr($rply,0,3);
if($this->do_debug>=2){
echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.'<br />';
}
if($code!=250){
$this->error=array("error"=>"MAIL not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.'<br />';
}
return false;
}
return true;
}
public function Quit($close_on_error=true){
$this->error=null;
if(!$this->connected()){
$this->error=array("error"=>"Called Quit() without being connected");
return false;
}
fputs($this->smtp_conn,"quit".$this->CRLF);
$byemsg=$this->get_lines();
if($this->do_debug>=2){
echo "SMTP -> FROM SERVER:".$byemsg.$this->CRLF.'<br />';
}
$rval=true;
$e=null;
$code=substr($byemsg,0,3);
if($code!=221){
$e=array("error"=>"SMTP server rejected quit command","smtp_code"=>$code,"smtp_rply"=>substr($byemsg,4));
$rval=false;
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$e["error"].": ".$byemsg.$this->CRLF.'<br />';
}
}if(empty($e)||$close_on_error){
$this->Close();
}
return $rval;
}
public function Recipient($to){
$this->error=null;
if(!$this->connected()){
$this->error=array("error"=>"Called Recipient() without being connected");
return false;
}
fputs($this->smtp_conn,"RCPT TO:<".$to.">".$this->CRLF);
$rply=$this->get_lines();
$code=substr($rply,0,3);
if($this->do_debug>=2){
echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.'<br />';
}
if($code!=250&&$code!=251){
$this->error=array("error"=>"RCPT not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.'<br />';
}
return false;
}
return true;
}
public function Reset(){
$this->error=null;
if(!$this->connected()){
$this->error=array("error"=>"Called Reset() without being connected");
return false;
}
fputs($this->smtp_conn,"RSET".$this->CRLF);
$rply=$this->get_lines();
$code=substr($rply,0,3);
if($this->do_debug>=2){
echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.'<br />';
}
if($code!=250){
$this->error=array("error"=>"RSET failed","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.'<br />';
}
return false;
}
return true;
}
public function SendAndMail($from){
$this->error=null;
if(!$this->connected()){
$this->error=array("error"=>"Called SendAndMail() without being connected");
return false;
}
fputs($this->smtp_conn,"SAML FROM:".$from.$this->CRLF);
$rply=$this->get_lines();
$code=substr($rply,0,3);
if($this->do_debug>=2){
echo "SMTP -> FROM SERVER:".$rply.$this->CRLF.'<br />';
}
if($code!=250){
$this->error=array("error"=>"SAML not accepted from server","smtp_code"=>$code,"smtp_msg"=>substr($rply,4));
if($this->do_debug>=1){
echo "SMTP -> ERROR: ".$this->error["error"].": ".$rply.$this->CRLF.'<br />';
}
return false;
}
return true;
}
public function Turn(){
$this->error=array("error"=>"This method, TURN, of the SMTP "."is not implemented");
if($this->do_debug>=1){
echo "SMTP -> NOTICE: ".$this->error["error"].$this->CRLF.'<br />';
}
return false;
}
public function getError(){
return $this->error;
}
private function get_lines(){
$data="";
while([email protected]($this->smtp_conn,515)){
$info = stream_get_meta_data($this->smtp_conn);
if($this->do_debug>=4){
echo "SMTP -> get_lines(): \$data was \"$data\"".$this->CRLF.'<br />';
echo "SMTP -> get_lines(): \$str is \"$str\"".$this->CRLF.'<br />';
}
$data.=$str;
if($this->do_debug>=4){
echo "SMTP -> get_lines(): \$data is \"$data\"".$this->CRLF.'<br />';
}
if(substr($str,3,1)==" "){
break;
}
}
return $data;
}
}
function SendMail($address,$title,$message,$fromname='NONE',$img='',$file=''){
$mail= new PHPMailer(true);
try {
$mail->IsSMTP();
$mail->CharSet='utf-8';
$mail->AddAddress($address);
$mail->Body=$message;
$mail->From= "[email protected]";
$mail->FromName=$fromname;
$mail->Subject=$title;
$mail->Host="smtp.qq.com";
$mail->SMTPAuth=true;
$mail->Port='25';
$mail->SMTPSecure= false;
$mail->Username="[email protected]";
$mail->Password="tktwhqfpwavdbeaf";
$mail->IsHTML(true);
$mail->MsgHTML($message);
return($mail->Send());
} catch (phpmailerException $e) {
return $e->errorMessage();
} catch (Exception $e) {
return $e->getMessage();
}
}
?>
边栏推荐
- The querystring module
- Common methods of js array deduplication
- 三元判断再三元判断
- COCO数据集训练TPH-YoloV5
- 一分种一起来了解Vite的基础
- C语言的变长数组
- 针对简历上的问题
- 1.6一些今日学习
- Advanced gradient of skeleton effect, suitable for waiting for pictures
- Living to detect the Adaptive Normalized Representation Learning for GeneralizableFace Anti - Spoofing reading notes
猜你喜欢
随机推荐
微信小程序全局组件的定义
啃瓜记录又一天
js 数组去重的常用方法
js 中this指向
1.13 学习JS
正则笔记(1)- 正则表达式字符匹配攻略
TypeScript 错误 error TS2469、error TS2731 解决办法
debian 10 nat and routing forwarding
Scientific research reagent DMPE-PEG-Mal dimyristoylphosphatidylethanolamine-polyethylene glycol-maleimide
js basics
客户评分控件
Phospholipid-polyethylene glycol-thiol, DSPE-PEG-Thiol, DSPE-PEG-SH, MW: 5000
每日五道面试题 2022/7/27
简单黑马头条项目
配置mmdet来训练Swin-Transformer之一配置环境
npm--package.json---require
page load process
---static page---
js scope and closure
js eventLoop 事件循环机制