/iuy΅~NnZ5" k.o)ympA,a $O# uPΊHKχC5h5 PNi蓭w8KQiɉnN_ 8 Qc0x`/tT,_eLF&7mvxW65alJ|2_ :PՂY8k;gYi%G|o|$%LcyD.'|MLEeJs 8GޔnMlxu|]d4ZS$N;,ƭRk [%3^TLFnUUA@w0Ł+:5U:ƭ!%FF|b "mQ@Euw%F^~ {%Kݵ qZ([ 0?ӄZ~-'ZT/p汖_DsЊ[#?vfi)=~y8Mx>)b,(ծMss}wcKq^[Yk=(INI/ yu' >ӵPpH QɃ3D3APB ݁ag{l!ɝ9LhL&F)5ޥ%lQg[a݊&u+J\k!tgC 㲂/4#ћ@,[)ð|s.Vե]lI) i=.NW~nfM*\;|`B D];OB% } SeX zuC &'[d^3edF>Z/NbʪRfS/^1 /m0ҫO%Lғ}[ wSҡ MuJi] zϽ()Rd`5y"<`HgLk`F&TLk1-- DiB5i ‰]vpebo:xS|NX{DzLi_qϩޫ]37+~|+=\Ӭ[wEW%,ϸ`˲Pe+[V@Sz$e^oyz#"ޕG#AU~``"xr1hfJ&)ReJ6#?HE$vxG3ݺblݙn p\ɿH E}ZL;MJD>2PJ^m-* = t)D1>YK+p^u&]Llolk t@{H<[wԎ{qHliA#Ҩ+0.RGs{#BmF}pf~Âxs?NF OMT^eb@=V8GB+STs#15 ?j٘ZJӑYsRJ:T= w0R'zMSFMaݜɌeKl=dxk`xK[/Zl֘v?NxEF mHNR[*Ӊ1~6Y6/%N-Z ޚ\Q2vI7˒:ںE5Gw[)~+$U l)Jད{IH lrP-y63fd~"m"Ua./_^5mR!^;O=-eyUآTh:>vzVXA, K |'aǽ%ɪ} 62&Q218dNT -~8R z:UE m}b`M I>lsK)1d1E+ċ @;%ɖ}D- 6?޷ U.㠎ks{rdᛥ8uW/E 9||>^_a4'D)Գ-58t"vB}7΃xXM9 p7X>OYHy;PW[N{KzÛo'4!AVSNQQ7.6lpH`k/R>cS jXO߳M ›=ʀտaU1zQYxZHbY#Pk}qP*&Jϯ^g@ֺ-]v|$0G4nILiԮ1z"8K0m\j䣎Dupf(S6faMK} wK,vޟIFu!ŃhU}[KM!۾ܡ oyƬO`7f ʐR1*)/+Ц~\굟}nk-S_!ubwdJZM)۔3NҊ|o'}t{~C@^)Y,{ɨP"r2h cJaxقhR(ܵ `E=C\JX'p,7W[4}ŭKhϕ]lQ3&^QTCtxWc2G pY]*G][109E uJXNb5KyŜ팁we=0f[NW\ '??K!WͶy5 U¿"kV]Ow/b"d=x?AwbQ 3M vu-ۤ22FsݰL|0SLhAVS%> Sk/M)AF/%P.#F֯{Q~D;t$ 2'o&,`ޱ=#B6-l+z:C-% 7IE7X-7X # χ 6ț.NukTX77!pG]Yչ&_{mR=syٳ\ϦCRCw7 45B#|Qn<+e BcHI!q݅QuZ14ֵVu VKrtq\7;e:T, ;Y:/OOeX[$ }#.Ӎ}3>Gaek |EלD3Td-ס#V=ZΝ 5)Khͅ l}9G&@9^AvW(dm_wю=SEe܍y|I"˯ja }v;myr[D&"stLK2B/N1ֵ1fjm[H J2o:TC_d6 dm<{ٕE8 6nԼu n䕷^c%5tˋSDw$,u.6jc!e2,&y2 Ґe2,0 yu-`!νi;,DRcq[)[gcQ|Et|SϸXVD?)^5D"װUC&:Ә̍hY"#^lDʼn ۊGtZT^i_ Ps!P2oŭ _iGo*Hk:Θ1VkY}ifMmŵfk0e9+\̠6`)hR>޷xV$?ҟlaɓCV@ y؄xbN(uV WDZ;ͧ$z3Zx~vZ&| ޾krAp1!abXXxKm[\Sت#L MW^7,܋&G0l,mL^8!:mPy%bf5#.q.GawnȡTf*~;a6:N4ZC\CɛID*Ќ) uybTDlҤsPT/Ass,rlL p;oTQ ;xPYtx^3 3`/s5=r#`,+1z ^3#ܼw k;՚i;oX U<\-(CeϠaTT #+Io3|tgH&VAf1T$$ȕj䅺`#m8*];Ѻ TLo)u Vi>>⽞+<VVFTԵYR pDBL2Z"t6F6$TDbЩ! a|FxgZqbOI7l_R!h5BIPr۩<~Rtl}^*2q VT-e6v%F*dMt|!멃&OW?**nl)լ z7r8 d5ٵu,Zjb!wq4Ѩ 2ޚ)r6O,KB+ppH?1 eYtҮ<>ەXU#މzeG}.oe?ǧSǿEg.r+2-D0}lv0uh'jvJ43q>cˆXElO}9>FV.*Xr(o@'M$C-5ZSm@MxnqISXgV_Yօ+d`>/שi,(liҷߑ>k, 0f^DͶ.CZo J\'rOx34DQP,:w9$\S"_תެeBȔ*![O]c*>VڿEq9"둮?77_CULX,ꤙcosT7[DS6ti +[:r"k7?}qbQ8O3[ k! 5v:up gwē hK&ܙ >02s0j} TӸ58CЙ/זL(l'ԽJv|B}𞥙_!jfcs [DrҚrϐTj)+6i H4+i ٘"(FzngJGqOmE7;yqG@9sVd0<䷔w؍[!aVdc>^iU[c:o,{xB[BG扙r!=>'c06k,UxG~ݸy$ƱGz0d u7kufz,DIiK9z*n I'08m~2td9,jߨyCTT55@_zGkOZX́"t [wj\MXuM :t ֳQ<ڒ_vM8f-^}K 3w.? { ϡ!_i9m3'SJ9:~*ҜU7Pfj]!lVT<D_t̻M~xtAn the SMTP connection. * Options: '', static::ENCRYPTION_STARTTLS, or static::ENCRYPTION_SMTPS. * * @var string */ public $SMTPSecure = ''; /** * Whether to enable TLS encryption automatically if a server supports it, * even if `SMTPSecure` is not set to 'tls'. * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid. * * @var bool */ public $SMTPAutoTLS = true; /** * Whether to use SMTP authentication. * Uses the Username and Password properties. * * @see PHPMailer::$Username * @see PHPMailer::$Password * * @var bool */ public $SMTPAuth = false; /** * Options array passed to stream_context_create when connecting via SMTP. * * @var array */ public $SMTPOptions = []; /** * SMTP username. * * @var string */ public $Username = ''; /** * SMTP password. * * @var string */ public $Password = ''; /** * SMTP authentication type. Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2. * If not specified, the first one from that list that the server supports will be selected. * * @var string */ public $AuthType = ''; /** * An implementation of the PHPMailer OAuthTokenProvider interface. * * @var OAuthTokenProvider */ protected $oauth; /** * The SMTP server timeout in seconds. * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2. * * @var int */ public $Timeout = 300; /** * Comma separated list of DSN notifications * 'NEVER' under no circumstances a DSN must be returned to the sender. * If you use NEVER all other notifications will be ignored. * 'SUCCESS' will notify you when your mail has arrived at its destination. * 'FAILURE' will arrive if an error occurred during delivery. * 'DELAY' will notify you if there is an unusual delay in delivery, but the actual * delivery's outcome (success or failure) is not yet decided. * * @see https://tools.ietf.org/html/rfc3461 See section 4.1 for more information about NOTIFY */ public $dsn = ''; /** * SMTP class debug output mode. * Debug output level. * Options: * @see SMTP::DEBUG_OFF: No output * @see SMTP::DEBUG_CLIENT: Client messages * @see SMTP::DEBUG_SERVER: Client and server messages * @see SMTP::DEBUG_CONNECTION: As SERVER plus connection status * @see SMTP::DEBUG_LOWLEVEL: Noisy, low-level data output, rarely needed * * @see SMTP::$do_debug * * @var int */ public $SMTPDebug = 0; /** * How to handle debug output. * Options: * * `echo` Output plain-text as-is, appropriate for CLI * * `html` Output escaped, line breaks converted to `
`, appropriate for browser output * * `error_log` Output to error log as configured in php.ini * By default PHPMailer will use `echo` if run from a `cli` or `cli-server` SAPI, `html` otherwise. * Alternatively, you can provide a callable expecting two params: a message string and the debug level: * * ```php * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; * ``` * * Alternatively, you can pass in an instance of a PSR-3 compatible logger, though only `debug` * level output is used: * * ```php * $mail->Debugoutput = new myPsr3Logger; * ``` * * @see SMTP::$Debugoutput * * @var string|callable|\Psr\Log\LoggerInterface */ public $Debugoutput = 'echo'; /** * Whether to keep the SMTP connection open after each message. * If this is set to true then the connection will remain open after a send, * and closing the connection will require an explicit call to smtpClose(). * It's a good idea to use this if you are sending multiple messages as it reduces overhead. * See the mailing list example for how to use it. * * @var bool */ public $SMTPKeepAlive = false; /** * Whether to split multiple to addresses into multiple messages * or send them all in one message. * Only supported in `mail` and `sendmail` transports, not in SMTP. * * @var bool * * @deprecated 6.0.0 PHPMailer isn't a mailing list manager! */ public $SingleTo = false; /** * Storage for addresses when SingleTo is enabled. * * @var array */ protected $SingleToArray = []; /** * Whether to generate VERP addresses on send. * Only applicable when sending via SMTP. * * @see https://en.wikipedia.org/wiki/Variable_envelope_return_path * @see http://www.postfix.org/VERP_README.html Postfix VERP info * * @var bool */ public $do_verp = false; /** * Whether to allow sending messages with an empty body. * * @var bool */ public $AllowEmpty = false; /** * DKIM selector. * * @var string */ public $DKIM_selector = ''; /** * DKIM Identity. * Usually the email address used as the source of the email. * * @var string */ public $DKIM_identity = ''; /** * DKIM passphrase. * Used if your key is encrypted. * * @var string */ public $DKIM_passphrase = ''; /** * DKIM signing domain name. * * @example 'example.com' * * @var string */ public $DKIM_domain = ''; /** * DKIM Copy header field values for diagnostic use. * * @var bool */ public $DKIM_copyHeaderFields = true; /** * DKIM Extra signing headers. * * @example ['List-Unsubscribe', 'List-Help'] * * @var array */ public $DKIM_extraHeaders = []; /** * DKIM private key file path. * * @var string */ public $DKIM_private = ''; /** * DKIM private key string. * * If set, takes precedence over `$DKIM_private`. * * @var string */ public $DKIM_private_string = ''; /** * Callback Action function name. * * The function that handles the result of the send email action. * It is called out by send() for each email sent. * * Value can be any php callable: http://www.php.net/is_callable * * Parameters: * bool $result result of the send action * array $to email addresses of the recipients * array $cc cc email addresses * array $bcc bcc email addresses * string $subject the subject * string $body the email body * string $from email address of sender * string $extra extra information of possible use * "smtp_transaction_id' => last smtp transaction id * * @var string */ public $action_function = ''; /** * What to put in the X-Mailer header. * Options: An empty string for PHPMailer default, whitespace/null for none, or a string to use. * * @var string|null */ public $XMailer = ''; /** * Which validator to use by default when validating email addresses. * May be a callable to inject your own validator, but there are several built-in validators. * The default validator uses PHP's FILTER_VALIDATE_EMAIL filter_var option. * * @see PHPMailer::validateAddress() * * @var string|callable */ public static $validator = 'php'; /** * An instance of the SMTP sender class. * * @var SMTP */ protected $smtp; /** * The array of 'to' names and addresses. * * @var array */ protected $to = []; /** * The array of 'cc' names and addresses. * * @var array */ protected $cc = []; /** * The array of 'bcc' names and addresses. * * @var array */ protected $bcc = []; /** * The array of reply-to names and addresses. hg~ےJMNdXŪ\1ln nhH?:$`Tm w!_@\x **f'/,$CRm@)Q!a>lxcߙg<7gQW0<`l$ж*ŒWNeI0e.jܤG&h|{g˵~Aso5F~߿W ;sJP#Y-fϊbo~p %$vn.b))l [ӯT\j33BitbkCw0%iptwG?|4wW%Zj nLw8%7d_ZTbřgVBI =!hoByunoJx*٠?I dj`7,5ƭZ~TXg`* 8b1>+zcWP]ܱz[ x:?9mB5X d6Rj6*x"s/-b@*0" u,`Z[01x#2lGuʹ\~ЂyD!8|ݝǹ)µEyp5gr≳ Ǘ=6u#LL^纒[ɾ6_cY2@Qu hAl ^Lu鴎殥_4=hv;ù_;}5 %3'HŚo[lxY<q%_GnVyN#6up"N4[)-ܗJ,j=v maHH<,|M+|H:^̅ t=#e#:vHX>Ů"̃j0ǹ#[F} ‡/"U5}{|vD4\5zuHj"r: TطR0}!XݡDI;6,)U ONj!l.RmvY4[iLAqWcs![2UiEY@$(,{:sR,4sPT"z*+sV T׎4$^a[NMJz>!쨁?O# .H$N*lpre1>RDѶM[SŸgin/-z:U3j :[Kc-8>C2 ,D7 ! ϷD(USg}XGβ#t>N}K6Q-5 ~ YkS 9UǡXYӮ2hleP8TdD;\b:V!RwvԼMo~~wXN]60Ju3qαS:ѯU2]&n+=6Go:-=5UR`ϓ7 Z^JL_vV?;%rB-EpŤ!!!6-H^ruˠݵ&mG1g΅rL%9$u2 N 0,DuTgŦZٯlDR<ttdF&$do{nB88xkX'nA"%8.?r骔$׃5 Ojb |U" ױUGڈ#ަ6/(TN_RX[YN < 0 U8X1|!gWW0(|̿&,h׋[ҭF#W_j<[:=y/ _E' gU>>X{P{p$a0?;c/Bid> Q`uߏ/wɂ2 &AWeׄ I0ώ4}=ԭ_$Rs_S6*EL Tc$[ yWm](nNjg`"z3&6үX (R-]Sڃw>rr CM -2oتJgBXS%~H7)kU#欴i7Itrxi$V 0ߊO:夰X0rhFnB,Li[gs&$Cϳ]"Bʓѷʳq5:{O*PhQBJV&0Qw0@.JǎHAAp\ nTDJf[oZ†BbR(LuMC9m3Onmģ+:v[9/Ԫ^BBjw˿,8{UݤWyPޤx2D5GTLCydhb=dIUc+a=Kڞs=P4iaԮTmVE Ix~o,~|ϖ/=9.}W6gs'`[p" 0n6tƑ5t w棟Yd{3u4ydCYyaPLُbS50vI~:7e:FPn&~ nJ9xH,-9kZWoQT4هFaJ ^NaR=o}mJ݃:@sfOёv|Q/'9 ꠞw q!ù1/48b|4IXd~!oA5[h?旕U, kߴ O/,m$)$61+^&`,j i\,K12rDf1 qkԮە,_H/G@'6ٿ9=C{v/F MO ,\lQGq ϓhvt$L,J^eV@x6o*[K ` ^v}ԕ w R: [|q96Yk;m֨d`b:`JȵL:y4lluo6n_=ѬN旔]@JD=@%gMJ$DeDFUOl埀܎Gt֚Wx(׋[|TFuis0T#Q?be_]B#~Kk>0񽮖ʦ#o#{.EVg Rn-q֝WjT^P?"̢ (&KTQ/Ye=GV,y1kN"ٹv~x -/)94QnzOQ`_ZU9AXXJC:Zzo&d h d ̩^,HRQwUuT%Ls$ɂ%x-\"'htΙ}O߹I%kfsFHrR[YE} (er4n77I 7GPEG->R EXԮ.s/B̠Z[pJU }f=TE7glG=rpiH^yզė}Je{%xFXKQ[$r3 6UBpZ=Mb\E>mMCZޱJg{zl@6`J3}1~ɺn`d+\NB71_R bhSO \ƜT M2VB劖%Kqb *9oG0JM'3@:|)@l3:BGq0o#" kD~nT= `qy.9SIk2D!6 Хʎͤ)ï+D~*->IȊqE|)[mA3ǯ7nɲ+r< =[}<&5QI& 6q2ȂU㔳@:$iTvGxkS1m*)B/\ e׭j;8>7>ٗSγL eyA IG-uȒ,mr`i*+tEP+"vikP_39AM+?~G\gk#AEw!h%m?WLX}t4rƉOWBYhAVŲ-|97[gI WPjP/g>҂(K3|TFxROaRғܳBbӦYG̭*X5'/3,=Р;⧣؇O=d n=QtI:zǤQ7p$Yج5K}m=^jtL@%*-Ch_γ:G?EjC:7N[Q]^Okucc[=D "0Vl_YS FEp&|&zaڥN /ƻѱ(qOT(;nW2]dp4p`C)V str_replace( "\n", "\n \t ", trim($str) ) ), "\n"; } } /** * Sets message type to HTML or plain. * * @param bool $isHtml True for HTML mode */ public function isHTML($isHtml = true) { if ($isHtml) { $this->ContentType = static::CONTENT_TYPE_TEXT_HTML; } else { $this->ContentType = static::CONTENT_TYPE_PLAINTEXT; } } /** * Send messages using SMTP. */ public function isSMTP() { $this->Mailer = 'smtp'; } /** * Send messages using PHP's mail() function. */ public function isMail() { $this->Mailer = 'mail'; } /** * Send messages using $Sendmail. */ public function isSendmail() { $ini_sendmail_path = ini_get('sendmail_path'); if (false === stripos($ini_sendmail_path, 'sendmail')) { $this->Sendmail = '/usr/sbin/sendmail'; } else { $this->Sendmail = $ini_sendmail_path; } $this->Mailer = 'sendmail'; } /** * Send messages using qmail. */ public function isQmail() { $ini_sendmail_path = ini_get('sendmail_path'); if (false === stripos($ini_sendmail_path, 'qmail')) { $this->Sendmail = '/var/qmail/bin/qmail-inject'; } else { $this->Sendmail = $ini_sendmail_path; } $this->Mailer = 'qmail'; } /** * Add a "To" address. * * @param string $address The email address to send to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ public function addAddress($address, $name = '') { return $this->addOrEnqueueAnAddress('to', $address, $name); } /** * Add a "CC" address. * * @param string $address The email address to send to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ public function addCC($address, $name = '') { return $this->addOrEnqueueAnAddress('cc', $address, $name); } /** * Add a "BCC" address. * * @param string $address The email address to send to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ public function addBCC($address, $name = '') { return $this->addOrEnqueueAnAddress('bcc', $address, $name); } /** * Add a "Reply-To" address. * * @param string $address The email address to reply to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ public function addReplyTo($address, $name = '') { return $this->addOrEnqueueAnAddress('Reply-To', $address, $name); } /** * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still * be modified after calling this function), addition of such addresses is delayed until send(). * Addresses that have been added already return false, but do not throw exceptions. * * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' * @param string $address The email address * @param string $name An optional username associated with the address * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ protected function addOrEnqueueAnAddress($kind, $address, $name) { $pos = false; if ($address !== null) { $address = trim($address); $pos = strrpos($address, '@'); } if (false === $pos) { //At-sign is missing. $error_message = sprintf( '%s (%s): %s', $this->lang('invalid_address'), $kind, $address ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } if ($name !== null && is_string($name)) { $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim } else { $name = ''; } $params = [$kind, $address, $name]; //Enqueue addresses with IDN until we know the PHPMailer::$CharSet. //Domain is assumed to be whatever is after the last @ symbol in the address if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) { if ('Reply-To' !== $kind) { if (!array_key_exists($address, $this->RecipientsQueue)) { $this->RecipientsQueue[$address] = $params; return true; } } elseif (!array_key_exists($address, $this->ReplyToQueue)) { $this->ReplyToQueue[$address] = $params; return true; } return false; } //Immediately add standard addresses without IDN. return call_user_func_array([$this, 'addAnAddress'], $params); } /** * Add an address to one of the recipient arrays or to the ReplyTo array. * Addresses that have been added already return false, but do not throw exceptions. * * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' * @param string $address The email address to send, resp. to reply to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ protected function addAnAddress($kind, $address, $name = '') { if (!in_array($kind, ['to', 'cc', 'bcc', 'Reply-To'])) { $error_message = sprintf( '%s: %s', $this->lang('Invalid recipient kind'), $kind ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } if (!static::validateAddress($address)) { $error_message = sprintf( '%s (%s): %s', $this->lang('invalid_address'), $kind, $address ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } if ('Reply-To' !== $kind) { if (!array_key_exists(strtolower($address), $this->all_recipients)) { $this->{$kind}[] = [$address, $name]; $this->all_recipients[strtolower($address)] = true; return true; } } elseif (!array_key_exists(strtolower($address), $this->ReplyTo)) { $this->ReplyTo[strtolower($address)] = [$address, $name]; return true; } return false; } /** * Parse and validate a string containing one or more RFC822-style comma-separated email addresses * of the form "display name
" into an array of name/address pairs. * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available. * Note that quotes in the name part are removed. * * @see http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation * * @param string $addrstr The address list strĦ/'i;\+ E*8Ev_/5 Ӭ*|Qf 'iνU_jP&!fcr\fF8ԠNڎ1_r8q&w WM$ZM };묮L XbѪ1TM]ߐZp]dEIi#1z7+da2W`eE3K=-OCm~zRCzc+Kރ|'Z 9lWQ :zTS_Pe} "NJbD ?H RENYϳpT'jP)+:P9e;|S=sBl/o[X8)jJPJ`K' X&Vx`_([A=Bi3bUf(9vwi\keHd$ۆ) zQNp^@*vչQOA]UZR]v :m8ZOIdLV Z/Tj\! vM@Dm,0aLL1zxZxu)0gMN YOU(H8<{?]QE_@WfZj[wֽ)2=wkVx93Vy2XI,ãO+͏M&0 Q kRyx~U='RFw͜˲,p4"drݓd"~ ;rW 6nGczm2<^UXYJ|'e5k낪MZD}Kglx%>u>:ATX#N1j#Ēm*? &QP@A4͕H ؾH0Z+`.Jpaogw2LpJ$,8(m mtUS% VeDZqR d}Ro4"eW't|̢Vv&7ؾLx*ftRGv*8懹<\MneAR{W02|PYQ6 ^.^Remad TL;kU|]5xIzh-o)q3%|ukNjJŽRwMؙuH$2)RApOKgFR`CEo'+S}Jװef,TLRǵ^fE|M9*W؛v]; UW}z'/hF3Wi@(=#s4ގՂu/Ne4{L#휪(Օ |$ w5_ hr)d"U2-#!bhM_6}V9eH\HjE!j(9 EsbU%D)/p #'(R2aBH]ĢϥGUBw8LFcm+J#ˆs$1Z)0Tl > {7sVHY;M]s5u@{1$g3@ HZS?oQK>%f9Z8;܂or]9e2@8h>@ }G9o,rx YGLGǢsBUnW"A!v,g/iZ^.ue<fa+_fQKcnÉk^qugl/+U@ o$X'W$3f{IމҀH.%*7=?ç.yOvF0߾ݺ?>=c[sc̰.zH3߳ۼ\G DI7 2ǭpY)ӁKBUMw9uj:{ Qo}QUE7;BT%t(r4~<Ni`.@ 󥺝bޅ>k\R᳭+1C8j֦-߮[~sf4<`՞5YuL/w9-kTSGBWp@`p3}G'7 %+ oq!T$~Cq}Hp+(yⴘ Po]dfGS yyMtl JfB3ܿr*t;),rt27t|Qw >t+a̡oIGO84-͏l]dr-qx4]pqDPX!sN@~ ʞ,PdC W6{VnŲe-%kozٌ:ej~w8FB^1ފll-93\GӁ?ⴂmTvDbJt4N4 Ȱeo``F]*]m2-t89E 㴥 B7d8GxXF Q/h,iT$3yEL./UݘyR5G5 6+EC)BI©lKX3f'Q|Y}«h0x Q I..׼tۏܚo-]$v,]Q^AW(Prᝒ}yoŲМ* Fַv83y͎" ^ZSܨlbE:iqgMjBxsWX.e!ۢV[A߫IB)DZ%84- "#)T)8PkNŞu*s*Z,iϰ$N*~h#$EC%&J &w&y}6NxAIG,.oR^!qtn+Ĥ>\+;@3#g޳Y͔"埡?>MM0qI_XiUK.7:ubjZ(ܞ{ WmH CDmВD5Cu>7Ɠݺݠ_$ Jjx+[?V++whO&ay>GcCjޟ צbEa^F?9=nVruBsHkO[}٤@b%L2X,eByalk#tw=}+6ΊE1R_5p(݂h~;`a1Q1Ϯ0Nd굖QSޞ4U[)S^% V1#g(QRq\pD'6X*X\M#77umNa(n5U9T?;Έ_`FUnO2ͨ %C}t0ә{rpL=pDk3uyku(Nk]یzWn5+WJZ#hBD6 ~/ 7.4N}wMiX +娥5sŹ!:s L"ѱ|`$ U7JZYx5[{?4Ǭaی: X.aw9)+ۡI/ ڐiOSa\ECH]Qۺ{sS__{U6?ʅ/StXs-Hw.Θ4{m& '%<g,N.Kي[y.LAU-¸lJyJm=tP&oLZ'q~N2k dU^ lr6HL[%K9 ɜL07@O"]Étt}9z!kێzŏs[ة3y<'0BJ)_;Om`iӵ]DM:\ 1߀vDJL'c/1mcH0pi^]C 9ʽJG:  '[Ll`(l`RMH/۾݂3>CyT;4]8W=Tk6GIt6RΞJ?ْ5Y6ڟͳ-T2Kw_AXx#xd?,tAJQ\`_֧~RW"A7c_=A. A[[Dюf,k|- {*HoZLƀso,oH2J dW&p&R佷|8C. mμc3ѷ $ůD['DjTWTOt07So)) ~vڨ rO϶bS=-Fʼn^ٙXZ ,HCm3fUTb$[3-[@6ǐo6qm %s F\Mݏ%<5%Cw^}6q(,oeфY=UjB-aa-xJ}NzVX,D׿TW jO v܃G]za,}onXDdmړ45%8إΑiBt⁥V!.@w.;Г҈q8h -5&kw$ǜ9N:0  +(* b{Q0M:GhxJwQ†Zŋ,e#RH+˄I&)7c(=˛СWEԡIkfе2֙<B<~Y#T՚aKUkPUĨR}T IvOUXPtE=T#+*µsE#!\ $V>'h#u,)zv== 01OHaY.fKDgR]±DJ QX; Е11зI,긵zC6BndzA<~10I6Z[O[le2|E؁!zğoQDa)Uy#_b|};]Þ"s| PImG״$&EWqbW%`<-X|A:Sy{qC ׳C|^ii$;r*u1i/Iw'irCyK ZXJ+ +t8S9 s뭁$i!bk贗y]m rGA-jzUF+zMQѪ3 .nYr'1^!Skٙuۤ_ae6qt{Fp?2 Ӣk3Tb/ EfZo2ٗ4d'>w"#LYXB=P(4R=pхO\B|E'a+(0ahPt+,r{y0Ut+&'fALp^*NηQ/6 b"gC0,V:4U+E5Wv|eaEUiy|BI=X.;2l5jHqhD%!$Ol9j s? ~ݐ) xyw.T?~WI(wRu_d JK+nKz\~ u\4)ƹ#to xŶsi| J0B6t?Ǧoee=bxK:,Kw!]"Fe:ԹTA=vѿOeˤGxI}E>xǞ oa "y&-41=‰Eȟ}-0#u=]j[p b_cwK A?+Bc5z"svdiVV .7YZ7Tl!*_{rʕ)\)\q@ U  ypPŤI] * * @see http://squiloople.com/2009/12/20/email-address-validation/ * @copyright 2009-2010 Michael Rushton * Feel free to use and redistribute this code. But please keep this copyright notice. */ return (bool) 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 'html5': /* * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements. * * @see https://html.spec.whatwg.org/#e-mail-state-(type=email) */ return (bool) 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 'php': default: return filter_var($address, FILTER_VALIDATE_EMAIL) !== false; } } /** * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the * `intl` and `mbstring` PHP extensions. * * @return bool `true` if required functions for IDN support are present */ public static function idnSupported() { return function_exists('idn_to_ascii') && function_exists('mb_convert_encoding'); } /** * Converts IDN in given email address to its ASCII form, also known as punycode, if possible. * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet. * This function silently returns unmodified address if: * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form) * - Conversion to punycode is impossible (e.g. required PHP functions are not available) * or fails for any reason (e.g. domain contains characters not allowed in an IDN). * * @see PHPMailer::$CharSet * * @param string $address The email address to convert * * @return string The encoded address in ASCII form */ public function punyencodeAddress($address) { //Verify we have required functions, CharSet, and at-sign. $pos = strrpos($address, '@'); if ( !empty($this->CharSet) && false !== $pos && static::idnSupported() ) { $domain = substr($address, ++$pos); //Verify CharSet string is a valid one, and domain properly encoded in this CharSet. if ($this->has8bitChars($domain) && @mb_check_encoding($domain, $this->CharSet)) { //Convert the domain from whatever charset it's in to UTF-8 $domain = mb_convert_encoding($domain, self::CHARSET_UTF8, $this->CharSet); //Ignore IDE complaints about this line - method signature changed in PHP 5.4 $errorcode = 0; if (defined('INTL_IDNA_VARIANT_UTS46')) { //Use the current punycode standard (appeared in PHP 7.2) $punycode = idn_to_ascii( $domain, \IDNA_DEFAULT | \IDNA_USE_STD3_RULES | \IDNA_CHECK_BIDI | \IDNA_CHECK_CONTEXTJ | \IDNA_NONTRANSITIONAL_TO_ASCII, \INTL_IDNA_VARIANT_UTS46 ); } elseif (defined('INTL_IDNA_VARIANT_2003')) { //Fall back to this old, deprecated/removed encoding $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_2003); } else { //Fall back to a default we don't know about $punycode = idn_to_ascii($domain, $errorcode); } if (false !== $punycode) { return substr($address, 0, $pos) . $punycode; } } } return $address; } /** * Create a message and send it. * Uses the sending method specified by $Mailer. * * @throws Exception * * @return bool false on error - See the ErrorInfo property for details of the error */ public function send() { try { if (!$this->preSend()) { return false; } return $this->postSend(); } catch (Exception $exc) { $this->mailHeader = ''; $this->setError($exc->getMessage()); if ($this->exceptions) { throw $exc; } return false; } } /** * Prepare a message for sending. * * @throws Exception * * @return bool */ public function preSend() { if ( 'smtp' === $this->Mailer || ('mail' === $this->Mailer && (\PHP_VERSION_ID >= 80000 || stripos(PHP_OS, 'WIN') === 0)) ) { //SMTP mandates RFC-compliant line endings //and it's also used with mail() on Windows static::setLE(self::CRLF); } else { //Maintain backward compatibility with legacy Linux command line mailers static::setLE(PHP_EOL); } //Check for buggy PHP versions that add a header with an incorrect line break if ( 'mail' === $this->Mailer && ((\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70017) || (\PHP_VERSION_ID >= 70100 && \PHP_VERSION_ID < 70103)) && ini_get('mail.add_x_header') === '1' && stripos(PHP_OS, 'WIN') === 0 ) { trigger_error($this->lang('buggy_php'), E_USER_WARNING); } try { $this->error_count = 0; //Reset errors $this->mailHeader = ''; //Dequeue recipient and Reply-To addresses with IDN foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) { $params[1] = $this->punyencodeAddress($params[1]); call_user_func_array([$this, 'addAnAddress'], $params); } if (count($this->to) + count($this->cc) + count($this->bcc) < 1) { throw new Exception($this->lang('provide_address'), self::STOP_CRITICAL); } //Validate From, Sender, and ConfirmReadingTo addresses foreach (['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 (!static::validateAddress($this->{$address_kind})) { $error_message = sprintf( '%s (%s): %s', $this->lang('invalid_address'), $address_kind, $this->{$address_kind} ); $this->setError($error_message); $this->edebug($error_message); if ($th5j7_ 58{~QISL(&0jozD jޓ{%UBk, qM<~%5oE=*gC9J$"f QF9#6BK׸o߃S-=d(r`,ӝj|PdFzRMks T 0LKW|+ RdR +MP !}^jŵ#0#r[e 5q"LĨBKwgd(";pB/alf64\2>YF_V%1 CjS8Q^jlsvyM O9ʩP那XٰO2h+v !K *,tmQbVIekB-b}Uc"'݈?47+oD2>Bs(\ Q+2M25Ié CP4qa%m#{GSyE-b# VmO8 ;:(3EteYZR=scc>j@Z (HK]fbg3MICJjN_L**NyOb޼"dQ5 _Y#h$u~,

+ozVڊ]<Ή6ύcp3[bZ+gna}òj:^VQAIA{aY7:bx@Q, t%t2woO<}>vQÓBPՏtfwlօJ@mʢ.y@ T̕3 ^<sHeD;J'Wi '^;UZU$5?׽s=Ͷ񁰕.㴁O}F)"ר RKHjA'$Io$(Oԏ׏(![RO}e=w ڣsI ʼn-hp:{"ĦKp<Hs-аv4M6n` o**N>&.4;B%&RԦeqŜ*.UBŸzJq^^e *3,O խ14{ú@v^X 8}Z+v%UMB1*yxw74YcXŸeS!օ> λd)fC&ȾyZL.ˢ+& MOM R*ob63bK֑y'l@i jLz,=DdPqŇl\6+`Kuo0d3ḺRW5#D~|Q#\TISI%g`LgG;Hѫ'0r/ju ٔg =q̔NBfQWPor QuzEvb7j0х+Q{ 50BǓgquN2t7]ѻ6t:ްFlգSj&dγ~t VA/b 8"B; 8*H,V]5J}ԫ JHFL\㑱C!./K.SӰt9Oټ+4:{&v!_dȡu,??ˬQ)Kp@,d!oSBTK݉x`j雠h#flCEtD2 5HA4۹~ʿb_D\<Сu@;{L*KY*]A,?KG 6ܝ/W%cnnnI<0T)]lz*spp~y6&>u)Dfe{Z- 1'&#wߊZL&Jin!'W^$N癔VQ"c, ]сfP cM(L-.8l![R2wVg6#K9TJ%|( H9DzZ;skPY`$T&^^پ^Lܺ>EBd'&:W}(i\Ր5؜7[[6' _>v{$ };'bG]YjdF:渘')Q܅oeHr37"p| !;%c aID!7X#r!Csw[z y<\ܧS 4`.sxprDɐ+ '~_J I!D--H4~ _+d@f*ݨ.69{ёNbYsL) @;r ɲNqxݕvqeW}&ԐnFtSTQ4w`Q?M~$,"Vx:o["'6.A'@mYigyt)\sjlp=׮_xAԀ~wvG\|Oƒ-4Lp5-qQH: z]2?S2 HLjx6K҂ͳ >eED/5Lt6L.kDTTWdže㶰EƛyP>[l#_[ZmuΏ -e=YeN{#4GKČ!gZy olyflN%l+.@aFOuUCE*[GD^'`gڿҋ̂Ezt_Q?v؆hLpL~e&'ae}ި/j(N~'!cx:ȷpbk R3LxBDfND4/_>&aE?SMIOo/8JC:b #g1<6F{jyZUux>/ LԊJ+5q ~AOX\,VA"[SB-?p,e7_rQQuAi|V6fqJYz}Ѿ6Bg{`y[/B0RTg} I\'H'K_(>kFЗ0 gr2I1UÅO%;Zԣpi=F1kLf- 5V쳷~)U/ FIM HS/"ΡJFR@zEhSmM |Z̥Qez4)v U)w8jk QF?t9s΂֫.em6u!7qMz&GGGKV.9mV\ / ?pūSTaMvq^ɞFDu `3WO_LCmKSu7MjOKhF~ !ƻծVx 8W:FsJv1zvD 7:Z[_˛u>B1jf7c'`a3_i;]auNH>1pg(p}Ē6 cck_8@Ѕc$I*$5@V̛d, ^(xWi9E }ǢM΍!dv@i/3}1D Vq|yĔ+s '"y۪(w"zڟq&"+tJʣ:F #Q>B6hR#Yod2@-M?(vwg3t?iÁsl-5v5S[ұRyW .+R ^Wa"CqSű`fe ,Ǣx}0cȈfQA_TbC~?9#yiszjnCJbJȽ&"]3+RsVt7h{)p%$IE4 %ϠnUc\с[&(ȥT8:حb*>/`PĹc̺4]nC뇺~?fLr5jW50"FEauL \jզ }?yKꥭ-Zpɲ=3.xn3!1]B$`As\qUiH3RNJe 19.^^~ /Ua? QXfN!-LC1 0<Zgj&}Z O 0ˋAYw%‡˰q,ʜex*iEN1lw+rt s":M˜tT\8i%Lsmȡ$UZ[MBd>=C,mL;QW7HozmӾRNWk7L Ϫ7ADbIZ0k `*-'bûsz\Ûguio黭1s_l?rΓ^!̒0RgH!]$@@rpESu Gںh%X(5(dC=_T;WwI#*~p$/ SWyw:x}.cD6`zPFe'sXtE"8q~[5kvL6̀,1, x5 6 hkLY;s|A,y:fg܌+-PIZilP4އx,m܁&r,NI]SyymHt{S㰩dS<>}PCu:_SU>d`٥w}[f iQ)'"TK&Pv5`;p,40bB_Y$˪zؤ^dQ@(2f^hĖb"-=]@+ŌC纻%[_4+b=h'Rp7ll3(7[NM #1/6h+vYpY㌍ ˍq^{-T C/{z,=&L1 [4fM4dPzHfg쓋]Nyk8Y%le]7shfUl+s'Ԙ*.)SJn BQk#e\vz-#6q1&i8IdXlm ] RiS1iD8d;%N"d{\v cߍ۟Ѽ,I u0Z'1 ;+Nqⓤrgze..bɗϰjئ'Ώ)A~)*Z~2ϨthR̙/UcK9W2r) !;OU ) ) Rϼ=\[[kvUCϗY/u;ʝ8B40/L)Cq^jNxyQ.cwsNA%h*R6ViZ b_!#0rJA,/},[\|b3zF:vA4hiU/e#|2p7Ov/i=+V4ˉjX{L5!YھЙ"Azmyrd,h%Fg1 ] \=m'Ѓb 9WK+3.v2͠rG3M ϱ§7ͤދte|-BSֳJ}BZäU7a R'D$*{wTYOІM59kdpoNINY1a+d.d_ܵl]H'ˤʊF[2~ypJ#xa m\Ԭ" T $͚+K-Wזu% }]Sl1`^y+7u! D/V Ҁ[C@ja S {ַ_^U)1a19yS2ya7RMsKOJ͑-0RY)`0^vH(MHz$fӏ?0J)M#Om{'nr"U(i]Z$ )n9ihv $Qՙj!1=ƶmOODzĝЅ0kyn%-w!|?!=bC)~5WG:%op.%-Xn).@DY /IK>~?L?B/rysPьwSu~tQ 9e% P=%J0ݛ(4.STvu^J?h ib"=Ϥh˜[Ԛ8bo͘ qT7hdRhY,xv4AQ6WGkKe*uǝ!I)>כbfFPT1(|@ݟo]t̟}Db$A6%cbFgTc 8qϨJ#g>VϺbโ?J~l/iWDWZAndoCallback( ($result === 0), $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From, [] ); $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); if (0 !== $result) { throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); } } return true; } /** * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters. * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows. * * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report * * @param string $string The string to be validated * * @return bool */ protected static function isShellSafe($string) { //It's not possible to use shell commands safely (which includes the mail() function) without escapeshellarg, //but some hosting providers disable it, creating a security problem that we don't want to have to deal with, //so we don't. if (!function_exists('escapeshellarg') || !function_exists('escapeshellcmd')) { return false; } if ( escapeshellcmd($string) !== $string || !in_array(escapeshellarg($string), ["'$string'", "\"$string\""]) ) { return false; } $length = strlen($string); for ($i = 0; $i < $length; ++$i) { $c = $string[$i]; //All other characters have a special meaning in at least one common shell, including = and +. //Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here. //Note that this does permit non-Latin alphanumeric characters based on the current locale. if (!ctype_alnum($c) && strpos('@_-.', $c) === false) { return false; } } return true; } /** * Check whether a file path is of a permitted type. * Used to reject URLs and phar files from functions that access local file paths, * such as addAttachment. * * @param string $path A relative or absolute path to a file * * @return bool */ protected static function isPermittedPath($path) { //Matches scheme definition from https://tools.ietf.org/html/rfc3986#section-3.1 return !preg_match('#^[a-z][a-z\d+.-]*://#i', $path); } /** * Check whether a file path is safe, accessible, and readable. * * @param string $path A relative or absolute path to a file * * @return bool */ protected static function fileIsAccessible($path) { if (!static::isPermittedPath($path)) { return false; } $readable = file_exists($path); //If not a UNC path (expected to start with \\), check read permission, see #2069 if (strpos($path, '\\\\') !== 0) { $readable = $readable && is_readable($path); } return $readable; } /** * Send mail using the PHP mail() function. * * @see http://www.php.net/manual/en/book.mail.php * * @param string $header The message headers * @param string $body The message body * * @throws Exception * * @return bool */ protected function mailSend($header, $body) { $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; $toArr = []; foreach ($this->to as $toaddr) { $toArr[] = $this->addrFormat($toaddr); } $to = implode(', ', $toArr); $params = null; //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver //A space after `-f` is optional, but there is a long history of its presence //causing problems, so we don't use one //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html //Example problem: https://www.drupal.org/node/1057954 //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. //PHP 5.6 workaround $sendmail_from_value = ini_get('sendmail_from'); if (empty($this->Sender) && !empty($sendmail_from_value)) { //PHP config has a sender address we can use $this->Sender = ini_get('sendmail_from'); } if (!empty($this->Sender) && static::validateAddress($this->Sender)) { if (self::isShellSafe($this->Sender)) { $params = sprintf('-f%s', $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); $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet); $this->doCallback( $result, [[$addrinfo['address'], $addrinfo['name']]], $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 Exception($this->lang('instantiate'), self::STOP_CRITICAL); } return true; } /** * Get an instance to use for SMTP operations. * Override this function to load your own SMTP implementation, * or set one with setSMTPInstance. * * @return SMTP */ public function getSMTPInstance() { if (!is_object($this->smtp)) { $this->smtp = new SMTP(); } return $this->smtp; } /** * Provide an instance to use for SMTP operations. * * @return SMTP */ public function setSMTPInstance(SMTP $smtp) { $this->smtp = $smtp; return $this->smtp; } /** * Send mail via SMTP. * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. * * @see PHPMailer::setSMTPInstance() to use a different class. * * @uses \PHPMailer\PHPMailer\SMTP * * @param string $header The message headers * @param string $body The message body * * @throws Exception * * @return bool */ protected function smtpSend($header, $body) { $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; $bad_rcpt = []; if (!$this->smtpConnect($this->SMTPOptions)) { throw new Exception($this->lang('smtp_connect_failed'), self::STOP_CRITICAL); } //Sender already validated in preSend() if ('' === $this->Sender) { $smtp_from = $this->From; } else { $smtp_from = $this->Sender; } if (!$this->smtp->mail($smtp_from)) { $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError())); throw new Exception($this->ErrorInfo, self::STOP_CRITICAL); } $callbacks = []; //Attempt to send to all recipients foreach ([$this->to, $this->cc, $this->bcc] as $togroup) { foreach ($togroup as $to) { if (!$tC< K,{7(I)Ohn9爂eӄ]4h*nŻYzQ7%6kc$rf)00-ɳ o"*4ɤt7_1LϔOOzGV/<MϢg}juJ^aUj7lҔGWXzQm@*ДAġCOg:7-Fׄy7#@)RrX%^G˃USCi,C˿wf =WS (]qAV!i欈=gDЮS5psfҎd<Ax_{`3\U]:Qu, 7<k5z{+|y07MСP+&ݳpFG5سq q`\ĪcKNHg5nNtΩ0Ɛ. pp/ =x[b?ù4M$4(n#\ _qe67,kg]j\3.$%]CcWBSqjH&'Lj1Uě  )GϑI_[LV>ny+v]!jP'LcYVUC!K]:g3wZK7Rt^/;;=b/ 9/@g%J  & v;(mh7ʀr P >:!Au>WH [LSAYԒ0m^1~ o P@oϴ(F{!HĈ7˗*\7`"l6-z_PN$&dzΞ%8z0f ^| NI7vi05Oc[8Ӂ/:ƜO] fHTcӻ)P7ceN8P1Qx #ޙNOLvxHrQn2%;:"¼a|Q{qQP 01$nGO5b`xuv;h8@qY XU%fܥ̊VIzV/w)ܼk@Ȋ-| ẬN5AwEߝl+̺{1:,Zq<: reGU8[tAb٬Co j2k3БU$~2+?'Ζ.3I<>>[fV4+wIOt/˝ -v4qX+ t䪛&<He$#L|H3 f:&+w3P*(/>^gh+7TU'w#ޑ,ΎiyW'H6 ; Y@$ *Qh#)-E .nY~;*}$N`%jwz^MrOTZ OA!etmovKRce%4c ":V%0 є `z' ȴh x|,2O/R} Y~^~OYniWO.l*AZ#xʄ^R&j;iMW-C:7&] mWhjU) tKdy)diЊcpYݪ_ }szѫJPt%+CdOܤsxTժ@OfH21P5rEOg=En~# V?6^MIK_T !kSXÉ<"NPH@4qhGW??-Ӱa.p.n=HcڦJ(Qѣo%Yrk5һρp*r*oIdy0Q4IcJ75Y~ĉh:߲W}%0Hivx̋y8t2w>po> Y5&7QDQG\JxKuN+j--;T#Ψ"TWfyc4I9ueXʕE]pS.wЬ,(Z,Ƕk|ezywYCTd8JmfeЉQ;cga+ E%:]aUe<_ ɬonhn c9\P#mŬːP7aeeQYryVHJ.xU[JJ^D U瓮={HEflѰW[>vgEydy`wΪَfd`(%OWlԢ ~Yfn(!cy`7I|#Gf1<\w# h0#l?KOh/-92Q8YW+BA?Ѐ" + 9 Қc~S*Q#t7-롾߰Έ\[ϦLƀl3e b*mWMp9^Zoߖ>BݶT'=RZWL sK!C{`n\mI+0$ jh8VTo$+Tpjy!ߔ%Qy#MJ=slRa~KUwcC_ɤa7°_%c Gsu͝V"{F}@a*N5Ů '3 |Y2'u2uGA,Ŵz!ˠ$aH7~ HQńD- #V`%qE^\RJ-dqFG6JǸq2&BY36?=dhnv6GtF>Q?Iw0JONZW+/=(40Nn!6xڛ׌K xvDR6NV13V:U13qA]ݎfKDZQĖ4%erth\*ߥvjTv{Ǖ'9Un=`o*S(sO/T(e^'ax/VDXi".weL&cR˺@(t[2}:}PMj% `,-: xdJ ЈMĺLT"؏J嶃J{O5{n?Vg~T(+YE5bx =Mm|VpX=hd:H=(3?XB^88Gg#7 x5{*9 YB#qc8S^~#XY5uO~@Ec ̡0|`Vڷg)Q$I2>7m41\{XE˪owRĝ=ܭo<Ci80л[~RmzheMdn'agJDs*4cu`bUX ߰yn#Ԟ4 <P&Xq]zUB6R Xh =9 9=n R-7_ ِ?X "Lmy5峧S_۪eA<9)V)A Eq2:`߅@6BE_55H=sCm.D"qzV"cHy9kθAQ: d7 ðрSۙ4M@K7]C W`diGEVkF́F߱ץ`,H|KaIÀR=/6|vŖHS߻0K ; [7:4$r,JE-\$L@{Y*aQI BC>7KkyY:Y<1CY%-&7T졿u=#u\X޳"oh^gC돹XGˍ*?hWiʶIDhJy<@sZv7T>zyMX#,- пb|kq7p5WűMV=.'qAcaK),MU3dupH,v${W~=͡8bSN^鷛R0" )9{|!h;zrR;W50'>t?=#؜|5)O3|GGPcxɱl\5?&@!R}Ŵ_98PI;`LhNe Ck@N~x^zܨ '1:.'KhtDв$^}3n,q)+8 1g9+I|BŒRTC(~tAx%U%iFұjqq8@+uwB=yP$'3Y:۬o~iA/l?w7nH Z'%4^z{'d xJŶŴKSsr'pi$v ¬\_q.eaކdIУ9JKf `FY#pjG49(b/sr# nǤWtKռ2b}0brßq#+ript annotation and/or a 2-character country annotation. * @param string $lang_path Path to the language file directory, with trailing separator (slash) * Do not set this from user input! * * @return bool Returns true if the requested language was loaded, false otherwise. */ public function setLanguage($langcode = 'en', $lang_path = '') { //Backwards compatibility for renamed language codes $renamed_langcodes = [ 'br' => 'pt_br', 'cz' => 'cs', 'dk' => 'da', 'no' => 'nb', 'se' => 'sv', 'rs' => 'sr', 'tg' => 'tl', 'am' => 'hy', ]; if (array_key_exists($langcode, $renamed_langcodes)) { $langcode = $renamed_langcodes[$langcode]; } //Define full set of translatable strings in English $PHPMAILER_LANG = [ 'authenticate' => 'SMTP Error: Could not authenticate.', 'buggy_php' => 'Your version of PHP is affected by a bug that may result in corrupted messages.' . ' To fix it, switch to sending using SMTP, disable the mail.add_x_header option in' . ' your php.ini, switch to MacOS or Linux, or upgrade your PHP to version 7.0.17+ or 7.1.3+.', '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: ', 'extension_missing' => 'Extension missing: ', '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: ', 'invalid_header' => 'Invalid header name or value', 'invalid_hostentry' => 'Invalid hostentry: ', 'invalid_host' => 'Invalid host: ', '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_code' => 'SMTP code: ', 'smtp_code_ex' => 'Additional SMTP info: ', 'smtp_connect_failed' => 'SMTP connect() failed.', 'smtp_detail' => 'Detail: ', 'smtp_error' => 'SMTP server error: ', 'variable_set' => 'Cannot set or reset variable: ', ]; if (empty($lang_path)) { //Calculate an absolute path so it can work if CWD is not here $lang_path = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR; } //Validate $langcode $foundlang = true; $langcode = strtolower($langcode); if ( !preg_match('/^(?P[a-z]{2})(?P