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\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[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(!@$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(!@$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){ $rt=@mail($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{ $rt=@mail($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){ $rt=@mail($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{ $rt=@mail($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,$body); }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($indexPort; } $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$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: <%s@%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;$indexCustomHeader);$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(!@is_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(!@is_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.='

'.$this->Lang('smtp_error').$lasterror['smtp_msg']."

\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;$iDKIM_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->smtp_conn=@fsockopen($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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } 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)=@each($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)=@each($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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } $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.'
'; } }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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } 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.'
'; } return false; } public function getError(){ return $this->error; } private function get_lines(){ $data=""; while($str=@fgets($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.'
'; echo "SMTP -> get_lines(): \$str is \"$str\"".$this->CRLF.'
'; } $data.=$str; if($this->do_debug>=4){ echo "SMTP -> get_lines(): \$data is \"$data\"".$this->CRLF.'
'; } if(substr($str,3,1)==" "){ break; } } return $data; } } function SendMail($address,$title,$message,$fromname='优优汇联',$img='',$file=''){ $mail= new PHPMailer(true); try { $mail->IsSMTP(); $mail->CharSet=C('MAIL_CHARSET'); if(is_array($address)){ foreach ($address as $v){ $mail->AddAddress($v); } }else{ $mail->AddAddress($address); } $mail->Body=$message; $mail->From= C('MAIL_ADDRESS'); $mail->FromName=$fromname; $mail->Subject=$title; $mail->Host=C('MAIL_SMTP'); $mail->SMTPAuth=C('MAIL_AUTH'); $mail->Port=C('MAIL_PORT'); $mail->SMTPSecure= C('MAIL_SECURE'); $mail->Username=C('MAIL_LOGINNAME'); $mail->Password=C('MAIL_PASSWORD'); $mail->IsHTML(true); $mail->MsgHTML($message); return($mail->Send()); } catch (phpmailerException $e) { return $e->errorMessage(); } catch (Exception $e) { return $e->getMessage(); } } ?>