Skip to content

Instantly share code, notes, and snippets.

@wilon
Created November 28, 2017 09:40
Show Gist options
  • Save wilon/90b453785e54048f6cf75f5d0a475eb1 to your computer and use it in GitHub Desktop.
Save wilon/90b453785e54048f6cf75f5d0a475eb1 to your computer and use it in GitHub Desktop.
<?php
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
date_default_timezone_set('PRC');
define('APP_PATH', dirname(__FILE__));
class CONFIG
{
const EMAIL = [
'host' => 'xxx.com',
'port' => '25',
'username' => 'xxx',
'password' => 'xxx',
'to' => '[email protected]',
];
const CHECK_URL = [
'https://api.github.com/users/wilon',
'https://api.github.com/users/wilon/repos',
];
}
$error = [];
foreach (CONFIG::CHECK_URL as $url) {
@list($header, $body) = simpleCurl($url, ['return' => 'all']);
$startLine = trim(explode("\n", $header)[0]);
if (strpos($startLine, '200') === false) {
echo "Error: $startLine\r\n";
$error[] = $url . ': error, ' . $header;
}
}
if (! empty($error)) {
echo "Send Email.\r\n";
$sendRes = sendMail(
'Some Service Down!!!!',
implode('<br><br>', $error)
);
var_dump($sendRes);
}
die;
function sendMail($subject,$content,$fileArr,$from){$mailConfig=CONFIG::EMAIL;$email=$mailConfig['to'];$mail=new PHPMailer();$mail->CharSet='UTF-8';$mail->IsSMTP();$mail->SMTPAuth=true;$mail->SMTPAutoTLS=false;$mail->SMTPDebug=2;$mail->Debugoutput=function ($str,$level){$logFile=path(APP_PATH,'email_smtp.log');@file_put_contents($logFile,date('Y-m-d H:i:s')."\t$level \t$str \n",FILE_APPEND|LOCK_EX);};$mail->Host=$mailConfig['host'];$mail->Port=$mailConfig['port'];$mail->Username=$mailConfig['username'];$mail->Password=$mailConfig['password'];$mail->SetFrom($mailConfig['username'],$from?:'WILON_SERVICE_CHECK');$mail->Subject=$subject;$mail->MsgHTML($content);$mail->AddAddress($email,$email);foreach($fileArr as $file){$mail->addAttachment($file);}return$res=$mail->Send();}function path(){$args=func_get_args();if(empty($args))return __DIR__;$path=[];$num=count($args);foreach($args as $k=>$arg){$arg=(string)$arg;if(!$arg)continue;$arg=($k==0)?$arg:ltrim($arg,'/');$arg=($k==$num-1)?$arg:rtrim($arg,'/');$path[]=$arg;}return implode('/',$path);}function simpleCurl(string$url,array$param=[]){if(!$url)return false;$parseUrl=parse_url($url);if(!isset($param['method']))$param['method']='get';$param['method']=strtoupper($param['method']);if(!isset($param['data']))$param['data']=[];if(!isset($param['header']))$param['header']=[];if(!isset($param['cookie']))$param['cookie']=[];if(!isset($param['return']))$param['return']='body';if(!isset($param['cookie_dir']))$param['cookie_dir']='';$dir=trim($param['cookie_dir']);$keepCookie=false;if(!empty($dir)&&is_dir($dir)&&is_writable($dir)){$sessionKey=md5($parseUrl['host'].'simple-curl');$cookieFunc=function ($action='get',$cookieData=[])use($sessionKey,$dir){if($action=='set'){return @file_put_contents("$dir /$sessionKey ",json_encode($cookieData));}else{return json_decode(@file_get_contents("$dir /$sessionKey "),true);}};$keepCookie=true;}$ch=curl_init();if($param['method']=='get'&&$param['data']){$joint=$parseUrl['query']?'&':'?';$url.=$joint.http_build_query($param['data']);}curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_TIMEOUT,30);if($parseUrl['scheme']=='https'){curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);}$header=[];if(strpos(json_encode($param['header']),'User-Agent')===false){$header[]='User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36';}if(is_string($param['header'])){foreach(explode("\n",$param['header']) as $v){$header[]=trim($v);}}elseif(is_array($param['header'])){$header=array_merge($header,$param['header']);}curl_setopt($ch,CURLOPT_HTTPHEADER,$header);$curloptCookie='';if($keepCookie==true){$cookieData=$cookieFunc('get');}else{$cookieData=array();}if(is_string($param['cookie'])){$curloptCookie.=$param['cookie'];}elseif(is_array($param['cookie'])&&is_array($cookieData)){$cookieData=array_merge($cookieData,$param['cookie']);}if($cookieData){foreach($cookieData as $k=>$v){$curloptCookie.="$k =$v ;";}}curl_setopt($ch,CURLOPT_COOKIE,$curloptCookie);curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);switch($param['method']){case "GET":curl_setopt($ch,CURLOPT_HTTPGET,true);break;case "POST":curl_setopt($ch,CURLOPT_POST,true);curl_setopt($ch,CURLOPT_POSTFIELDS,$param['data']);break;case "PUT":curl_setopt($ch,CURLOPT_CUSTOMREQUEST,"PUT");curl_setopt($ch,CURLOPT_POSTFIELDS,$param['data']);break;case "PATCH":curl_setopt($ch,CULROPT_CUSTOMREQUEST,'PATCH');curl_setopt($ch,CURLOPT_POSTFIELDS,$param['data']);break;case "DELETE":curl_setopt($ch,CURLOPT_CUSTOMREQUEST,"DELETE");curl_setopt($ch,CURLOPT_POSTFIELDS,$param['data']);break;}curl_setopt($ch,CURLOPT_HEADER,true);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);$response=curl_exec($ch);$headerSize=curl_getinfo($ch,CURLINFO_HEADER_SIZE);$header=trim(substr($response,0,$headerSize));$body=trim(substr($response,$headerSize));curl_close($ch);preg_match_all('/Set-Cookie:(.*?)\n/',$header,$matchesCookie);if(is_array($matchesCookie[1])){foreach($matchesCookie[1] as $setCookie){foreach(explode(';',$setCookie) as $cookieStr){@list($key,$value)=explode('=',trim($cookieStr));$cookieData[$key]=$value;}}}if($keepCookie==true)$cookieFunc('set',$cookieData);$return=$param['return']=='header'?$header:($param['return']=='all'?[$header,$body]:$body);return$return;}
class PHPMailer{public$Version='5.2.26';public$Priority=null;public$CharSet='iso-8859-1';public$ContentType='text/plain';public$Encoding='8bit';public$ErrorInfo='';public$From='root@localhost';public $FromName='Root User';public$Sender='';public$ReturnPath='';public$Subject='';public$Body='';public$AltBody='';public$Ical='';protected$MIMEBody='';protected$MIMEHeader='';protected$mailHeader='';public$WordWrap=0;public$Mailer='mail';public$Sendmail='/usr/sbin/sendmail';public$UseSendmailOptions=true;public$PluginDir='';public$ConfirmReadingTo='';public$Hostname='';public$MessageID='';public$MessageDate='';public$Host='localhost';public$Port=25;public$Helo='';public$SMTPSecure='';public$SMTPAutoTLS=true;public$SMTPAuth=false;public$SMTPOptions=array();public$Username='';public$Password='';public$AuthType='';public$Realm='';public$Workstation='';public$Timeout=300;public$SMTPDebug=0;public$Debugoutput='echo';public$SMTPKeepAlive=false;public$SingleTo=false;public$SingleToArray=array();public$do_verp=false;public$AllowEmpty=false;public$LE="\n";public$DKIM_selector='';public$DKIM_identity='';public$DKIM_passphrase='';public$DKIM_domain='';public$DKIM_private='';public$DKIM_private_string='';public$action_function='';public$XMailer='';public static$validator='auto';protected$smtp=null;protected$to=array();protected$cc=array();protected$bcc=array();protected$ReplyTo=array();protected$all_recipients=array();protected$RecipientsQueue=array();protected$ReplyToQueue=array();protected$attachment=array();protected$CustomHeader=array();protected$lastMessageID='';protected$message_type='';protected$boundary=array();protected$language=array();protected$error_count=0;protected$sign_cert_file='';protected$sign_key_file='';protected$sign_extracerts_file='';protected$sign_key_pass='';protected$exceptions=false;protected$uniqueid='';const STOP_MESSAGE=0;const STOP_CONTINUE=1;const STOP_CRITICAL=2;const CRLF="\r\n";const MAX_LINE_LENGTH=998;public function __construct($exceptions=null){if($exceptions!==null){$this->exceptions=(boolean)$exceptions;}$this->Debugoutput=(strpos(PHP_SAPI,'cli')!==false?'echo':'html');}public function __destruct(){$this->smtpClose();}private function mailPassthru($to,$subject,$body,$header,$params){if(ini_get('mbstring.func_overload')&1){$subject=$this->secureHeader($subject);}else{$subject=$this->encodeHeader($this->secureHeader($subject));}if(ini_get('safe_mode')||!$this->UseSendmailOptions||is_null($params)){$result=@mail($to,$subject,$body,$header);}else{$result=@mail($to,$subject,$body,$header,$params);}return$result;}protected function edebug($str){if($this->SMTPDebug<=0){return ;}if(!in_array($this->Debugoutput,array('error_log','html','echo'))&&is_callable($this->Debugoutput)){call_user_func($this->Debugoutput,$str,$this->SMTPDebug);return ;}switch($this->Debugoutput){case 'error_log':error_log($str);break;case 'html':echo htmlentities(preg_replace('/[\r\n]+/','',$str),ENT_QUOTES,'UTF-8')."<br>\n";break;case 'echo':default:$str=preg_replace('/\r\n?/ms',"\n",$str);echo gmdate('Y-m-d H:i:s')."\t".str_replace("\n","\n \t ",trim($str))."\n";}}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(){$ini_sendmail_path=ini_get('sendmail_path');if(!stristr($ini_sendmail_path,'sendmail')){$this->Sendmail='/usr/sbin/sendmail';}else{$this->Sendmail=$ini_sendmail_path;}$this->Mailer='sendmail';}public function isQmail(){$ini_sendmail_path=ini_get('sendmail_path');if(!stristr($ini_sendmail_path,'qmail')){$this->Sendmail='/var/qmail/bin/qmail-inject';}else{$this->Sendmail=$ini_sendmail_path;}$this->Mailer='qmail';}public function addAddress($address,$name=''){return$this->addOrEnqueueAnAddress('to',$address,$name);}public function addCC($address,$name=''){return$this->addOrEnqueueAnAddress('cc',$address,$name);}public function addBCC($address,$name=''){return$this->addOrEnqueueAnAddress('bcc',$address,$name);}public function addReplyTo($address,$name=''){return$this->addOrEnqueueAnAddress('Reply-To',$address,$name);}protected function addOrEnqueueAnAddress($kind,$address,$name){$address=trim($address);$name=trim(preg_replace('/[\r\n]+/','',$name));if(($pos=strrpos($address,'@'))===false){$error_message=$this->lang('invalid_address')."(addAnAddress$kind ):$address";$this->setError($error_message);$this->edebug($error_message);if($this->exceptions){throw new phpmailerException($error_message);}return false;}$params=array($kind,$address,$name);if($this->has8bitChars(substr($address,++$pos))&&$this->idnSupported()){if($kind!='Reply-To'){if(!array_key_exists($address,$this->RecipientsQueue)){$this->RecipientsQueue[$address]=$params;return true;}}else{if(!array_key_exists($address,$this->ReplyToQueue)){$this->ReplyToQueue[$address]=$params;return true;}}return false;}return call_user_func_array(array($this,'addAnAddress'),$params);}protected function addAnAddress($kind,$address,$name=''){if(!in_array($kind,array('to','cc','bcc','Reply-To'))){$error_message=$this->lang('Invalid recipient kind: ').$kind;$this->setError($error_message);$this->edebug($error_message);if($this->exceptions){throw new phpmailerException($error_message);}return false;}if(!$this->validateAddress($address)){$error_message=$this->lang('invalid_address')."(addAnAddress$kind ):$address";$this->setError($error_message);$this->edebug($error_message);if($this->exceptions){throw new phpmailerException($error_message);}return false;}if($kind!='Reply-To'){if(!array_key_exists(strtolower($address),$this->all_recipients)){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 parseAddresses($addrstr,$useimap=true){$addresses=array();if($useimap&&function_exists('imap_rfc822_parse_adrlist')){$list=imap_rfc822_parse_adrlist($addrstr,'');foreach($list as $address){if($address->host!='.SYNTAX-ERROR.'){if($this->validateAddress($address->mailbox.'@'.$address->host)){$addresses[]=array('name'=>(property_exists($address,'personal')?$address->personal:''),'address'=>$address->mailbox.'@'.$address->host);}}}}else{$list=explode(',',$addrstr);foreach($list as $address){$address=trim($address);if(strpos($address,'<')===false){if($this->validateAddress($address)){$addresses[]=array('name'=>'','address'=>$address);}}else{list($name,$email)=explode('<',$address);$email=trim(str_replace('>','',$email));if($this->validateAddress($email)){$addresses[]=array('name'=>trim(str_replace(array('"',"'"),'',$name)),'address'=>$email);}}}}return$addresses;}public function setFrom($address,$name='',$auto=true){$address=trim($address);$name=trim(preg_replace('/[\r\n]+/','',$name));if(($pos=strrpos($address,'@'))===false||(!$this->has8bitChars(substr($address,++$pos))||!$this->idnSupported())&&!$this->validateAddress($address)){$error_message=$this->lang('invalid_address')."(setFrom)$address";$this->setError($error_message);$this->edebug($error_message);if($this->exceptions){throw new phpmailerException($error_message);}return false;}$this->From=$address;$this->FromName=$name;if($auto){if(empty($this->Sender)){$this->Sender=$address;}}return true;}public function getLastMessageID(){return$this->lastMessageID;}public static function validateAddress($address,$patternselect=null){if(is_null($patternselect)){$patternselect=self::$validator;}if(is_callable($patternselect)){return call_user_func($patternselect,$address);}if(strpos($address,"\n")!==false||strpos($address,"\r")!==false){return false;}if(!$patternselect||$patternselect=='auto'){if(defined('PCRE_VERSION')){if(version_compare(PCRE_VERSION,'8.0.3')>=0){$patternselect='pcre8';}else{$patternselect='pcre';}}elseif(function_exists('extension_loaded')&&extension_loaded('pcre')){$patternselect='pcre';}else{if(version_compare(PHP_VERSION,'5.2.0')>=0){$patternselect='php';}else{$patternselect='noregex';}}}switch($patternselect){case 'pcre8':return (boolean)preg_match('/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)'.'((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)'.'(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)'.'([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*'.'(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)'.'(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}'.'|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:'.'|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}'.'|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',$address);case 'pcre':return (boolean)preg_match('/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>'.'[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")'.'(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*'.'@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})'.'(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:'.'[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?'.'::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:'.'[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?'.'::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}'.'|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',$address);case 'html5':return (boolean)preg_match('/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[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])?)*$/sD',$address);case 'noregex':return (strlen($address)>=3&&strpos($address,'@')>=1&&strpos($address,'@')!=strlen($address)-1);case 'php':default:return (boolean)filter_var($address,FILTER_VALIDATE_EMAIL);}}public function idnSupported(){return function_exists('idn_to_ascii')&&function_exists('mb_convert_encoding');}public function punyencodeAddress($address){if($this->idnSupported()&&!empty($this->CharSet)&&($pos=strrpos($address,'@'))!==false){$domain=substr($address,++$pos);if($this->has8bitChars($domain)&&@mb_check_encoding($domain,$this->CharSet)){$domain=mb_convert_encoding($domain,'UTF-8',$this->CharSet);if(($punycode=defined('INTL_IDNA_VARIANT_UTS46')?idn_to_ascii($domain,0,INTL_IDNA_VARIANT_UTS46):idn_to_ascii($domain))!==false){return substr($address,0,$pos).$punycode;}}}return$address;}public function send(){try{if(!$this->preSend()){return false;}return$this->postSend();}catch(phpmailerException$exc){$this->mailHeader='';$this->setError($exc->getMessage());if($this->exceptions){throw $exc;}return false;}}public function preSend(){try{$this->error_count=0;$this->mailHeader='';foreach(array_merge($this->RecipientsQueue,$this->ReplyToQueue) as $params){$params[1]=$this->punyencodeAddress($params[1]);call_user_func_array(array($this,'addAnAddress'),$params);}if((count($this->to)+count($this->cc)+count($this->bcc))<1){throw new phpmailerException($this->lang('provide_address'),self::STOP_CRITICAL);}foreach(array('From','Sender','ConfirmReadingTo') as $address_kind){$this->$address_kind=trim($this->$address_kind);if(empty($this->$address_kind)){continue;}$this->$address_kind=$this->punyencodeAddress($this->$address_kind);if(!$this->validateAddress($this->$address_kind)){$error_message=$this->lang('invalid_address').' (punyEncode) '.$this->$address_kind;$this->setError($error_message);$this->edebug($error_message);if($this->exceptions){throw new phpmailerException($error_message);}return false;}}if($this->alternativeExists()){$this->ContentType='multipart/alternative';}$this->setMessageType();if(!$this->AllowEmpty&&empty($this->Body)){throw new phpmailerException($this->lang('empty_message'),self::STOP_CRITICAL);}$this->MIMEHeader='';$this->MIMEBody=$this->createBody();$tempheaders=$this->MIMEHeader;$this->MIMEHeader=$this->createHeader();$this->MIMEHeader.=$tempheaders;if($this->Mailer=='mail'){if(count($this->to)>0){$this->mailHeader.=$this->addrAppend('To',$this->to);}else{$this->mailHeader.=$this->headerLine('To','undisclosed-recipients:;');}$this->mailHeader.=$this->headerLine('Subject',$this->encodeHeader($this->secureHeader(trim($this->Subject))));}if(!empty($this->DKIM_domain)&&!empty($this->DKIM_selector)&&(!empty($this->DKIM_private_string)||(!empty($this->DKIM_private)&&file_exists($this->DKIM_private)))){$header_dkim=$this->DKIM_Add($this->MIMEHeader.$this->mailHeader,$this->encodeHeader($this->secureHeader($this->Subject)),$this->MIMEBody);$this->MIMEHeader=rtrim($this->MIMEHeader,"\r\n ").self::CRLF.str_replace("\r\n","\n",$header_dkim).self::CRLF;}return true;}catch(phpmailerException$exc){$this->setError($exc->getMessage());if($this->exceptions){throw $exc;}return false;}}public function postSend(){try{switch($this->Mailer){case 'sendmail':case 'qmail':return$this->sendmailSend($this->MIMEHeader,$this->MIMEBody);case 'smtp':return$this->smtpSend($this->MIMEHeader,$this->MIMEBody);case 'mail':return$this->mailSend($this->MIMEHeader,$this->MIMEBody);default:$sendMethod=$this->Mailer.'Send';if(method_exists($this,$sendMethod)){return$this->$sendMethod($this->MIMEHeader,$this->MIMEBody);}return$this->mailSend($this->MIMEHeader,$this->MIMEBody);}}catch(phpmailerException$exc){$this->setError($exc->getMessage());$this->edebug($exc->getMessage());if($this->exceptions){throw $exc;}}return false;}protected function sendmailSend($header,$body){if(!empty($this->Sender)&&self::isShellSafe($this->Sender)){if($this->Mailer=='qmail'){$sendmailFmt='%s -f%s';}else{$sendmailFmt='%s -oi -f%s -t';}}else{if($this->Mailer=='qmail'){$sendmailFmt='%s';}else{$sendmailFmt='%s -oi -t';}}$sendmail=sprintf($sendmailFmt,escapeshellcmd($this->Sendmail),$this->Sender);if($this->SingleTo){foreach($this->SingleToArray as $toAddr){if(!@$mail=popen($sendmail,'w')){throw new phpmailerException($this->lang('execute').$this->Sendmail,self::STOP_CRITICAL);}fputs($mail,'To: '.$toAddr."\n");fputs($mail,$header);fputs($mail,$body);$result=pclose($mail);$this->doCallback(($result==0),array($toAddr),$this->cc,$this->bcc,$this->Subject,$body,$this->From);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);$this->doCallback(($result==0),$this->to,$this->cc,$this->bcc,$this->Subject,$body,$this->From);if($result!=0){throw new phpmailerException($this->lang('execute').$this->Sendmail,self::STOP_CRITICAL);}}return true;}protected static function isShellSafe($string){if(escapeshellcmd($string)!==$string||!in_array(escapeshellarg($string),array("'$string '","\"$string \""))){return false;}$length=strlen($string);for($i=0;$i<$length;$i++){$c=$string[$i];if(!ctype_alnum($c)&&strpos('@_-.',$c)===false){return false;}}return true;}protected function mailSend($header,$body){$toArr=array();foreach($this->to as $toaddr){$toArr[]=$this->addrFormat($toaddr);}$to=implode(', ',$toArr);$params=null;if(!empty($this->Sender)&&$this->validateAddress($this->Sender)){if(self::isShellSafe($this->Sender)){$params=sprintf('-f%s',$this->Sender);}}if(!empty($this->Sender)&&!ini_get('safe_mode')&&$this->validateAddress($this->Sender)){$old_from=ini_get('sendmail_from');ini_set('sendmail_from',$this->Sender);}$result=false;if($this->SingleTo&&count($toArr)>1){foreach($toArr as $toAddr){$result=$this->mailPassthru($toAddr,$this->Subject,$body,$header,$params);$this->doCallback($result,array($toAddr),$this->cc,$this->bcc,$this->Subject,$body,$this->From);}}else{$result=$this->mailPassthru($to,$this->Subject,$body,$header,$params);$this->doCallback($result,$this->to,$this->cc,$this->bcc,$this->Subject,$body,$this->From);}if(isset($old_from)){ini_set('sendmail_from',$old_from);}if(!$result){throw new phpmailerException($this->lang('instantiate'),self::STOP_CRITICAL);}return true;}public function getSMTPInstance(){if(!is_object($this->smtp)){$this->smtp=new SMTP;}return$this->smtp;}protected function smtpSend($header,$body){$bad_rcpt=array();if(!$this->smtpConnect($this->SMTPOptions)){throw new phpmailerException($this->lang('smtp_connect_failed'),self::STOP_CRITICAL);}if(!empty($this->Sender)&&$this->validateAddress($this->Sender)){$smtp_from=$this->Sender;}else{$smtp_from=$this->From;}if(!$this->smtp->mail($smtp_from)){$this->setError($this->lang('from_failed').$smtp_from.' : '.implode(',',$this->smtp->getError()));throw new phpmailerException($this->ErrorInfo,self::STOP_CRITICAL);}foreach(array($this->to,$this->cc,$this->bcc) as $togroup){foreach($togroup as $to){if(!$this->smtp->recipient($to[0])){$error=$this->smtp->getError();$bad_rcpt[]=array('to'=>$to[0],'error'=>$error['detail']);$isSent=false;}else{$isSent=true;}$this->doCallback($isSent,array($to[0]),array(),array(),$this->Subject,$body,$this->From);}}if((count($this->all_recipients)>count($bad_rcpt))&&!$this->smtp->data($header.$body)){throw new phpmailerException($this->lang('data_not_accepted'),self::STOP_CRITICAL);}if($this->SMTPKeepAlive){$this->smtp->reset();}else{$this->smtp->quit();$this->smtp->close();}if(count($bad_rcpt)>0){$errstr='';foreach($bad_rcpt as $bad){$errstr.=$bad['to'].': '.$bad['error'];}throw new phpmailerException($this->lang('recipients_failed').$errstr,self::STOP_CONTINUE);}return true;}public function smtpConnect($options=null){if(is_null($this->smtp)){$this->smtp=$this->getSMTPInstance();}if(is_null($options)){$options=$this->SMTPOptions;}if($this->smtp->connected()){return true;}$this->smtp->setTimeout($this->Timeout);$this->smtp->setDebugLevel($this->SMTPDebug);$this->smtp->setDebugOutput($this->Debugoutput);$this->smtp->setVerp($this->do_verp);$hosts=explode(';',$this->Host);$lastexception=null;foreach($hosts as $hostentry){$hostinfo=array();if(!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',trim($hostentry),$hostinfo)){$this->edebug('Ignoring invalid host: '.$hostentry);continue;}$prefix='';$secure=$this->SMTPSecure;$tls=($this->SMTPSecure=='tls');if('ssl'==$hostinfo[2]||(''==$hostinfo[2]&&'ssl'==$this->SMTPSecure)){$prefix='ssl://';$tls=false;$secure='ssl';}elseif($hostinfo[2]=='tls'){$tls=true;$secure='tls';}$sslext=defined('OPENSSL_ALGO_SHA1');if('tls'===$secure||'ssl'===$secure){if(!$sslext){throw new phpmailerException($this->lang('extension_missing').'openssl',self::STOP_CRITICAL);}}$host=$hostinfo[3];$port=$this->Port;$tport=(integer)$hostinfo[4];if($tport>0&&$tport<65536){$port=$tport;}if($this->smtp->connect($prefix.$host,$port,$this->Timeout,$options)){try{if($this->Helo){$hello=$this->Helo;}else{$hello=$this->serverHostname();}$this->smtp->hello($hello);if($this->SMTPAutoTLS&&$sslext&&$secure!='ssl'&&$this->smtp->getServerExt('STARTTLS')){$tls=true;}if($tls){if(!$this->smtp->startTLS()){throw new phpmailerException($this->lang('connect_host'));}$this->smtp->hello($hello);}if($this->SMTPAuth){if(!$this->smtp->authenticate($this->Username,$this->Password,$this->AuthType,$this->Realm,$this->Workstation)){throw new phpmailerException($this->lang('authenticate'));}}return true;}catch(phpmailerException$exc){$lastexception=$exc;$this->edebug($exc->getMessage());$this->smtp->quit();}}}$this->smtp->close();if($this->exceptions&&!is_null($lastexception)){throw $lastexception;}return false;}public function smtpClose(){if(is_a($this->smtp,'SMTP')){if($this->smtp->connected()){$this->smtp->quit();$this->smtp->close();}}}public function setLanguage($langcode='en',$lang_path=''){$renamed_langcodes=array('br'=>'pt_br','cz'=>'cs','dk'=>'da','no'=>'nb','se'=>'sv','sr'=>'rs');if(isset($renamed_langcodes[$langcode])){$langcode=$renamed_langcodes[$langcode];}$PHPMAILER_LANG=array('authenticate'=>'SMTP Error: Could not authenticate.','connect_host'=>'SMTP Error: Could not connect to SMTP host.','data_not_accepted'=>'SMTP Error: data not accepted.','empty_message'=>'Message body empty','encoding'=>'Unknown encoding: ','execute'=>'Could not execute: ','file_access'=>'Could not access file: ','file_open'=>'File Error: Could not open file: ','from_failed'=>'The following From address failed: ','instantiate'=>'Could not instantiate mail function.','invalid_address'=>'Invalid address: ','mailer_not_supported'=>' mailer is not supported.','provide_address'=>'You must provide at least one recipient email address.','recipients_failed'=>'SMTP Error: The following recipients failed: ','signing'=>'Signing Error: ','smtp_connect_failed'=>'SMTP connect() failed.','smtp_error'=>'SMTP server error: ','variable_set'=>'Cannot set or reset variable: ','extension_missing'=>'Extension missing: ');if(empty($lang_path)){$lang_path=dirname(__FILE__).DIRECTORY_SEPARATOR.'language'.DIRECTORY_SEPARATOR;}if(!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/',$langcode)){$langcode='en';}$foundlang=true;$lang_file=$lang_path.'phpmailer.lang-'.$langcode.'.php';if($langcode!='en'){if(!is_readable($lang_file)){$foundlang=false;}else{$foundlang=include $lang_file;}}$this->language=$PHPMAILER_LANG;return (boolean)$foundlang;}public function getTranslations(){return$this->language;}public function addrAppend($type,$addr){$addresses=array();foreach($addr as $address){$addresses[]=$this->addrFormat($address);}return$type.': '.implode(', ',$addresses).$this->LE;}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){if($qp_mode){$soft_break=sprintf(' =%s',$this->LE);}else{$soft_break=$this->LE;}$is_utf8=(strtolower($this->CharSet)=='utf-8');$lelen=strlen($this->LE);$crlflen=strlen(self::CRLF);$message=$this->fixEOL($message);if(substr($message,-$lelen)==$this->LE){$message=substr($message,0,-$lelen);}$lines=explode($this->LE,$message);$message='';foreach($lines as $line){$words=explode(' ',$line);$buf='';$firstword=true;foreach($words as $word){if($qp_mode&&(strlen($word)>$length)){$space_left=$length-strlen($buf)-$crlflen;if(!$firstword){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',self::CRLF);}else{$message.=$buf.$soft_break;}$buf='';}while(strlen($word)>0){if($length<=0){break;}$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',self::CRLF);}else{$buf=$part;}}}else{$buf_o=$buf;if(!$firstword){$buf.=' ';}$buf.=$word;if(strlen($buf)>$length&&$buf_o!=''){$message.=$buf_o.$soft_break;$buf=$word;}}$firstword=false;}$message.=$buf.self::CRLF;}return$message;}public function utf8CharBoundary($encodedText,$maxLength){$foundSplitPos=false;$lookBack=3;while(!$foundSplitPos){$lastChunk=substr($encodedText,$maxLength-$lookBack,$lookBack);$encodedCharPos=strpos($lastChunk,'=');if(false!==$encodedCharPos){$hex=substr($encodedText,$maxLength-$lookBack+$encodedCharPos+1,2);$dec=hexdec($hex);if($dec<128){if($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_inline':case 'alt_attach':case 'alt_inline_attach':$this->AltBody=$this->wrapText($this->AltBody,$this->WordWrap);break;default:$this->Body=$this->wrapText($this->Body,$this->WordWrap);break;}}public function createHeader(){$result='';$result.=$this->headerLine('Date',$this->MessageDate==''?self::rfcDate():$this->MessageDate);if($this->SingleTo){if($this->Mailer!='mail'){foreach($this->to as $toaddr){$this->SingleToArray[]=$this->addrFormat($toaddr);}}}else{if(count($this->to)>0){if($this->Mailer!='mail'){$result.=$this->addrAppend('To',$this->to);}}elseif(count($this->cc)==0){$result.=$this->headerLine('To','undisclosed-recipients:;');}}$result.=$this->addrAppend('From',array(array(trim($this->From),$this->FromName)));if(count($this->cc)>0){$result.=$this->addrAppend('Cc',$this->cc);}if(($this->Mailer=='sendmail'||$this->Mailer=='qmail'||$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&&preg_match('/^<.*@.*>$/',$this->MessageID)){$this->lastMessageID=$this->MessageID;}else{$this->lastMessageID=sprintf('<%s@%s>',$this->uniqueid,$this->serverHostname());}$result.=$this->headerLine('Message-ID',$this->lastMessageID);if(!is_null($this->Priority)){$result.=$this->headerLine('X-Priority',$this->Priority);}if($this->XMailer==''){$result.=$this->headerLine('X-Mailer','PHPMailer '.$this->Version.' (https://github.com/PHPMailer/PHPMailer)');}else{$myXmailer=trim($this->XMailer);if($myXmailer){$result.=$this->headerLine('X-Mailer',$myXmailer);}}if($this->ConfirmReadingTo!=''){$result.=$this->headerLine('Disposition-Notification-To','<'.$this->ConfirmReadingTo.'>');}foreach($this->CustomHeader as $header){$result.=$this->headerLine(trim($header[0]),$this->encodeHeader(trim($header[1])));}if(!$this->sign_key_file){$result.=$this->headerLine('MIME-Version','1.0');$result.=$this->getMailMIME();}return$result;}public function getMailMIME(){$result='';$ismultipart=true;switch($this->message_type){case 'inline':$result.=$this->headerLine('Content-Type','multipart/related;');$result.=$this->textLine("\tboundary=\"".$this->boundary[1].'"');break;case 'attach':case 'inline_attach':case 'alt_attach':case 'alt_inline_attach':$result.=$this->headerLine('Content-Type','multipart/mixed;');$result.=$this->textLine("\tboundary=\"".$this->boundary[1].'"');break;case 'alt':case 'alt_inline':$result.=$this->headerLine('Content-Type','multipart/alternative;');$result.=$this->textLine("\tboundary=\"".$this->boundary[1].'"');break;default:$result.=$this->textLine('Content-Type: '.$this->ContentType.'; charset='.$this->CharSet);$ismultipart=false;break;}if($this->Encoding!='7bit'){if($ismultipart){if($this->Encoding=='8bit'){$result.=$this->headerLine('Content-Transfer-Encoding','8bit');}}else{$result.=$this->headerLine('Content-Transfer-Encoding',$this->Encoding);}}if($this->Mailer!='mail'){$result.=$this->LE;}return$result;}public function getSentMIMEMessage(){return rtrim($this->MIMEHeader.$this->mailHeader,"\n\r").self::CRLF.self::CRLF.$this->MIMEBody;}protected function generateId(){return md5(uniqid(time()));}public function createBody(){$body='';$this->uniqueid=$this->generateId();$this->boundary[1]='b1_'.$this->uniqueid;$this->boundary[2]='b2_'.$this->uniqueid;$this->boundary[3]='b3_'.$this->uniqueid;if($this->sign_key_file){$body.=$this->getMailMIME().$this->LE;}$this->setWordWrap();$bodyEncoding=$this->Encoding;$bodyCharSet=$this->CharSet;if($bodyEncoding=='8bit'&&!$this->has8bitChars($this->Body)){$bodyEncoding='7bit';$bodyCharSet='us-ascii';}if('base64'!=$this->Encoding&&self::hasLineLongerThanMax($this->Body)){$bodyEncoding='quoted-printable';}$altBodyEncoding=$this->Encoding;$altBodyCharSet=$this->CharSet;if($altBodyEncoding=='8bit'&&!$this->has8bitChars($this->AltBody)){$altBodyEncoding='7bit';$altBodyCharSet='us-ascii';}if('base64'!=$altBodyEncoding&&self::hasLineLongerThanMax($this->AltBody)){$altBodyEncoding='quoted-printable';}$mimepre="This is a multi-part message in MIME format.".$this->LE.$this->LE;switch($this->message_type){case 'inline':$body.=$mimepre;$body.=$this->getBoundary($this->boundary[1],$bodyCharSet,'',$bodyEncoding);$body.=$this->encodeString($this->Body,$bodyEncoding);$body.=$this->LE.$this->LE;$body.=$this->attachAll('inline',$this->boundary[1]);break;case 'attach':$body.=$mimepre;$body.=$this->getBoundary($this->boundary[1],$bodyCharSet,'',$bodyEncoding);$body.=$this->encodeString($this->Body,$bodyEncoding);$body.=$this->LE.$this->LE;$body.=$this->attachAll('attachment',$this->boundary[1]);break;case 'inline_attach':$body.=$mimepre;$body.=$this->textLine('--'.$this->boundary[1]);$body.=$this->headerLine('Content-Type','multipart/related;');$body.=$this->textLine("\tboundary=\"".$this->boundary[2].'"');$body.=$this->LE;$body.=$this->getBoundary($this->boundary[2],$bodyCharSet,'',$bodyEncoding);$body.=$this->encodeString($this->Body,$bodyEncoding);$body.=$this->LE.$this->LE;$body.=$this->attachAll('inline',$this->boundary[2]);$body.=$this->LE;$body.=$this->attachAll('attachment',$this->boundary[1]);break;case 'alt':$body.=$mimepre;$body.=$this->getBoundary($this->boundary[1],$altBodyCharSet,'text/plain',$altBodyEncoding);$body.=$this->encodeString($this->AltBody,$altBodyEncoding);$body.=$this->LE.$this->LE;$body.=$this->getBoundary($this->boundary[1],$bodyCharSet,'text/html',$bodyEncoding);$body.=$this->encodeString($this->Body,$bodyEncoding);$body.=$this->LE.$this->LE;if(!empty($this->Ical)){$body.=$this->getBoundary($this->boundary[1],'','text/calendar; method=REQUEST','');$body.=$this->encodeString($this->Ical,$this->Encoding);$body.=$this->LE.$this->LE;}$body.=$this->endBoundary($this->boundary[1]);break;case 'alt_inline':$body.=$mimepre;$body.=$this->getBoundary($this->boundary[1],$altBodyCharSet,'text/plain',$altBodyEncoding);$body.=$this->encodeString($this->AltBody,$altBodyEncoding);$body.=$this->LE.$this->LE;$body.=$this->textLine('--'.$this->boundary[1]);$body.=$this->headerLine('Content-Type','multipart/related;');$body.=$this->textLine("\tboundary=\"".$this->boundary[2].'"');$body.=$this->LE;$body.=$this->getBoundary($this->boundary[2],$bodyCharSet,'text/html',$bodyEncoding);$body.=$this->encodeString($this->Body,$bodyEncoding);$body.=$this->LE.$this->LE;$body.=$this->attachAll('inline',$this->boundary[2]);$body.=$this->LE;$body.=$this->endBoundary($this->boundary[1]);break;case 'alt_attach':$body.=$mimepre;$body.=$this->textLine('--'.$this->boundary[1]);$body.=$this->headerLine('Content-Type','multipart/alternative;');$body.=$this->textLine("\tboundary=\"".$this->boundary[2].'"');$body.=$this->LE;$body.=$this->getBoundary($this->boundary[2],$altBodyCharSet,'text/plain',$altBodyEncoding);$body.=$this->encodeString($this->AltBody,$altBodyEncoding);$body.=$this->LE.$this->LE;$body.=$this->getBoundary($this->boundary[2],$bodyCharSet,'text/html',$bodyEncoding);$body.=$this->encodeString($this->Body,$bodyEncoding);$body.=$this->LE.$this->LE;$body.=$this->endBoundary($this->boundary[2]);$body.=$this->LE;$body.=$this->attachAll('attachment',$this->boundary[1]);break;case 'alt_inline_attach':$body.=$mimepre;$body.=$this->textLine('--'.$this->boundary[1]);$body.=$this->headerLine('Content-Type','multipart/alternative;');$body.=$this->textLine("\tboundary=\"".$this->boundary[2].'"');$body.=$this->LE;$body.=$this->getBoundary($this->boundary[2],$altBodyCharSet,'text/plain',$altBodyEncoding);$body.=$this->encodeString($this->AltBody,$altBodyEncoding);$body.=$this->LE.$this->LE;$body.=$this->textLine('--'.$this->boundary[2]);$body.=$this->headerLine('Content-Type','multipart/related;');$body.=$this->textLine("\tboundary=\"".$this->boundary[3].'"');$body.=$this->LE;$body.=$this->getBoundary($this->boundary[3],$bodyCharSet,'text/html',$bodyEncoding);$body.=$this->encodeString($this->Body,$bodyEncoding);$body.=$this->LE.$this->LE;$body.=$this->attachAll('inline',$this->boundary[3]);$body.=$this->LE;$body.=$this->endBoundary($this->boundary[2]);$body.=$this->LE;$body.=$this->attachAll('attachment',$this->boundary[1]);break;default:$this->Encoding=$bodyEncoding;$body.=$this->encodeString($this->Body,$this->Encoding);break;}if($this->isError()){$body='';}elseif($this->sign_key_file){try{if(!defined('PKCS7_TEXT')){throw new phpmailerException($this->lang('extension_missing').'openssl');}$file=tempnam(sys_get_temp_dir(),'mail');if(false===file_put_contents($file,$body)){throw new phpmailerException($this->lang('signing').' Could not write temp file');}$signed=tempnam(sys_get_temp_dir(),'signed');if(empty($this->sign_extracerts_file)){$sign=@openssl_pkcs7_sign($file,$signed,'file://'.realpath($this->sign_cert_file),array('file://'.realpath($this->sign_key_file),$this->sign_key_pass),null);}else{$sign=@openssl_pkcs7_sign($file,$signed,'file://'.realpath($this->sign_cert_file),array('file://'.realpath($this->sign_key_file),$this->sign_key_pass),null,PKCS7_DETACHED,$this->sign_extracerts_file);}if($sign){@unlink($file);$body=file_get_contents($signed);@unlink($signed);$parts=explode("\n\n",$body,2);$this->MIMEHeader.=$parts[0].$this->LE.$this->LE;$body=$parts[1];}else{@unlink($file);@unlink($signed);throw new phpmailerException($this->lang('signing').openssl_error_string());}}catch(phpmailerException$exc){$body='';if($this->exceptions){throw $exc;}}}return$body;}protected 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;if($encoding!='7bit'){$result.=$this->headerLine('Content-Transfer-Encoding',$encoding);}$result.=$this->LE;return$result;}protected function endBoundary($boundary){return$this->LE.'--'.$boundary.'--'.$this->LE;}protected function setMessageType(){$type=array();if($this->alternativeExists()){$type[]='alt';}if($this->inlineImageExists()){$type[]='inline';}if($this->attachmentExists()){$type[]='attach';}$this->message_type=implode('_',$type);if($this->message_type==''){$this->message_type='plain';}}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='',$disposition='attachment'){try{if(!@is_file($path)){throw new phpmailerException($this->lang('file_access').$path,self::STOP_CONTINUE);}if($type==''){$type=self::filenameToType($path);}$filename=basename($path);if($name==''){$name=$filename;}$this->attachment[]=array(0=>$path,1=>$filename,2=>$name,3=>$encoding,4=>$type,5=>false,6=>$disposition,7=>0);}catch(phpmailerException$exc){$this->setError($exc->getMessage());$this->edebug($exc->getMessage());if($this->exceptions){throw $exc;}return false;}return true;}public function getAttachments(){return$this->attachment;}protected function attachAll($disposition_type,$boundary){$mime=array();$cidUniq=array();$incl=array();foreach($this->attachment as $attachment){if($attachment[6]==$disposition_type){$string='';$path='';$bString=$attachment[5];if($bString){$string=$attachment[0];}else{$path=$attachment[0];}$inclhash=md5(serialize($attachment));if(in_array($inclhash,$incl)){continue;}$incl[]=$inclhash;$name=$attachment[2];$encoding=$attachment[3];$type=$attachment[4];$disposition=$attachment[6];$cid=$attachment[7];if($disposition=='inline'&&array_key_exists($cid,$cidUniq)){continue;}$cidUniq[$cid]=true;$mime[]=sprintf('--%s%s',$boundary,$this->LE);if(!empty($name)){$mime[]=sprintf('Content-Type: %s; name="%s"%s',$type,$this->encodeHeader($this->secureHeader($name)),$this->LE);}else{$mime[]=sprintf('Content-Type: %s%s',$type,$this->LE);}if($encoding!='7bit'){$mime[]=sprintf('Content-Transfer-Encoding: %s%s',$encoding,$this->LE);}if($disposition=='inline'){$mime[]=sprintf('Content-ID: <%s>%s',$cid,$this->LE);}if(!(empty($disposition))){$encoded_name=$this->encodeHeader($this->secureHeader($name));if(preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/',$encoded_name)){$mime[]=sprintf('Content-Disposition: %s; filename="%s"%s',$disposition,$encoded_name,$this->LE.$this->LE);}else{if(!empty($encoded_name)){$mime[]=sprintf('Content-Disposition: %s; filename=%s%s',$disposition,$encoded_name,$this->LE.$this->LE);}else{$mime[]=sprintf('Content-Disposition: %s%s',$disposition,$this->LE.$this->LE);}}}else{$mime[]=$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',$boundary,$this->LE);return implode('',$mime);}protected function encodeFile($path,$encoding='base64'){try{if(!is_readable($path)){throw new phpmailerException($this->lang('file_open').$path,self::STOP_CONTINUE);}$magic_quotes=get_magic_quotes_runtime();if($magic_quotes){if(version_compare(PHP_VERSION,'5.3.0','<')){set_magic_quotes_runtime(false);}else{ini_set('magic_quotes_runtime',false);}}$file_buffer=file_get_contents($path);$file_buffer=$this->encodeString($file_buffer,$encoding);if($magic_quotes){if(version_compare(PHP_VERSION,'5.3.0','<')){set_magic_quotes_runtime($magic_quotes);}else{ini_set('magic_quotes_runtime',$magic_quotes);}}return$file_buffer;}catch(Exception$exc){$this->setError($exc->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'){$matchcount=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 \"");}}$matchcount=preg_match_all('/[^\040\041\043-\133\135-\176]/',$str,$matches);break;case 'comment':$matchcount=preg_match_all('/[()"]/',$str,$matches);case 'text':default:$matchcount+=preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/',$str,$matches);break;}if($matchcount==0){return($str);}$maxlen=75-7-strlen($this->CharSet);if($matchcount>strlen($str)/3){$encoding='B';if(function_exists('mb_strlen')&&$this->hasMultiBytes($str)){$encoded=$this->base64EncodeWrapMB($str,"\n");}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('='.self::CRLF,"\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 has8bitChars($text){return (boolean)preg_match('/[\x80-\xFF]/',$text);}public function base64EncodeWrapMB($str,$linebreak=null){$start='=?'.$this->CharSet.'?B?';$end='?=';$encoded='';if($linebreak===null){$linebreak=$this->LE;}$mb_length=mb_strlen($str,$this->CharSet);$length=75-strlen($start)-strlen($end);$ratio=$mb_length/strlen($str);$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.$linebreak;}$encoded=substr($encoded,0,-strlen($linebreak));return$encoded;}public function encodeQP($string,$line_max=76){if(function_exists('quoted_printable_encode')){return quoted_printable_encode($string);}$string=str_replace(array('%20','%0D%0A.','%0D%0A','%'),array(' ',"\r\n=2E","\r\n",'='),rawurlencode($string));return preg_replace('/[^\r\n]{'.($line_max-3).'}[^=\r\n]{2}/',"$0=\r\n",$string);}public function encodeQPphp($string,$line_max=76,$space_conv=false){return$this->encodeQP($string,$line_max);}public function encodeQ($str,$position='text'){$pattern='';$encoded=str_replace(array("\r","\n"),'',$str);switch(strtolower($position)){case 'phrase':$pattern='^A-Za-z0-9!*+\/ -';break;case 'comment':$pattern='\(\)"';case 'text':default:$pattern='\000-\011\013\014\016-\037\075\077\137\177-\377'.$pattern;break;}$matches=array();if(preg_match_all("/[{$pattern }]/",$encoded,$matches)){$eqkey=array_search('=',$matches[0]);if(false!==$eqkey){unset($matches[0][$eqkey]);array_unshift($matches[0],'=');}foreach(array_unique($matches[0]) as $char){$encoded=str_replace($char,'='.sprintf('%02X',ord($char)),$encoded);}}return str_replace(' ','_',$encoded);}public function addStringAttachment($string,$filename,$encoding='base64',$type='',$disposition='attachment'){if($type==''){$type=self::filenameToType($filename);}$this->attachment[]=array(0=>$string,1=>$filename,2=>basename($filename),3=>$encoding,4=>$type,5=>true,6=>$disposition,7=>0);}public function addEmbeddedImage($path,$cid,$name='',$encoding='base64',$type='',$disposition='inline'){if(!@is_file($path)){$this->setError($this->lang('file_access').$path);return false;}if($type==''){$type=self::filenameToType($path);}$filename=basename($path);if($name==''){$name=$filename;}$this->attachment[]=array(0=>$path,1=>$filename,2=>$name,3=>$encoding,4=>$type,5=>false,6=>$disposition,7=>$cid);return true;}public function addStringEmbeddedImage($string,$cid,$name='',$encoding='base64',$type='',$disposition='inline'){if($type==''&&!empty($name)){$type=self::filenameToType($name);}$this->attachment[]=array(0=>$string,1=>$name,2=>$name,3=>$encoding,4=>$type,5=>true,6=>$disposition,7=>$cid);return true;}public function inlineImageExists(){foreach($this->attachment as $attachment){if($attachment[6]=='inline'){return true;}}return false;}public function attachmentExists(){foreach($this->attachment as $attachment){if($attachment[6]=='attachment'){return true;}}return false;}public function alternativeExists(){return !empty($this->AltBody);}public function clearQueuedAddresses($kind){$RecipientsQueue=$this->RecipientsQueue;foreach($RecipientsQueue as $address=>$params){if($params[0]==$kind){unset($this->RecipientsQueue[$address]);}}}public function clearAddresses(){foreach($this->to as $to){unset($this->all_recipients[strtolower($to[0])]);}$this->to=array();$this->clearQueuedAddresses('to');}public function clearCCs(){foreach($this->cc as $cc){unset($this->all_recipients[strtolower($cc[0])]);}$this->cc=array();$this->clearQueuedAddresses('cc');}public function clearBCCs(){foreach($this->bcc as $bcc){unset($this->all_recipients[strtolower($bcc[0])]);}$this->bcc=array();$this->clearQueuedAddresses('bcc');}public function clearReplyTos(){$this->ReplyTo=array();$this->ReplyToQueue=array();}public function clearAllRecipients(){$this->to=array();$this->cc=array();$this->bcc=array();$this->all_recipients=array();$this->RecipientsQueue=array();}public function clearAttachments(){$this->attachment=array();}public function clearCustomHeaders(){$this->CustomHeader=array();}protected function setError($msg){$this->error_count++;if($this->Mailer=='smtp'&&!is_null($this->smtp)){$lasterror=$this->smtp->getError();if(!empty($lasterror['error'])){$msg.=$this->lang('smtp_error').$lasterror['error'];if(!empty($lasterror['detail'])){$msg.=' Detail: '.$lasterror['detail'];}if(!empty($lasterror['smtp_code'])){$msg.=' SMTP code: '.$lasterror['smtp_code'];}if(!empty($lasterror['smtp_code_ex'])){$msg.=' Additional SMTP info: '.$lasterror['smtp_code_ex'];}}}$this->ErrorInfo=$msg;}public static function rfcDate(){date_default_timezone_set(@date_default_timezone_get());return date('D, j M Y H:i:s O');}protected function serverHostname(){$result='localhost.localdomain';if(!empty($this->Hostname)){$result=$this->Hostname;}elseif(isset($_SERVER)&&array_key_exists('SERVER_NAME',$_SERVER)&&!empty($_SERVER['SERVER_NAME'])){$result=$_SERVER['SERVER_NAME'];}elseif(function_exists('gethostname')&&gethostname()!==false){$result=gethostname();}elseif(php_uname('n')!==false){$result=php_uname('n');}return$result;}protected function lang($key){if(count($this->language)<1){$this->setLanguage('en');}if(array_key_exists($key,$this->language)){if($key=='smtp_connect_failed'){return$this->language[$key].' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';}return$this->language[$key];}else{return$key;}}public function isError(){return($this->error_count>0);}public function fixEOL($str){$nstr=str_replace(array("\r\n","\r"),"\n",$str);if($this->LE!=="\n"){$nstr=str_replace("\n",$this->LE,$nstr);}return$nstr;}public function addCustomHeader($name,$value=null){if($value===null){$this->CustomHeader[]=explode(':',$name,2);}else{$this->CustomHeader[]=array($name,$value);}}public function getCustomHeaders(){return$this->CustomHeader;}public function msgHTML($message,$basedir='',$advanced=false){preg_match_all('/(src|background)=["\'](.*)["\']/Ui',$message,$images);if(array_key_exists(2,$images)){if(strlen($basedir)>1&&substr($basedir,-1)!='/'){$basedir.='/';}foreach($images[2] as $imgindex=>$url){if(preg_match('#^data:(image[^;,]*)(;base64)?,#',$url,$match)){$data=substr($url,strpos($url,','));if($match[2]){$data=base64_decode($data);}else{$data=rawurldecode($data);}$cid=md5($url).'@phpmailer.0';if($this->addStringEmbeddedImage($data,$cid,'embed'.$imgindex,'base64',$match[1])){$message=str_replace($images[0][$imgindex],$images[1][$imgindex].'="cid:'.$cid.'"',$message);}continue;}if(!empty($basedir)&&(strpos($url,'..')===false)&&substr($url,0,4)!=='cid:'&&!preg_match('#^[a-z][a-z0-9+.-]*:?//#i',$url)){$filename=basename($url);$directory=dirname($url);if($directory=='.'){$directory='';}$cid=md5($url).'@phpmailer.0';if(strlen($directory)>1&&substr($directory,-1)!='/'){$directory.='/';}if($this->addEmbeddedImage($basedir.$directory.$filename,$cid,$filename,'base64',self::_mime_types((string)self::mb_pathinfo($filename,PATHINFO_EXTENSION)))){$message=preg_replace('/'.$images[1][$imgindex].'=["\']'.preg_quote($url,'/').'["\']/Ui',$images[1][$imgindex].'="cid:'.$cid.'"',$message);}}}}$this->isHTML(true);$this->Body=$this->normalizeBreaks($message);$this->AltBody=$this->normalizeBreaks($this->html2text($message,$advanced));if(!$this->alternativeExists()){$this->AltBody='To view this email message, open it in a program that understands HTML!'.self::CRLF.self::CRLF;}return$this->Body;}public function html2text($html,$advanced=false){if(is_callable($advanced)){return call_user_func($advanced,$html);}return html_entity_decode(trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si','',$html))),ENT_QUOTES,$this->CharSet);}public static function _mime_types($ext=''){$mimes=array('xl'=>'application/excel','js'=>'application/javascript','hqx'=>'application/mac-binhex40','cpt'=>'application/mac-compactpro','bin'=>'application/macbinary','doc'=>'application/msword','word'=>'application/msword','xlsx'=>'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','xltx'=>'application/vnd.openxmlformats-officedocument.spreadsheetml.template','potx'=>'application/vnd.openxmlformats-officedocument.presentationml.template','ppsx'=>'application/vnd.openxmlformats-officedocument.presentationml.slideshow','pptx'=>'application/vnd.openxmlformats-officedocument.presentationml.presentation','sldx'=>'application/vnd.openxmlformats-officedocument.presentationml.slide','docx'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document','dotx'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.template','xlam'=>'application/vnd.ms-excel.addin.macroEnabled.12','xlsb'=>'application/vnd.ms-excel.sheet.binary.macroEnabled.12','class'=>'application/octet-stream','dll'=>'application/octet-stream','dms'=>'application/octet-stream','exe'=>'application/octet-stream','lha'=>'application/octet-stream','lzh'=>'application/octet-stream','psd'=>'application/octet-stream','sea'=>'application/octet-stream','so'=>'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','php3'=>'application/x-httpd-php','php4'=>'application/x-httpd-php','php'=>'application/x-httpd-php','phtml'=>'application/x-httpd-php','phps'=>'application/x-httpd-php-source','swf'=>'application/x-shockwave-flash','sit'=>'application/x-stuffit','tar'=>'application/x-tar','tgz'=>'application/x-tar','xht'=>'application/xhtml+xml','xhtml'=>'application/xhtml+xml','zip'=>'application/zip','mid'=>'audio/midi','midi'=>'audio/midi','mp2'=>'audio/mpeg','mp3'=>'audio/mpeg','mpga'=>'audio/mpeg','aif'=>'audio/x-aiff','aifc'=>'audio/x-aiff','aiff'=>'audio/x-aiff','ram'=>'audio/x-pn-realaudio','rm'=>'audio/x-pn-realaudio','rpm'=>'audio/x-pn-realaudio-plugin','ra'=>'audio/x-realaudio','wav'=>'audio/x-wav','bmp'=>'image/bmp','gif'=>'image/gif','jpeg'=>'image/jpeg','jpe'=>'image/jpeg','jpg'=>'image/jpeg','png'=>'image/png','tiff'=>'image/tiff','tif'=>'image/tiff','eml'=>'message/rfc822','css'=>'text/css','html'=>'text/html','htm'=>'text/html','shtml'=>'text/html','log'=>'text/plain','text'=>'text/plain','txt'=>'text/plain','rtx'=>'text/richtext','rtf'=>'text/rtf','vcf'=>'text/vcard','vcard'=>'text/vcard','xml'=>'text/xml','xsl'=>'text/xml','mpeg'=>'video/mpeg','mpe'=>'video/mpeg','mpg'=>'video/mpeg','mov'=>'video/quicktime','qt'=>'video/quicktime','rv'=>'video/vnd.rn-realvideo','avi'=>'video/x-msvideo','movie'=>'video/x-sgi-movie');if(array_key_exists(strtolower($ext),$mimes)){return$mimes[strtolower($ext)];}return 'application/octet-stream';}public static function filenameToType($filename){$qpos=strpos($filename,'?');if(false!==$qpos){$filename=substr($filename,0,$qpos);}$pathinfo=self::mb_pathinfo($filename);return self::_mime_types($pathinfo['extension']);}public static function mb_pathinfo($path,$options=null){$ret=array('dirname'=>'','basename'=>'','extension'=>'','filename'=>'');$pathinfo=array();if(preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im',$path,$pathinfo)){if(array_key_exists(1,$pathinfo)){$ret['dirname']=$pathinfo[1];}if(array_key_exists(2,$pathinfo)){$ret['basename']=$pathinfo[2];}if(array_key_exists(5,$pathinfo)){$ret['extension']=$pathinfo[5];}if(array_key_exists(3,$pathinfo)){$ret['filename']=$pathinfo[3];}}switch($options){case PATHINFO_DIRNAME:case 'dirname':return$ret['dirname'];case PATHINFO_BASENAME:case 'basename':return$ret['basename'];case PATHINFO_EXTENSION:case 'extension':return$ret['extension'];case PATHINFO_FILENAME:case 'filename':return$ret['filename'];default:return$ret;}}public function set($name,$value=''){if(property_exists($this,$name)){$this->$name=$value;return true;}else{$this->setError($this->lang('variable_set').$name);return false;}}public function secureHeader($str){return trim(str_replace(array("\r","\n"),'',$str));}public static function normalizeBreaks($text,$breaktype="\r\n"){return preg_replace('/(\r\n|\r|\n)/ms',$breaktype,$text);}public function sign($cert_filename,$key_filename,$key_pass,$extracerts_filename=''){$this->sign_cert_file=$cert_filename;$this->sign_key_file=$key_filename;$this->sign_key_pass=$key_pass;$this->sign_extracerts_file=$extracerts_filename;}public function DKIM_QP($txt){$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($signHeader){if(!defined('PKCS7_TEXT')){if($this->exceptions){throw new phpmailerException($this->lang('extension_missing').'openssl');}return '';}$privKeyStr=!empty($this->DKIM_private_string)?$this->DKIM_private_string:file_get_contents($this->DKIM_private);if(''!=$this->DKIM_passphrase){$privKey=openssl_pkey_get_private($privKeyStr,$this->DKIM_passphrase);}else{$privKey=openssl_pkey_get_private($privKeyStr);}if(version_compare(PHP_VERSION,'5.3.0')>=0&&in_array('sha256WithRSAEncryption',openssl_get_md_methods(true))){if(openssl_sign($signHeader,$signature,$privKey,'sha256WithRSAEncryption')){openssl_pkey_free($privKey);return base64_encode($signature);}}else{$pinfo=openssl_pkey_get_details($privKey);$hash=hash('sha256',$signHeader);$t='3031300d060960864801650304020105000420'.$hash;$pslen=$pinfo['bits']/8-(strlen($t)/2+3);$eb=pack('H*','0001'.str_repeat('FF',$pslen).'00'.$t);if(openssl_private_encrypt($eb,$signature,$privKey,OPENSSL_NO_PADDING)){openssl_pkey_free($privKey);return base64_encode($signature);}}openssl_pkey_free($privKey);return '';}public function DKIM_HeaderC($signHeader){$signHeader=preg_replace('/\r\n\s+/',' ',$signHeader);$lines=explode("\r\n",$signHeader);foreach($lines as $key=>$line){list($heading,$value)=explode(':',$line,2);$heading=strtolower($heading);$value=preg_replace('/\s{2,}/',' ',$value);$lines[$key]=$heading.':'.trim($value);}$signHeader=implode("\r\n",$lines);return$signHeader;}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-sha256';$DKIMcanonicalization='relaxed/simple';$DKIMquery='dns/txt';$DKIMtime=time();$subject_header="Subject:$subject";$headers=explode($this->LE,$headers_line);$from_header='';$to_header='';$date_header='';$current='';foreach($headers as $header){if(strpos($header,'From:')===0){$from_header=$header;$current='from_header';}elseif(strpos($header,'To:')===0){$to_header=$header;$current='to_header';}elseif(strpos($header,'Date:')===0){$date_header=$header;$current='date_header';}else{if(!empty($$current)&&strpos($header,' =?')===0){$$current.=$header;}else{$current='';}}}$from=str_replace('|','=7C',$this->DKIM_QP($from_header));$to=str_replace('|','=7C',$this->DKIM_QP($to_header));$date=str_replace('|','=7C',$this->DKIM_QP($date_header));$subject=str_replace('|','=7C',$this->DKIM_QP($subject_header));$body=$this->DKIM_BodyC($body);$DKIMlen=strlen($body);$DKIMb64=base64_encode(pack('H*',hash('sha256',$body)));if(''==$this->DKIM_identity){$ident='';}else{$ident=' 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:Date:Subject;\r\n"."\td=".$this->DKIM_domain.';'.$ident."\r\n"."\tz=$from \r\n"."\t|$to \r\n"."\t|$date \r\n"."\t|$subject ;\r\n"."\tbh=".$DKIMb64.";\r\n"."\tb=";$toSign=$this->DKIM_HeaderC($from_header."\r\n".$to_header."\r\n".$date_header."\r\n".$subject_header."\r\n".$dkimhdrs);$signed=$this->DKIM_Sign($toSign);return$dkimhdrs.$signed."\r\n";}public static function hasLineLongerThanMax($str){return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH+2).',})/m',$str);}public function getToAddresses(){return$this->to;}public function getCcAddresses(){return$this->cc;}public function getBccAddresses(){return$this->bcc;}public function getReplyToAddresses(){return$this->ReplyTo;}public function getAllRecipientAddresses(){return$this->all_recipients;}protected function doCallback($isSent,$to,$cc,$bcc,$subject,$body,$from){if(!empty($this->action_function)&&is_callable($this->action_function)){$params=array($isSent,$to,$cc,$bcc,$subject,$body,$from);call_user_func_array($this->action_function,$params);}}}class phpmailerException extends Exception{public function errorMessage(){$errorMsg='<strong>'.htmlspecialchars($this->getMessage())."</strong><br />\n";return$errorMsg;}}
class SMTP{const VERSION='5.2.16';const CRLF="\r\n";const DEFAULT_SMTP_PORT=25;const MAX_LINE_LENGTH=998;const DEBUG_OFF=0;const DEBUG_CLIENT=1;const DEBUG_SERVER=2;const DEBUG_CONNECTION=3;const DEBUG_LOWLEVEL=4;public$Version='5.2.16';public$SMTP_PORT=25;public$CRLF="\r\n";public$do_debug=self::DEBUG_OFF;public$Debugoutput='echo';public$do_verp=false;public$Timeout=300;public$Timelimit=300;protected$smtp_conn;protected$error=array('error'=>'','detail'=>'','smtp_code'=>'','smtp_code_ex'=>'');protected$helo_rply=null;protected$server_caps=null;protected$last_reply='';protected function edebug($str,$level=0){if($level>$this->do_debug){return ;}if(!in_array($this->Debugoutput,array('error_log','html','echo'))&&is_callable($this->Debugoutput)){call_user_func($this->Debugoutput,$str,$level);return ;}switch($this->Debugoutput){case 'error_log':error_log($str);break;case 'html':echo htmlentities(preg_replace('/[\r\n]+/','',$str),ENT_QUOTES,'UTF-8')."<br>\n";break;case 'echo':default:$str=preg_replace('/(\r\n|\r|\n)/ms',"\n",$str);echo gmdate('Y-m-d H:i:s')."\t".str_replace("\n","\n \t ",trim($str))."\n";}}public function connect($host,$port=null,$timeout=30,$options=array()){static$streamok;if(is_null($streamok)){$streamok=function_exists('stream_socket_client');}$this->setError('');if($this->connected()){$this->setError('Already connected to a server');return false;}if(empty($port)){$port=self::DEFAULT_SMTP_PORT;}$this->edebug("Connection: opening to$host :$port , timeout=$timeout , options=".var_export($options,true),self::DEBUG_CONNECTION);$errno=0;$errstr='';if($streamok){$socket_context=stream_context_create($options);set_error_handler(array($this,'errorHandler'));$this->smtp_conn=stream_socket_client($host.":".$port,$errno,$errstr,$timeout,STREAM_CLIENT_CONNECT,$socket_context);restore_error_handler();}else{$this->edebug("Connection: stream_socket_client not available, falling back to fsockopen",self::DEBUG_CONNECTION);set_error_handler(array($this,'errorHandler'));$this->smtp_conn=fsockopen($host,$port,$errno,$errstr,$timeout);restore_error_handler();}if(!is_resource($this->smtp_conn)){$this->setError('Failed to connect to server',$errno,$errstr);$this->edebug('SMTP ERROR: '.$this->error['error'].":$errstr ($errno )",self::DEBUG_CLIENT);return false;}$this->edebug('Connection: opened',self::DEBUG_CONNECTION);if(substr(PHP_OS,0,3)!='WIN'){$max=ini_get('max_execution_time');if($max!=0&&$timeout>$max){@set_time_limit($timeout);}stream_set_timeout($this->smtp_conn,$timeout,0);}$announce=$this->get_lines();$this->edebug('SERVER -> CLIENT: '.$announce,self::DEBUG_SERVER);return true;}public function startTLS(){if(!$this->sendCommand('STARTTLS','STARTTLS',220)){return false;}$crypto_method=STREAM_CRYPTO_METHOD_TLS_CLIENT;if(defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')){$crypto_method|=STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;$crypto_method|=STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;}if(!stream_socket_enable_crypto($this->smtp_conn,true,$crypto_method)){return false;}return true;}public function authenticate($username,$password,$authtype=null,$realm='',$workstation='',$OAuth=null){if(!$this->server_caps){$this->setError('Authentication is not allowed before HELO/EHLO');return false;}if(array_key_exists('EHLO',$this->server_caps)){if(!array_key_exists('AUTH',$this->server_caps)){$this->setError('Authentication is not allowed at this stage');return false;}self::edebug('Auth method requested: '.($authtype?$authtype:'UNKNOWN'),self::DEBUG_LOWLEVEL);self::edebug('Auth methods available on the server: '.implode(',',$this->server_caps['AUTH']),self::DEBUG_LOWLEVEL);if(empty($authtype)){foreach(array('CRAM-MD5','LOGIN','PLAIN','NTLM','XOAUTH2') as $method){if(in_array($method,$this->server_caps['AUTH'])){$authtype=$method;break;}}if(empty($authtype)){$this->setError('No supported authentication methods found');return false;}self::edebug('Auth method selected: '.$authtype,self::DEBUG_LOWLEVEL);}if(!in_array($authtype,$this->server_caps['AUTH'])){$this->setError("The requested authentication method \"$authtype \" is not supported by the server");return false;}}elseif(empty($authtype)){$authtype='LOGIN';}switch($authtype){case 'PLAIN':if(!$this->sendCommand('AUTH','AUTH PLAIN',334)){return false;}if(!$this->sendCommand('User & Password',base64_encode("\0".$username."\0".$password),235)){return false;}break;case 'LOGIN':if(!$this->sendCommand('AUTH','AUTH LOGIN',334)){return false;}if(!$this->sendCommand("Username",base64_encode($username),334)){return false;}if(!$this->sendCommand("Password",base64_encode($password),235)){return false;}break;case 'XOAUTH2':if(is_null($OAuth)){return false;}$oauth=$OAuth->getOauth64();if(!$this->sendCommand('AUTH','AUTH XOAUTH2 '.$oauth,235)){return false;}break;case 'NTLM':require_once 'extras/ntlm_sasl_client.php';$temp=new stdClass;$ntlm_client=new ntlm_sasl_client_class;if(!$ntlm_client->initialize($temp)){$this->setError($temp->error);$this->edebug('You need to enable some modules in your php.ini file: '.$this->error['error'],self::DEBUG_CLIENT);return false;}$msg1=$ntlm_client->typeMsg1($realm,$workstation);if(!$this->sendCommand('AUTH NTLM','AUTH NTLM '.base64_encode($msg1),334)){return false;}$challenge=substr($this->last_reply,3);$challenge=base64_decode($challenge);$ntlm_res=$ntlm_client->NTLMResponse(substr($challenge,24,8),$password);$msg3=$ntlm_client->typeMsg3($ntlm_res,$username,$realm,$workstation);return$this->sendCommand('Username',base64_encode($msg3),235);case 'CRAM-MD5':if(!$this->sendCommand('AUTH CRAM-MD5','AUTH CRAM-MD5',334)){return false;}$challenge=base64_decode(substr($this->last_reply,4));$response=$username.' '.$this->hmac($challenge,$password);return$this->sendCommand('Username',base64_encode($response),235);default:$this->setError("Authentication method \"$authtype \" is not supported");return false;}return true;}protected function hmac($data,$key){if(function_exists('hash_hmac')){return hash_hmac('md5',$data,$key);}$bytelen=64;if(strlen($key)>$bytelen){$key=pack('H*',md5($key));}$key=str_pad($key,$bytelen,chr(0x00));$ipad=str_pad('',$bytelen,chr(0x36));$opad=str_pad('',$bytelen,chr(0x5c));$k_ipad=$key^$ipad;$k_opad=$key^$opad;return md5($k_opad.pack('H*',md5($k_ipad.$data)));}public function connected(){if(is_resource($this->smtp_conn)){$sock_status=stream_get_meta_data($this->smtp_conn);if($sock_status['eof']){$this->edebug('SMTP NOTICE: EOF caught while checking if connected',self::DEBUG_CLIENT);$this->close();return false;}return true;}return false;}public function close(){$this->setError('');$this->server_caps=null;$this->helo_rply=null;if(is_resource($this->smtp_conn)){fclose($this->smtp_conn);$this->smtp_conn=null;$this->edebug('Connection: closed',self::DEBUG_CONNECTION);}}public function data($msg_data){if(!$this->sendCommand('DATA','DATA',354)){return false;}$lines=explode("\n",str_replace(array("\r\n","\r"),"\n",$msg_data));$field=substr($lines[0],0,strpos($lines[0],':'));$in_headers=false;if(!empty($field)&&strpos($field,' ')===false){$in_headers=true;}foreach($lines as $line){$lines_out=array();if($in_headers&&$line==''){$in_headers=false;}while(isset($line[self::MAX_LINE_LENGTH])){$pos=strrpos(substr($line,0,self::MAX_LINE_LENGTH),' ');if(!$pos){$pos=self::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;foreach($lines_out as $line_out){if(!empty($line_out)&&$line_out[0]=='.'){$line_out='.'.$line_out;}$this->client_send($line_out.self::CRLF);}}$savetimelimit=$this->Timelimit;$this->Timelimit=$this->Timelimit*2;$result=$this->sendCommand('DATA END','.',250);$this->Timelimit=$savetimelimit;return$result;}public function hello($host=''){return (boolean)($this->sendHello('EHLO',$host)||$this->sendHello('HELO',$host));}protected function sendHello($hello,$host){$noerror=$this->sendCommand($hello,$hello.' '.$host,250);$this->helo_rply=$this->last_reply;if($noerror){$this->parseHelloFields($hello);}else{$this->server_caps=null;}return$noerror;}protected function parseHelloFields($type){$this->server_caps=array();$lines=explode("\n",$this->helo_rply);foreach($lines as $n=>$s){$s=trim(substr($s,4));if(empty($s)){continue;}$fields=explode(' ',$s);if(!empty($fields)){if(!$n){$name=$type;$fields=$fields[0];}else{$name=array_shift($fields);switch($name){case 'SIZE':$fields=($fields?$fields[0]:0);break;case 'AUTH':if(!is_array($fields)){$fields=array();}break;default:$fields=true;}}$this->server_caps[$name]=$fields;}}}public function mail($from){$useVerp=($this->do_verp?' XVERP':'');return$this->sendCommand('MAIL FROM','MAIL FROM:<'.$from.'>'.$useVerp,250);}public function quit($close_on_error=true){$noerror=$this->sendCommand('QUIT','QUIT',221);$err=$this->error;if($noerror||$close_on_error){$this->close();$this->error=$err;}return$noerror;}public function recipient($address){return$this->sendCommand('RCPT TO','RCPT TO:<'.$address.'>',array(250,251));}public function reset(){return$this->sendCommand('RSET','RSET',250);}protected function sendCommand($command,$commandstring,$expect){if(!$this->connected()){$this->setError("Called$command without being connected");return false;}if(strpos($commandstring,"\n")!==false||strpos($commandstring,"\r")!==false){$this->setError("Command '$command ' contained line breaks");return false;}$this->client_send($commandstring.self::CRLF);$this->last_reply=$this->get_lines();$matches=array();if(preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/",$this->last_reply,$matches)){$code=$matches[1];$code_ex=(count($matches)>2?$matches[2]:null);$detail=preg_replace("/{$code }[ -]".($code_ex?str_replace('.','\\.',$code_ex).' ':'')."/m",'',$this->last_reply);}else{$code=substr($this->last_reply,0,3);$code_ex=null;$detail=substr($this->last_reply,4);}$this->edebug('SERVER -> CLIENT: '.$this->last_reply,self::DEBUG_SERVER);if(!in_array($code,(array)$expect)){$this->setError("$command command failed",$detail,$code,$code_ex);$this->edebug('SMTP ERROR: '.$this->error['error'].': '.$this->last_reply,self::DEBUG_CLIENT);return false;}$this->setError('');return true;}public function sendAndMail($from){return$this->sendCommand('SAML',"SAML FROM:$from ",250);}public function verify($name){return$this->sendCommand('VRFY',"VRFY$name ",array(250,251));}public function noop(){return$this->sendCommand('NOOP','NOOP',250);}public function turn(){$this->setError('The SMTP TURN command is not implemented');$this->edebug('SMTP NOTICE: '.$this->error['error'],self::DEBUG_CLIENT);return false;}public function client_send($data){$this->edebug("CLIENT -> SERVER:$data ",self::DEBUG_CLIENT);return fwrite($this->smtp_conn,$data);}public function getError(){return$this->error;}public function getServerExtList(){return$this->server_caps;}public function getServerExt($name){if(!$this->server_caps){$this->setError('No HELO/EHLO was sent');return null;}if(!array_key_exists($name,$this->server_caps)){if($name=='HELO'){return$this->server_caps['EHLO'];}if($name=='EHLO'||array_key_exists('EHLO',$this->server_caps)){return false;}$this->setError('HELO handshake was used. Client knows nothing about server extensions');return null;}return$this->server_caps[$name];}public function getLastReply(){return$this->last_reply;}protected function get_lines(){if(!is_resource($this->smtp_conn)){return '';}$data='';$endtime=0;stream_set_timeout($this->smtp_conn,$this->Timeout);if($this->Timelimit>0){$endtime=time()+$this->Timelimit;}while(is_resource($this->smtp_conn)&&!feof($this->smtp_conn)){$str=@fgets($this->smtp_conn,515);$this->edebug("SMTP -> get_lines(): \$data is \"$data \"",self::DEBUG_LOWLEVEL);$this->edebug("SMTP -> get_lines(): \$str is \"$str \"",self::DEBUG_LOWLEVEL);$data.=$str;if((isset($str[3])&&$str[3]==' ')){break;}$info=stream_get_meta_data($this->smtp_conn);if($info['timed_out']){$this->edebug('SMTP -> get_lines(): timed-out ('.$this->Timeout.' sec)',self::DEBUG_LOWLEVEL);break;}if($endtime&&time()>$endtime){$this->edebug('SMTP -> get_lines(): timelimit reached ('.$this->Timelimit.' sec)',self::DEBUG_LOWLEVEL);break;}}return$data;}public function setVerp($enabled=false){$this->do_verp=$enabled;}public function getVerp(){return$this->do_verp;}protected function setError($message,$detail='',$smtp_code='',$smtp_code_ex=''){$this->error=array('error'=>$message,'detail'=>$detail,'smtp_code'=>$smtp_code,'smtp_code_ex'=>$smtp_code_ex);}public function setDebugOutput($method='echo'){$this->Debugoutput=$method;}public function getDebugOutput(){return$this->Debugoutput;}public function setDebugLevel($level=0){$this->do_debug=$level;}public function getDebugLevel(){return$this->do_debug;}public function setTimeout($timeout=0){$this->Timeout=$timeout;}public function getTimeout(){return$this->Timeout;}protected function errorHandler($errno,$errmsg){$notice='Connection: Failed to connect to server.';$this->setError($notice,$errno,$errmsg);$this->edebug($notice.' Error number '.$errno.'. "Error notice: '.$errmsg,self::DEBUG_CONNECTION);}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment