Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- class PHPMailer
- {
- const CHARSET_ISO88591 = 'iso-8859-1';
- const CHARSET_UTF8 = 'utf-8';
- const CONTENT_TYPE_PLAINTEXT = 'text/plain';
- const CONTENT_TYPE_TEXT_CALENDAR = 'text/calendar';
- const CONTENT_TYPE_TEXT_HTML = 'text/html';
- const CONTENT_TYPE_MULTIPART_ALTERNATIVE = 'multipart/alternative';
- const CONTENT_TYPE_MULTIPART_MIXED = 'multipart/mixed';
- const CONTENT_TYPE_MULTIPART_RELATED = 'multipart/related';
- const ENCODING_7BIT = '7bit';
- const ENCODING_8BIT = '8bit';
- const ENCODING_BASE64 = 'base64';
- const ENCODING_BINARY = 'binary';
- const ENCODING_QUOTED_PRINTABLE = 'quoted-printable';
- public $Priority;
- public $CharSet = self::CHARSET_ISO88591;
- public $ContentType = self::CONTENT_TYPE_PLAINTEXT;
- public $Encoding = self::ENCODING_8BIT;
- public $ErrorInfo = '';
- public $From = 'root@localhost';
- public $FromName = 'Root User';
- public $Sender = '';
- 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 $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 = [];
- public $Username = '';
- public $Password = '';
- public $AuthType = '';
- protected $oauth;
- public $Timeout = 300;
- public $dsn = '';
- public $SMTPDebug = 0;
- public $Debugoutput = 'echo';
- public $SMTPKeepAlive = false;
- public $SingleTo = false;
- protected $SingleToArray = [];
- public $do_verp = false;
- public $AllowEmpty = false;
- public $DKIM_selector = '';
- public $DKIM_identity = '';
- public $DKIM_passphrase = '';
- public $DKIM_domain = '';
- public $DKIM_copyHeaderFields = true;
- public $DKIM_extraHeaders = [];
- public $DKIM_private = '';
- public $DKIM_private_string = '';
- public $action_function = '';
- public $XMailer = '';
- public static $validator = 'php';
- protected $smtp;
- protected $to = [];
- protected $cc = [];
- protected $bcc = [];
- protected $ReplyTo = [];
- protected $all_recipients = [];
- protected $RecipientsQueue = [];
- protected $ReplyToQueue = [];
- protected $attachment = [];
- protected $CustomHeader = [];
- protected $lastMessageID = '';
- protected $message_type = '';
- protected $boundary = [];
- protected $language = [];
- 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 VERSION = '6.0.7';
- const STOP_MESSAGE = 0;
- const STOP_CONTINUE = 1;
- const STOP_CRITICAL = 2;
- protected static $LE = "\r\n";
- const MAX_LINE_LENGTH = 998;
- const STD_LINE_LENGTH = 76;
- public function __construct($exceptions = null)
- {
- if (null !== $exceptions) {
- $this->exceptions = (bool)$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 (!$this->UseSendmailOptions or 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 ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) {
- $this->Debugoutput->debug($str);
- return;
- }
- if (!in_array($this->Debugoutput, ['error_log', 'html', 'echo']) and 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|\r/ms', "\n", $str);
- echo gmdate('Y-m-d H:i:s'),
- "\t",
- trim(
- str_replace(
- "\n",
- "\n \t ",
- trim($str)
- )
- ),
- "\n";
- }
- }
- public function isHTML($isHtml = true)
- {
- if ($isHtml) {
- $this->ContentType = static::CONTENT_TYPE_TEXT_HTML;
- } else {
- $this->ContentType = static::CONTENT_TYPE_PLAINTEXT;
- }
- }
- public function isSMTP()
- {
- $this->Mailer = 'smtp';
- }
- public function isMail()
- {
- $this->Mailer = 'mail';
- }
- 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';
- }
- 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';
- }
- 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));
- $pos = strrpos($address, '@');
- if (false === $pos) {
- $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;
- }
- $params = [$kind, $address, $name];
- if ($this->has8bitChars(substr($address, ++$pos)) and static::idnSupported()) {
- if ('Reply-To' != $kind) {
- 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([$this, 'addAnAddress'], $params);
- }
- 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;
- }
- } else {
- if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
- $this->ReplyTo[strtolower($address)] = [$address, $name];
- return true;
- }
- }
- return false;
- }
- public static function parseAddresses($addrstr, $useimap = true)
- {
- $addresses = [];
- if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
- $list = imap_rfc822_parse_adrlist($addrstr, '');
- foreach ($list as $address) {
- if ('.SYNTAX-ERROR.' != $address->host) {
- if (static::validateAddress($address->mailbox . '@' . $address->host)) {
- $addresses[] = [
- '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 (static::validateAddress($address)) {
- $addresses[] = [
- 'name' => '',
- 'address' => $address,
- ];
- }
- } else {
- list($name, $email) = explode('<', $address);
- $email = trim(str_replace('>', '', $email));
- if (static::validateAddress($email)) {
- $addresses[] = [
- 'name' => trim(str_replace(['"', "'"], '', $name)),
- 'address' => $email,
- ];
- }
- }
- }
- }
- return $addresses;
- }
- public function setFrom($address, $name = '', $auto = true)
- {
- $address = trim($address);
- $name = trim(preg_replace('/[\r\n]+/', '', $name));
- $pos = strrpos($address, '@');
- if (false === $pos or
- (!$this->has8bitChars(substr($address, ++$pos)) or !static::idnSupported()) and
- !static::validateAddress($address)) {
- $error_message = sprintf('%s (From): %s',
- $this->lang('invalid_address'),
- $address);
- $this->setError($error_message);
- $this->edebug($error_message);
- if ($this->exceptions) {
- throw new Exception($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 (null === $patternselect) {
- $patternselect = static::$validator;
- }
- if (is_callable($patternselect)) {
- return call_user_func($patternselect, $address);
- }
- if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
- return false;
- }
- switch ($patternselect) {
- case 'pcre':
- case 'pcre8':
- 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':
- 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 (bool)filter_var($address, FILTER_VALIDATE_EMAIL);
- }
- }
- public static function idnSupported()
- {
- return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
- }
- public function punyencodeAddress($address)
- {
- $pos = strrpos($address, '@');
- if (static::idnSupported() and
- !empty($this->CharSet) and
- false !== $pos
- ) {
- $domain = substr($address, ++$pos);
- if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
- $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
- $errorcode = 0;
- $punycode = idn_to_ascii($domain, $errorcode, INTL_IDNA_VARIANT_UTS46);
- if (false !== $punycode) {
- return substr($address, 0, $pos) . $punycode;
- }
- }
- }
- return $address;
- }
- 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;
- }
- }
- public function preSend()
- {
- if ('smtp' == $this->Mailer or
- ('mail' == $this->Mailer and stripos(PHP_OS, 'WIN') === 0)
- ) {
- static::setLE("\r\n");
- } else {
- static::setLE(PHP_EOL);
- }
- if (ini_get('mail.add_x_header') == 1
- and 'mail' == $this->Mailer
- and stripos(PHP_OS, 'WIN') === 0
- and ((version_compare(PHP_VERSION, '7.0.0', '>=')
- and version_compare(PHP_VERSION, '7.0.17', '<'))
- or (version_compare(PHP_VERSION, '7.1.0', '>=')
- and version_compare(PHP_VERSION, '7.1.3', '<')))
- ) {
- trigger_error(
- '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+.',
- E_USER_WARNING
- );
- }
- 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([$this, 'addAnAddress'], $params);
- }
- if (count($this->to) + count($this->cc) + count($this->bcc) < 1) {
- throw new Exception($this->lang('provide_address'), self::STOP_CRITICAL);
- }
- 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 ($this->exceptions) {
- throw new Exception($error_message);
- }
- return false;
- }
- }
- if ($this->alternativeExists()) {
- $this->ContentType = static::CONTENT_TYPE_MULTIPART_ALTERNATIVE;
- }
- $this->setMessageType();
- if (!$this->AllowEmpty and empty($this->Body)) {
- throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL);
- }
- $this->Subject = trim($this->Subject);
- $this->MIMEHeader = '';
- $this->MIMEBody = $this->createBody();
- $tempheaders = $this->MIMEHeader;
- $this->MIMEHeader = $this->createHeader();
- $this->MIMEHeader .= $tempheaders;
- if ('mail' == $this->Mailer) {
- 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($this->Subject))
- );
- }
- if (!empty($this->DKIM_domain)
- and !empty($this->DKIM_selector)
- and (!empty($this->DKIM_private_string)
- or (!empty($this->DKIM_private)
- and static::isPermittedPath($this->DKIM_private)
- and 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 ") . static::$LE .
- static::normalizeBreaks($header_dkim) . static::$LE;
- }
- return true;
- } catch (Exception $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 (Exception $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) and self::isShellSafe($this->Sender)) {
- if ('qmail' == $this->Mailer) {
- $sendmailFmt = '%s -f%s';
- } else {
- $sendmailFmt = '%s -oi -f%s -t';
- }
- } else {
- if ('qmail' == $this->Mailer) {
- $sendmailFmt = '%s';
- } else {
- $sendmailFmt = '%s -oi -t';
- }
- }
- $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);
- if ($this->SingleTo) {
- foreach ($this->SingleToArray as $toAddr) {
- $mail = @popen($sendmail, 'w');
- if (!$mail) {
- throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
- }
- fwrite($mail, 'To: ' . $toAddr . "\n");
- fwrite($mail, $header);
- fwrite($mail, $body);
- $result = pclose($mail);
- $this->doCallback(
- ($result == 0),
- [$toAddr],
- $this->cc,
- $this->bcc,
- $this->Subject,
- $body,
- $this->From,
- []
- );
- if (0 !== $result) {
- throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
- }
- }
- } else {
- $mail = @popen($sendmail, 'w');
- if (!$mail) {
- throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
- }
- fwrite($mail, $header);
- fwrite($mail, $body);
- $result = pclose($mail);
- $this->doCallback(
- ($result == 0),
- $this->to,
- $this->cc,
- $this->bcc,
- $this->Subject,
- $body,
- $this->From,
- []
- );
- if (0 !== $result) {
- throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
- }
- }
- return true;
- }
- protected static function isShellSafe($string)
- {
- if (escapeshellcmd($string) !== $string
- or !in_array(escapeshellarg($string), ["'$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 static function isPermittedPath($path)
- {
- return !preg_match('#^[a-z]+://#i', $path);
- }
- protected function mailSend($header, $body)
- {
- $toArr = [];
- foreach ($this->to as $toaddr) {
- $toArr[] = $this->addrFormat($toaddr);
- }
- $to = implode(', ', $toArr);
- $params = null;
- if (!empty($this->Sender) and static::validateAddress($this->Sender)) {
- if (self::isShellSafe($this->Sender)) {
- $params = sprintf('-f%s', $this->Sender);
- }
- }
- if (!empty($this->Sender) and static::validateAddress($this->Sender)) {
- $old_from = ini_get('sendmail_from');
- ini_set('sendmail_from', $this->Sender);
- }
- $result = false;
- if ($this->SingleTo and count($toArr) > 1) {
- foreach ($toArr as $toAddr) {
- $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
- $this->doCallback($result, [$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 Exception($this->lang('instantiate'), self::STOP_CRITICAL);
- }
- return true;
- }
- public function getSMTPInstance()
- {
- if (!is_object($this->smtp)) {
- $this->smtp = new SMTP();
- }
- return $this->smtp;
- }
- public function setSMTPInstance(SMTP $smtp)
- {
- $this->smtp = $smtp;
- return $this->smtp;
- }
- protected function smtpSend($header, $body)
- {
- $bad_rcpt = [];
- if (!$this->smtpConnect($this->SMTPOptions)) {
- throw new Exception($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
- }
- 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 = [];
- foreach ([$this->to, $this->cc, $this->bcc] as $togroup) {
- foreach ($togroup as $to) {
- if (!$this->smtp->recipient($to[0], $this->dsn)) {
- $error = $this->smtp->getError();
- $bad_rcpt[] = ['to' => $to[0], 'error' => $error['detail']];
- $isSent = false;
- } else {
- $isSent = true;
- }
- $callbacks[] = ['issent' => $isSent, 'to' => $to[0]];
- }
- }
- if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
- throw new Exception($this->lang('data_not_accepted'), self::STOP_CRITICAL);
- }
- $smtp_transaction_id = $this->smtp->getLastTransactionID();
- if ($this->SMTPKeepAlive) {
- $this->smtp->reset();
- } else {
- $this->smtp->quit();
- $this->smtp->close();
- }
- foreach ($callbacks as $cb) {
- $this->doCallback(
- $cb['issent'],
- [$cb['to']],
- [],
- [],
- $this->Subject,
- $body,
- $this->From,
- ['smtp_transaction_id' => $smtp_transaction_id]
- );
- }
- if (count($bad_rcpt) > 0) {
- $errstr = '';
- foreach ($bad_rcpt as $bad) {
- $errstr .= $bad['to'] . ': ' . $bad['error'];
- }
- throw new Exception(
- $this->lang('recipients_failed') . $errstr,
- self::STOP_CONTINUE
- );
- }
- return true;
- }
- public function smtpConnect($options = null)
- {
- if (null === $this->smtp) {
- $this->smtp = $this->getSMTPInstance();
- }
- if (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 = [];
- if (!preg_match(
- '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/',
- trim($hostentry),
- $hostinfo
- )) {
- static::edebug($this->lang('connect_host') . ' ' . $hostentry);
- continue;
- }
- if (!static::isValidHost($hostinfo[3])) {
- static::edebug($this->lang('connect_host') . ' ' . $hostentry);
- continue;
- }
- $prefix = '';
- $secure = $this->SMTPSecure;
- $tls = ('tls' == $this->SMTPSecure);
- if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
- $prefix = 'ssl://';
- $tls = false;
- $secure = 'ssl';
- } elseif ('tls' == $hostinfo[2]) {
- $tls = true;
- $secure = 'tls';
- }
- $sslext = defined('OPENSSL_ALGO_SHA256');
- if ('tls' === $secure or 'ssl' === $secure) {
- if (!$sslext) {
- throw new Exception($this->lang('extension_missing') . 'openssl', self::STOP_CRITICAL);
- }
- }
- $host = $hostinfo[3];
- $port = $this->Port;
- $tport = (int)$hostinfo[4];
- if ($tport > 0 and $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 and $sslext and 'ssl' != $secure and $this->smtp->getServerExt('STARTTLS')) {
- $tls = true;
- }
- if ($tls) {
- if (!$this->smtp->startTLS()) {
- throw new Exception($this->lang('connect_host'));
- }
- $this->smtp->hello($hello);
- }
- if ($this->SMTPAuth) {
- if (!$this->smtp->authenticate(
- $this->Username,
- $this->Password,
- $this->AuthType,
- $this->oauth
- )
- ) {
- throw new Exception($this->lang('authenticate'));
- }
- }
- return true;
- } catch (Exception $exc) {
- $lastexception = $exc;
- $this->edebug($exc->getMessage());
- $this->smtp->quit();
- }
- }
- }
- $this->smtp->close();
- if ($this->exceptions and null !== $lastexception) {
- throw $lastexception;
- }
- return false;
- }
- public function smtpClose()
- {
- if (null !== $this->smtp) {
- if ($this->smtp->connected()) {
- $this->smtp->quit();
- $this->smtp->close();
- }
- }
- }
- public function setLanguage($langcode = 'en', $lang_path = '')
- {
- $renamed_langcodes = [
- 'br' => 'pt_br',
- 'cz' => 'cs',
- 'dk' => 'da',
- 'no' => 'nb',
- 'se' => 'sv',
- 'rs' => 'sr',
- 'tg' => 'tl',
- ];
- if (isset($renamed_langcodes[$langcode])) {
- $langcode = $renamed_langcodes[$langcode];
- }
- $PHPMAILER_LANG = [
- '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(__DIR__) . 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 ('en' != $langcode) {
- if (!static::isPermittedPath($lang_file) || !file_exists($lang_file)) {
- $foundlang = false;
- } else {
- $foundlang = include $lang_file;
- }
- }
- $this->language = $PHPMAILER_LANG;
- return (bool)$foundlang;
- }
- public function getTranslations()
- {
- return $this->language;
- }
- public function addrAppend($type, $addr)
- {
- $addresses = [];
- foreach ($addr as $address) {
- $addresses[] = $this->addrFormat($address);
- }
- return $type . ': ' . implode(', ', $addresses) . static::$LE;
- }
- public function addrFormat($addr)
- {
- if (empty($addr[1])) {
- return $this->secureHeader($addr[0]);
- }
- 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', static::$LE);
- } else {
- $soft_break = static::$LE;
- }
- $is_utf8 = static::CHARSET_UTF8 === strtolower($this->CharSet);
- $lelen = strlen(static::$LE);
- $crlflen = strlen(static::$LE);
- $message = static::normalizeBreaks($message);
- if (substr($message, -$lelen) == static::$LE) {
- $message = substr($message, 0, -$lelen);
- }
- $lines = explode(static::$LE, $message);
- $message = '';
- foreach ($lines as $line) {
- $words = explode(' ', $line);
- $buf = '';
- $firstword = true;
- foreach ($words as $word) {
- if ($qp_mode and (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', static::$LE);
- } 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', static::$LE);
- } else {
- $buf = $part;
- }
- }
- } else {
- $buf_o = $buf;
- if (!$firstword) {
- $buf .= ' ';
- }
- $buf .= $word;
- if (strlen($buf) > $length and '' != $buf_o) {
- $message .= $buf_o . $soft_break;
- $buf = $word;
- }
- }
- $firstword = false;
- }
- $message .= $buf . static::$LE;
- }
- 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 -= $lookBack - $encodedCharPos;
- }
- $foundSplitPos = true;
- } elseif ($dec >= 192) {
- $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 ('mail' != $this->Mailer) {
- foreach ($this->to as $toaddr) {
- $this->SingleToArray[] = $this->addrFormat($toaddr);
- }
- }
- } else {
- if (count($this->to) > 0) {
- if ('mail' != $this->Mailer) {
- $result .= $this->addrAppend('To', $this->to);
- }
- } elseif (count($this->cc) == 0) {
- $result .= $this->headerLine('To', 'undisclosed-recipients:;');
- }
- }
- $result .= $this->addrAppend('From', [[trim($this->From), $this->FromName]]);
- if (count($this->cc) > 0) {
- $result .= $this->addrAppend('Cc', $this->cc);
- }
- if ((
- 'sendmail' == $this->Mailer or 'qmail' == $this->Mailer or 'mail' == $this->Mailer
- )
- and count($this->bcc) > 0
- ) {
- $result .= $this->addrAppend('Bcc', $this->bcc);
- }
- if (count($this->ReplyTo) > 0) {
- $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
- }
- if ('mail' != $this->Mailer) {
- $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
- }
- if ('' != $this->MessageID and 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 (null !== $this->Priority) {
- $result .= $this->headerLine('X-Priority', $this->Priority);
- }
- if ('' == $this->XMailer) {
- $result .= $this->headerLine(
- 'X-Mailer',
- 'PHPMailer ' . self::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', static::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', static::CONTENT_TYPE_MULTIPART_MIXED . ';');
- $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
- break;
- case 'alt':
- case 'alt_inline':
- $result .= $this->headerLine('Content-Type', static::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 (static::ENCODING_7BIT != $this->Encoding) {
- if ($ismultipart) {
- if (static::ENCODING_8BIT == $this->Encoding) {
- $result .= $this->headerLine('Content-Transfer-Encoding', static::ENCODING_8BIT);
- }
- } else {
- $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
- }
- }
- if ('mail' != $this->Mailer) {
- $result .= static::$LE;
- }
- return $result;
- }
- public function getSentMIMEMessage()
- {
- return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . static::$LE . static::$LE . $this->MIMEBody;
- }
- protected function generateId()
- {
- $len = 32;
- if (function_exists('random_bytes')) {
- $bytes = random_bytes($len);
- } elseif (function_exists('openssl_random_pseudo_bytes')) {
- $bytes = openssl_random_pseudo_bytes($len);
- } else {
- $bytes = hash('sha256', uniqid((string)mt_rand(), true), true);
- }
- return str_replace(['=', '+', '/'], '', base64_encode(hash('sha256', $bytes, true)));
- }
- 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() . static::$LE;
- }
- $this->setWordWrap();
- $bodyEncoding = $this->Encoding;
- $bodyCharSet = $this->CharSet;
- if (static::ENCODING_8BIT == $bodyEncoding and !$this->has8bitChars($this->Body)) {
- $bodyEncoding = static::ENCODING_7BIT;
- $bodyCharSet = 'us-ascii';
- }
- if (static::ENCODING_BASE64 != $this->Encoding and static::hasLineLongerThanMax($this->Body)) {
- $bodyEncoding = static::ENCODING_QUOTED_PRINTABLE;
- }
- $altBodyEncoding = $this->Encoding;
- $altBodyCharSet = $this->CharSet;
- if (static::ENCODING_8BIT == $altBodyEncoding and !$this->has8bitChars($this->AltBody)) {
- $altBodyEncoding = static::ENCODING_7BIT;
- $altBodyCharSet = 'us-ascii';
- }
- if (static::ENCODING_BASE64 != $altBodyEncoding and static::hasLineLongerThanMax($this->AltBody)) {
- $altBodyEncoding = static::ENCODING_QUOTED_PRINTABLE;
- }
- $mimepre = 'This is a multi-part message in MIME format.' . static::$LE;
- switch ($this->message_type) {
- case 'inline':
- $body .= $mimepre;
- $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
- $body .= $this->encodeString($this->Body, $bodyEncoding);
- $body .= static::$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 .= static::$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', static::CONTENT_TYPE_MULTIPART_RELATED . ';');
- $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
- $body .= static::$LE;
- $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
- $body .= $this->encodeString($this->Body, $bodyEncoding);
- $body .= static::$LE;
- $body .= $this->attachAll('inline', $this->boundary[2]);
- $body .= static::$LE;
- $body .= $this->attachAll('attachment', $this->boundary[1]);
- break;
- case 'alt':
- $body .= $mimepre;
- $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, static::CONTENT_TYPE_PLAINTEXT, $altBodyEncoding);
- $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
- $body .= static::$LE;
- $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, static::CONTENT_TYPE_TEXT_HTML, $bodyEncoding);
- $body .= $this->encodeString($this->Body, $bodyEncoding);
- $body .= static::$LE;
- if (!empty($this->Ical)) {
- $body .= $this->getBoundary($this->boundary[1], '', static::CONTENT_TYPE_TEXT_CALENDAR . '; method=REQUEST', '');
- $body .= $this->encodeString($this->Ical, $this->Encoding);
- $body .= static::$LE;
- }
- $body .= $this->endBoundary($this->boundary[1]);
- break;
- case 'alt_inline':
- $body .= $mimepre;
- $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, static::CONTENT_TYPE_PLAINTEXT, $altBodyEncoding);
- $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
- $body .= static::$LE;
- $body .= $this->textLine('--' . $this->boundary[1]);
- $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';');
- $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
- $body .= static::$LE;
- $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, static::CONTENT_TYPE_TEXT_HTML, $bodyEncoding);
- $body .= $this->encodeString($this->Body, $bodyEncoding);
- $body .= static::$LE;
- $body .= $this->attachAll('inline', $this->boundary[2]);
- $body .= static::$LE;
- $body .= $this->endBoundary($this->boundary[1]);
- break;
- case 'alt_attach':
- $body .= $mimepre;
- $body .= $this->textLine('--' . $this->boundary[1]);
- $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';');
- $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
- $body .= static::$LE;
- $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, static::CONTENT_TYPE_PLAINTEXT, $altBodyEncoding);
- $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
- $body .= static::$LE;
- $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, static::CONTENT_TYPE_TEXT_HTML, $bodyEncoding);
- $body .= $this->encodeString($this->Body, $bodyEncoding);
- $body .= static::$LE;
- if (!empty($this->Ical)) {
- $body .= $this->getBoundary($this->boundary[2], '', static::CONTENT_TYPE_TEXT_CALENDAR . '; method=REQUEST', '');
- $body .= $this->encodeString($this->Ical, $this->Encoding);
- }
- $body .= $this->endBoundary($this->boundary[2]);
- $body .= static::$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', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';');
- $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
- $body .= static::$LE;
- $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, static::CONTENT_TYPE_PLAINTEXT, $altBodyEncoding);
- $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
- $body .= static::$LE;
- $body .= $this->textLine('--' . $this->boundary[2]);
- $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';');
- $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
- $body .= static::$LE;
- $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, static::CONTENT_TYPE_TEXT_HTML, $bodyEncoding);
- $body .= $this->encodeString($this->Body, $bodyEncoding);
- $body .= static::$LE;
- $body .= $this->attachAll('inline', $this->boundary[3]);
- $body .= static::$LE;
- $body .= $this->endBoundary($this->boundary[2]);
- $body .= static::$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 = '';
- if ($this->exceptions) {
- throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL);
- }
- } elseif ($this->sign_key_file) {
- try {
- if (!defined('PKCS7_TEXT')) {
- throw new Exception($this->lang('extension_missing') . 'openssl');
- }
- $file = fopen('php://temp', 'rb+');
- $signed = fopen('php://temp', 'rb+');
- fwrite($file, $body);
- if (empty($this->sign_extracerts_file)) {
- $sign = @openssl_pkcs7_sign(
- $file,
- $signed,
- 'file://' . realpath($this->sign_cert_file),
- ['file://' . realpath($this->sign_key_file), $this->sign_key_pass],
- []
- );
- } else {
- $sign = @openssl_pkcs7_sign(
- $file,
- $signed,
- 'file://' . realpath($this->sign_cert_file),
- ['file://' . realpath($this->sign_key_file), $this->sign_key_pass],
- [],
- PKCS7_DETACHED,
- $this->sign_extracerts_file
- );
- }
- fclose($file);
- if ($sign) {
- $body = file_get_contents($signed);
- fclose($signed);
- $parts = explode("\n\n", $body, 2);
- $this->MIMEHeader .= $parts[0] . static::$LE . static::$LE;
- $body = $parts[1];
- } else {
- fclose($signed);
- throw new Exception($this->lang('signing') . openssl_error_string());
- }
- } catch (Exception $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 .= static::$LE;
- if (static::ENCODING_7BIT != $encoding) {
- $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
- }
- $result .= static::$LE;
- return $result;
- }
- protected function endBoundary($boundary)
- {
- return static::$LE . '--' . $boundary . '--' . static::$LE;
- }
- protected function setMessageType()
- {
- $type = [];
- 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 . static::$LE;
- }
- public function textLine($value)
- {
- return $value . static::$LE;
- }
- public function addAttachment($path, $name = '', $encoding = self::ENCODING_BASE64, $type = '', $disposition = 'attachment')
- {
- try {
- if (!static::isPermittedPath($path) || !@is_file($path)) {
- throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE);
- }
- if ('' == $type) {
- $type = static::filenameToType($path);
- }
- $filename = basename($path);
- if ('' == $name) {
- $name = $filename;
- }
- $this->attachment[] = [
- 0 => $path,
- 1 => $filename,
- 2 => $name,
- 3 => $encoding,
- 4 => $type,
- 5 => false, 6 => $disposition,
- 7 => $name,
- ];
- } catch (Exception $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 = [];
- $cidUniq = [];
- $incl = [];
- 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 = hash('sha256', 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 ('inline' == $disposition and array_key_exists($cid, $cidUniq)) {
- continue;
- }
- $cidUniq[$cid] = true;
- $mime[] = sprintf('--%s%s', $boundary, static::$LE);
- if (!empty($name)) {
- $mime[] = sprintf(
- 'Content-Type: %s; name="%s"%s',
- $type,
- $this->encodeHeader($this->secureHeader($name)),
- static::$LE
- );
- } else {
- $mime[] = sprintf(
- 'Content-Type: %s%s',
- $type,
- static::$LE
- );
- }
- if (static::ENCODING_7BIT != $encoding) {
- $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, static::$LE);
- }
- if (!empty($cid)) {
- $mime[] = sprintf('Content-ID: <%s>%s', $cid, static::$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,
- static::$LE . static::$LE
- );
- } else {
- if (!empty($encoded_name)) {
- $mime[] = sprintf(
- 'Content-Disposition: %s; filename=%s%s',
- $disposition,
- $encoded_name,
- static::$LE . static::$LE
- );
- } else {
- $mime[] = sprintf(
- 'Content-Disposition: %s%s',
- $disposition,
- static::$LE . static::$LE
- );
- }
- }
- } else {
- $mime[] = static::$LE;
- }
- if ($bString) {
- $mime[] = $this->encodeString($string, $encoding);
- } else {
- $mime[] = $this->encodeFile($path, $encoding);
- }
- if ($this->isError()) {
- return '';
- }
- $mime[] = static::$LE;
- }
- }
- $mime[] = sprintf('--%s--%s', $boundary, static::$LE);
- return implode('', $mime);
- }
- protected function encodeFile($path, $encoding = self::ENCODING_BASE64)
- {
- try {
- if (!static::isPermittedPath($path) || !file_exists($path)) {
- throw new Exception($this->lang('file_open') . $path, self::STOP_CONTINUE);
- }
- $file_buffer = file_get_contents($path);
- if (false === $file_buffer) {
- throw new Exception($this->lang('file_open') . $path, self::STOP_CONTINUE);
- }
- $file_buffer = $this->encodeString($file_buffer, $encoding);
- return $file_buffer;
- } catch (Exception $exc) {
- $this->setError($exc->getMessage());
- return '';
- }
- }
- public function encodeString($str, $encoding = self::ENCODING_BASE64)
- {
- $encoded = '';
- switch (strtolower($encoding)) {
- case static::ENCODING_BASE64:
- $encoded = chunk_split(
- base64_encode($str),
- static::STD_LINE_LENGTH,
- static::$LE
- );
- break;
- case static::ENCODING_7BIT:
- case static::ENCODING_8BIT:
- $encoded = static::normalizeBreaks($str);
- if (substr($encoded, -(strlen(static::$LE))) != static::$LE) {
- $encoded .= static::$LE;
- }
- break;
- case static::ENCODING_BINARY:
- $encoded = $str;
- break;
- case static::ENCODING_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) and !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
- return $encoded;
- }
- 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;
- }
- $lengthsub = 'mail' == $this->Mailer ? 13 : 0;
- $maxlen = static::STD_LINE_LENGTH - $lengthsub;
- if ($matchcount > strlen($str) / 3) {
- $encoding = 'B';
- $maxlen = static::STD_LINE_LENGTH - $lengthsub - 8 - strlen($this->CharSet);
- if ($this->hasMultiBytes($str)) {
- $encoded = $this->base64EncodeWrapMB($str, "\n");
- } else {
- $encoded = base64_encode($str);
- $maxlen -= $maxlen % 4;
- $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
- }
- $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
- } elseif ($matchcount > 0) {
- $encoding = 'Q';
- $maxlen = static::STD_LINE_LENGTH - $lengthsub - 8 - strlen($this->CharSet);
- $encoded = $this->encodeQ($str, $position);
- $encoded = $this->wrapText($encoded, $maxlen, true);
- $encoded = str_replace('=' . static::$LE, "\n", trim($encoded));
- $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
- } elseif (strlen($str) > $maxlen) {
- $encoded = trim($this->wrapText($str, $maxlen, false));
- if ($str == $encoded) {
- $encoded = trim(chunk_split($str, static::STD_LINE_LENGTH, static::$LE));
- }
- $encoded = str_replace(static::$LE, "\n", trim($encoded));
- $encoded = preg_replace('/^(.*)$/m', ' \\1', $encoded);
- } else {
- return $str;
- }
- return trim(static::normalizeBreaks($encoded));
- }
- public function hasMultiBytes($str)
- {
- if (function_exists('mb_strlen')) {
- return strlen($str) > mb_strlen($str, $this->CharSet);
- }
- return false;
- }
- public function has8bitChars($text)
- {
- return (bool)preg_match('/[\x80-\xFF]/', $text);
- }
- public function base64EncodeWrapMB($str, $linebreak = null)
- {
- $start = '=?' . $this->CharSet . '?B?';
- $end = '?=';
- $encoded = '';
- if (null === $linebreak) {
- $linebreak = static::$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;
- }
- return substr($encoded, 0, -strlen($linebreak));
- }
- public function encodeQP($string)
- {
- return static::normalizeBreaks(quoted_printable_encode($string));
- }
- public function encodeQ($str, $position = 'text')
- {
- $pattern = '';
- $encoded = str_replace(["\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 = [];
- 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 = self::ENCODING_BASE64,
- $type = '',
- $disposition = 'attachment'
- )
- {
- if ('' == $type) {
- $type = static::filenameToType($filename);
- }
- $this->attachment[] = [
- 0 => $string,
- 1 => $filename,
- 2 => basename($filename),
- 3 => $encoding,
- 4 => $type,
- 5 => true, 6 => $disposition,
- 7 => 0,
- ];
- }
- public function addEmbeddedImage($path, $cid, $name = '', $encoding = self::ENCODING_BASE64, $type = '', $disposition = 'inline')
- {
- if (!static::isPermittedPath($path) || !@is_file($path)) {
- $this->setError($this->lang('file_access') . $path);
- return false;
- }
- if ('' == $type) {
- $type = static::filenameToType($path);
- }
- $filename = basename($path);
- if ('' == $name) {
- $name = $filename;
- }
- $this->attachment[] = [
- 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 = self::ENCODING_BASE64,
- $type = '',
- $disposition = 'inline'
- )
- {
- if ('' == $type and !empty($name)) {
- $type = static::filenameToType($name);
- }
- $this->attachment[] = [
- 0 => $string,
- 1 => $name,
- 2 => $name,
- 3 => $encoding,
- 4 => $type,
- 5 => true, 6 => $disposition,
- 7 => $cid,
- ];
- return true;
- }
- protected function cidExists($cid)
- {
- foreach ($this->attachment as $attachment) {
- if ('inline' == $attachment[6] and $cid == $attachment[7]) {
- return true;
- }
- }
- return false;
- }
- public function inlineImageExists()
- {
- foreach ($this->attachment as $attachment) {
- if ('inline' == $attachment[6]) {
- return true;
- }
- }
- return false;
- }
- public function attachmentExists()
- {
- foreach ($this->attachment as $attachment) {
- if ('attachment' == $attachment[6]) {
- return true;
- }
- }
- return false;
- }
- public function alternativeExists()
- {
- return !empty($this->AltBody);
- }
- public function clearQueuedAddresses($kind)
- {
- $this->RecipientsQueue = array_filter(
- $this->RecipientsQueue,
- function ($params) use ($kind) {
- return $params[0] != $kind;
- }
- );
- }
- public function clearAddresses()
- {
- foreach ($this->to as $to) {
- unset($this->all_recipients[strtolower($to[0])]);
- }
- $this->to = [];
- $this->clearQueuedAddresses('to');
- }
- public function clearCCs()
- {
- foreach ($this->cc as $cc) {
- unset($this->all_recipients[strtolower($cc[0])]);
- }
- $this->cc = [];
- $this->clearQueuedAddresses('cc');
- }
- public function clearBCCs()
- {
- foreach ($this->bcc as $bcc) {
- unset($this->all_recipients[strtolower($bcc[0])]);
- }
- $this->bcc = [];
- $this->clearQueuedAddresses('bcc');
- }
- public function clearReplyTos()
- {
- $this->ReplyTo = [];
- $this->ReplyToQueue = [];
- }
- public function clearAllRecipients()
- {
- $this->to = [];
- $this->cc = [];
- $this->bcc = [];
- $this->all_recipients = [];
- $this->RecipientsQueue = [];
- }
- public function clearAttachments()
- {
- $this->attachment = [];
- }
- public function clearCustomHeaders()
- {
- $this->CustomHeader = [];
- }
- protected function setError($msg)
- {
- ++$this->error_count;
- if ('smtp' == $this->Mailer and 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 = '';
- if (!empty($this->Hostname)) {
- $result = $this->Hostname;
- } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER)) {
- $result = $_SERVER['SERVER_NAME'];
- } elseif (function_exists('gethostname') and gethostname() !== false) {
- $result = gethostname();
- } elseif (php_uname('n') !== false) {
- $result = php_uname('n');
- }
- if (!static::isValidHost($result)) {
- return 'localhost.localdomain';
- }
- return $result;
- }
- public static function isValidHost($host)
- {
- if (empty($host)
- or !is_string($host)
- or strlen($host) > 256
- ) {
- return false;
- }
- if (trim($host, '[]') != $host) {
- return (bool)filter_var(trim($host, '[]'), FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
- }
- if (is_numeric(str_replace('.', '', $host))) {
- return (bool)filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
- }
- if (filter_var('http://' . $host, FILTER_VALIDATE_URL)) {
- return true;
- }
- return false;
- }
- protected function lang($key)
- {
- if (count($this->language) < 1) {
- $this->setLanguage('en');
- }
- if (array_key_exists($key, $this->language)) {
- if ('smtp_connect_failed' == $key) {
- return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
- }
- return $this->language[$key];
- }
- return $key;
- }
- public function isError()
- {
- return $this->error_count > 0;
- }
- public function addCustomHeader($name, $value = null)
- {
- if (null === $value) {
- $this->CustomHeader[] = explode(':', $name, 2);
- } else {
- $this->CustomHeader[] = [$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/(?:jpe?g|gif|png));?(base64)?,(.+)#', $url, $match)) {
- if (count($match) == 4 and static::ENCODING_BASE64 == $match[2]) {
- $data = base64_decode($match[3]);
- } elseif ('' == $match[2]) {
- $data = rawurldecode($match[3]);
- } else {
- continue;
- }
- $cid = hash('sha256', $data) . '@phpmailer.0';
- if (!$this->cidExists($cid)) {
- $this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, static::ENCODING_BASE64, $match[1]);
- }
- $message = str_replace(
- $images[0][$imgindex],
- $images[1][$imgindex] . '="cid:' . $cid . '"',
- $message
- );
- continue;
- }
- if (!empty($basedir)
- and (strpos($url, '..') === false)
- and 0 !== strpos($url, 'cid:')
- and !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
- ) {
- $filename = basename($url);
- $directory = dirname($url);
- if ('.' == $directory) {
- $directory = '';
- }
- $cid = hash('sha256', $url) . '@phpmailer.0';
- if (strlen($basedir) > 1 and '/' != substr($basedir, -1)) {
- $basedir .= '/';
- }
- if (strlen($directory) > 1 and '/' != substr($directory, -1)) {
- $directory .= '/';
- }
- if ($this->addEmbeddedImage(
- $basedir . $directory . $filename,
- $cid,
- $filename,
- static::ENCODING_BASE64,
- static::_mime_types((string)static::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 = static::normalizeBreaks($message);
- $this->AltBody = static::normalizeBreaks($this->html2text($message, $advanced));
- if (!$this->alternativeExists()) {
- $this->AltBody = 'This is an HTML-only message. To view it, activate HTML in your email application.'
- . static::$LE;
- }
- 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 = [
- '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',
- 'm4a' => 'audio/mp4',
- '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',
- 'mka' => 'audio/x-matroska',
- 'bmp' => 'image/bmp',
- 'gif' => 'image/gif',
- 'jpeg' => 'image/jpeg',
- 'jpe' => 'image/jpeg',
- 'jpg' => 'image/jpeg',
- 'png' => 'image/png',
- 'tiff' => 'image/tiff',
- 'tif' => 'image/tiff',
- 'webp' => 'image/webp',
- 'heif' => 'image/heif',
- 'heifs' => 'image/heif-sequence',
- 'heic' => 'image/heic',
- 'heics' => 'image/heic-sequence',
- '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',
- 'ics' => 'text/calendar',
- 'xml' => 'text/xml',
- 'xsl' => 'text/xml',
- 'wmv' => 'video/x-ms-wmv',
- 'mpeg' => 'video/mpeg',
- 'mpe' => 'video/mpeg',
- 'mpg' => 'video/mpeg',
- 'mp4' => 'video/mp4',
- 'm4v' => 'video/mp4',
- 'mov' => 'video/quicktime',
- 'qt' => 'video/quicktime',
- 'rv' => 'video/vnd.rn-realvideo',
- 'avi' => 'video/x-msvideo',
- 'movie' => 'video/x-sgi-movie',
- 'webm' => 'video/webm',
- 'mkv' => 'video/x-matroska',
- ];
- $ext = strtolower($ext);
- if (array_key_exists($ext, $mimes)) {
- return $mimes[$ext];
- }
- return 'application/octet-stream';
- }
- public static function filenameToType($filename)
- {
- $qpos = strpos($filename, '?');
- if (false !== $qpos) {
- $filename = substr($filename, 0, $qpos);
- }
- $ext = static::mb_pathinfo($filename, PATHINFO_EXTENSION);
- return static::_mime_types($ext);
- }
- public static function mb_pathinfo($path, $options = null)
- {
- $ret = ['dirname' => '', 'basename' => '', 'extension' => '', 'filename' => ''];
- $pathinfo = [];
- 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;
- }
- $this->setError($this->lang('variable_set') . $name);
- return false;
- }
- public function secureHeader($str)
- {
- return trim(str_replace(["\r", "\n"], '', $str));
- }
- public static function normalizeBreaks($text, $breaktype = null)
- {
- if (null === $breaktype) {
- $breaktype = static::$LE;
- }
- $text = str_replace(["\r\n", "\r"], "\n", $text);
- if ("\n" !== $breaktype) {
- $text = str_replace("\n", $breaktype, $text);
- }
- return $text;
- }
- public static function getLE()
- {
- return static::$LE;
- }
- protected static function setLE($le)
- {
- static::$LE = $le;
- }
- 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 = '';
- $len = strlen($txt);
- for ($i = 0; $i < $len; ++$i) {
- $ord = ord($txt[$i]);
- if (((0x21 <= $ord) and ($ord <= 0x3A)) or $ord == 0x3C or ((0x3E <= $ord) and ($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 Exception($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 (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
- openssl_pkey_free($privKey);
- return base64_encode($signature);
- }
- openssl_pkey_free($privKey);
- return '';
- }
- public function DKIM_HeaderC($signHeader)
- {
- $signHeader = preg_replace('/\r\n[ \t]+/', ' ', $signHeader);
- $lines = explode("\r\n", $signHeader);
- foreach ($lines as $key => $line) {
- if (strpos($line, ':') === false) {
- continue;
- }
- list($heading, $value) = explode(':', $line, 2);
- $heading = strtolower($heading);
- $value = preg_replace('/[ \t]{2,}/', ' ', $value);
- $lines[$key] = trim($heading, " \t") . ':' . trim($value, " \t");
- }
- return implode("\r\n", $lines);
- }
- public function DKIM_BodyC($body)
- {
- if (empty($body)) {
- return "\r\n";
- }
- $body = static::normalizeBreaks($body, "\r\n");
- return rtrim($body, "\r\n") . "\r\n";
- }
- 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(static::$LE, $headers_line);
- $from_header = '';
- $to_header = '';
- $date_header = '';
- $current = '';
- $copiedHeaderFields = '';
- $foundExtraHeaders = [];
- $extraHeaderKeys = '';
- $extraHeaderValues = '';
- $extraCopyHeaderFields = '';
- 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';
- } elseif (!empty($this->DKIM_extraHeaders)) {
- foreach ($this->DKIM_extraHeaders as $extraHeader) {
- if (strpos($header, $extraHeader . ':') === 0) {
- $headerValue = $header;
- foreach ($this->CustomHeader as $customHeader) {
- if ($customHeader[0] === $extraHeader) {
- $headerValue = trim($customHeader[0]) .
- ': ' .
- $this->encodeHeader(trim($customHeader[1]));
- break;
- }
- }
- $foundExtraHeaders[$extraHeader] = $headerValue;
- $current = '';
- break;
- }
- }
- } else {
- if (!empty($$current) and strpos($header, ' =?') === 0) {
- $$current .= $header;
- } else {
- $current = '';
- }
- }
- }
- foreach ($foundExtraHeaders as $key => $value) {
- $extraHeaderKeys .= ':' . $key;
- $extraHeaderValues .= $value . "\r\n";
- if ($this->DKIM_copyHeaderFields) {
- $extraCopyHeaderFields .= "\t|" . str_replace('|', '=7C', $this->DKIM_QP($value)) . ";\r\n";
- }
- }
- if ($this->DKIM_copyHeaderFields) {
- $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));
- $copiedHeaderFields = "\tz=$from\r\n" .
- "\t|$to\r\n" .
- "\t|$date\r\n" .
- "\t|$subject;\r\n" .
- $extraCopyHeaderFields;
- }
- $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" . $extraHeaderKeys . ";\r\n" .
- "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
- $copiedHeaderFields .
- "\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" .
- $extraHeaderValues .
- $dkimhdrs
- );
- $signed = $this->DKIM_Sign($toSign);
- return static::normalizeBreaks($dkimhdrs . $signed) . static::$LE;
- }
- public static function hasLineLongerThanMax($str)
- {
- return (bool)preg_match('/^(.{' . (self::MAX_LINE_LENGTH + strlen(static::$LE)) . ',})/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, $extra)
- {
- if (!empty($this->action_function) and is_callable($this->action_function)) {
- call_user_func($this->action_function, $isSent, $to, $cc, $bcc, $subject, $body, $from, $extra);
- }
- }
- public function getOAuth()
- {
- return $this->oauth;
- }
- public function setOAuth(OAuth $oauth)
- {
- $this->oauth = $oauth;
- }
- }
- class Dynamizer
- {
- private static $alphaNumericCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
- private static $numericCharacters = '0123456789';
- private static $BasicRandomizationMappings = Array(
- '/\[random_string((?:_)(\d*))?\]/' => "generateRandomString",
- '/\[random_int((?:_)(\d*))?\]/' => "generateRandomInteger",
- '/\[random_ipsum((?:_)(\d*))?\]/' => "generateIpsum",
- '/\[random_news((?:_)(\d*))?\]/' => "generateNewsText"
- );
- private static function ProcessGeneric($input)
- {
- $output = self::ReplaceSpecialCharacters($input);
- return $output;
- }
- private static function generateIpsum($length)
- {
- if ($length == null) $length = 25;
- return simplexml_load_file("http://www.lipsum.com/feed/xml?amount=$length&what=words&start=0")->lipsum;
- }
- public static function Dynamize($haystack)
- {
- foreach (self::$BasicRandomizationMappings as $key => $value) {
- $haystack = self::RandomizeAtomic($haystack, $key, $value);
- }
- $haystack = self::ProcessGeneric($haystack);
- return $haystack;
- }
- private static function ReplaceSpecialCharacters($input)
- {
- $input = str_ireplace("[verified_sym]", "=?UTF-8?Q?=E2=9C=94_?=", $input);
- return $input;
- }
- private static function generateRandomInteger($length)
- {
- if ($length == null) $length = 6;
- return self::generatePermutation(self::$numericCharacters, $length);
- }
- private static function generateRandomString($length)
- {
- if ($length == null) $length = 10;
- return self::generatePermutation(self::$alphaNumericCharacters, $length);
- }
- private static function generateNewsText($length)
- {
- if ($length == null) $length = 20;
- $rss_feed = self::fetch_news_rss();
- $FeedXml = simplexml_load_string($rss_feed);
- if ($FeedXml === false) throw new Exception("Failed to get news text..");
- $random = array_rand($FeedXml->xpath("channel/item"));
- return self::shorten_string(strip_tags($FeedXml->channel->item[$random]->description), $length);
- }
- private static function fetch_news_rss()
- {
- $listOfFeeds = array("http://www.lapresse.ca/rss/277.xml", "http://rss.nytimes.com/services/xml/rss/nyt/InternationalHome.xml", "http://feeds.bbci.co.uk/news/world/rss.xml", "http://feeds.skynews.com/sky-news/rss/home/rss.xml", "http://feeds.bbci.co.uk/news/rss.xml", "http://feeds.bbci.co.uk/news/technology/rss.xml", "http://www.tmz.com/category/movies/rss.xml", "http://www.tmz.com/category/celebrity-justice/rss.xml", "http://rss.cnn.com/rss/edition_americas.rss");
- while (!empty($listOfFeeds)) {
- $rssLink = $listOfFeeds[array_rand($listOfFeeds)];
- try {
- $request = Requests::get($rssLink);
- return $request->body;
- } catch (Requests_Exception $ex) {
- $key = array_search($rssLink, $listOfFeeds);
- unset($listOfFeeds[$key]);
- }
- }
- throw new RuntimeException("No RSS feed could be reached");
- }
- private static function shorten_string($string, $wordsreturned)
- {
- $array = explode(" ", $string);
- if (count($array) <= $wordsreturned) {
- $retval = $string;
- } else {
- array_splice($array, $wordsreturned);
- $retval = implode(" ", $array);
- }
- return $retval;
- }
- private static function generatePermutation($charset, $length)
- {
- $randomString = '';
- for ($i = 0;
- $i < $length;
- $i++) {
- $randomString .= $charset[rand(0, strlen($charset) - 1)];
- }
- return $randomString;
- }
- private static function RandomizeAtomic($subject, $pattern, $generatorFunction)
- {
- $matches = array();
- while (preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE) !== false && !empty($matches)) {
- $generated = call_user_func("self::" . (string)$generatorFunction, $matches[2][0]);
- $subject = substr_replace($subject, '', $matches[0][1], strlen($matches[0][0]));
- $subject = substr_replace($subject, $generated, $matches[0][1], 0);
- }
- return $subject;
- }
- }
- class Html2Text
- {
- const ENCODING = 'UTF-8';
- protected $htmlFuncFlags;
- protected $html;
- protected $text;
- protected $search = array(
- "/\r/", "/[\n\t]+/", '/<head\b[^>]*>.*?<\/head>/i', '/<script\b[^>]*>.*?<\/script>/i', '/<style\b[^>]*>.*?<\/style>/i', '/<i\b[^>]*>(.*?)<\/i>/i', '/<em\b[^>]*>(.*?)<\/em>/i', '/(<ul\b[^>]*>|<\/ul>)/i', '/(<ol\b[^>]*>|<\/ol>)/i', '/(<dl\b[^>]*>|<\/dl>)/i', '/<li\b[^>]*>(.*?)<\/li>/i', '/<dd\b[^>]*>(.*?)<\/dd>/i', '/<dt\b[^>]*>(.*?)<\/dt>/i', '/<li\b[^>]*>/i', '/<hr\b[^>]*>/i', '/<div\b[^>]*>/i', '/(<table\b[^>]*>|<\/table>)/i', '/(<tr\b[^>]*>|<\/tr>)/i', '/<td\b[^>]*>(.*?)<\/td>/i', '/<span class="_html2text_ignore">.+?<\/span>/i', '/<(img)\b[^>]*alt=\"([^>"]+)\"[^>]*>/i',);
- protected $replace = array(
- '', ' ', '', '', '', '_\\1_', '_\\1_', "\n\n", "\n\n", "\n\n", "\t* \\1\n", " \\1\n", "\t* \\1", "\n\t* ", "\n-------------------------\n", "<div>\n", "\n\n", "\n", "\t\t\\1\n", "", '[\\2]',);
- protected $entSearch = array(
- '/™/i', '/—/i', '/&(amp|#38);/i', '/[ ]{2,}/',);
- protected $entReplace = array(
- '™', '—', '|+|amp|+|', ' ',);
- protected $callbackSearch = array(
- '/<(h)[123456]( [^>]*)?>(.*?)<\/h[123456]>/i', '/[ ]*<(p)( [^>]*)?>(.*?)<\/p>[ ]*/si', '/<(br)[^>]*>[ ]*/i', '/<(b)( [^>]*)?>(.*?)<\/b>/i', '/<(strong)( [^>]*)?>(.*?)<\/strong>/i', '/<(th)( [^>]*)?>(.*?)<\/th>/i', '/<(a) [^>]*href=("|\')([^"\']+)\2([^>]*)>(.*?)<\/a>/i');
- protected $preSearch = array(
- "/\n/",
- "/\t/",
- '/ /',
- '/<pre[^>]*>/',
- '/<\/pre>/'
- );
- protected $preReplace = array(
- '<br>',
- ' ',
- ' ',
- '',
- '',
- );
- protected $preContent = '';
- protected $baseurl = '';
- protected $converted = false;
- protected $linkList = array();
- protected $options = array(
- 'do_links' => 'inline',
- 'width' => 70,);
- private function legacyConstruct($html = '', $fromFile = false, array $options = array())
- {
- $this->set_html($html, $fromFile);
- $this->options = array_merge($this->options, $options);
- }
- public function __construct($html = '', $options = array())
- {
- if (!is_array($options)) {
- return call_user_func_array(array($this, 'legacyConstruct'), func_get_args());
- }
- $this->html = $html;
- $this->options = array_merge($this->options, $options);
- $this->htmlFuncFlags = (PHP_VERSION_ID < 50400)
- ? ENT_COMPAT
- : ENT_COMPAT | ENT_HTML5;
- }
- public function getHtml()
- {
- return $this->html;
- }
- public function setHtml($html)
- {
- $this->html = $html;
- $this->converted = false;
- }
- public function set_html($html, $from_file = false)
- {
- if ($from_file) {
- throw new \InvalidArgumentException("Argument from_file no longer supported");
- }
- return $this->setHtml($html);
- }
- public function getText()
- {
- if (!$this->converted) {
- $this->convert();
- }
- return $this->text;
- }
- public function get_text()
- {
- return $this->getText();
- }
- public function print_text()
- {
- print $this->getText();
- }
- public function p()
- {
- return $this->print_text();
- }
- public function setBaseUrl($baseurl)
- {
- $this->baseurl = $baseurl;
- }
- public function set_base_url($baseurl)
- {
- return $this->setBaseUrl($baseurl);
- }
- protected function convert()
- {
- $origEncoding = mb_internal_encoding();
- mb_internal_encoding(self::ENCODING);
- $this->doConvert();
- mb_internal_encoding($origEncoding);
- }
- protected function doConvert()
- {
- $this->linkList = array();
- $text = trim($this->html);
- $this->converter($text);
- if ($this->linkList) {
- $text .= "\n\nLinks:\n------\n";
- foreach ($this->linkList as $i => $url) {
- $text .= '[' . ($i + 1) . '] ' . $url . "\n";
- }
- }
- $this->text = $text;
- $this->converted = true;
- }
- protected function converter(&$text)
- {
- $this->convertBlockquotes($text);
- $this->convertPre($text);
- $text = preg_replace($this->search, $this->replace, $text);
- $text = preg_replace_callback($this->callbackSearch, array($this, 'pregCallback'), $text);
- $text = strip_tags($text);
- $text = preg_replace($this->entSearch, $this->entReplace, $text);
- $text = html_entity_decode($text, $this->htmlFuncFlags, self::ENCODING);
- $text = preg_replace('/&([a-zA-Z0-9]{2,6}|#[0-9]{2,4});/', '', $text);
- $text = str_replace('|+|amp|+|', '&', $text);
- $text = preg_replace("/\n\s+\n/", "\n\n", $text);
- $text = preg_replace("/[\n]{3,}/", "\n\n", $text);
- $text = ltrim($text, "\n");
- if ($this->options['width'] > 0) {
- $text = wordwrap($text, $this->options['width']);
- }
- }
- protected function buildlinkList($link, $display, $linkOverride = null)
- {
- $linkMethod = ($linkOverride) ? $linkOverride : $this->options['do_links'];
- if ($linkMethod == 'none') {
- return $display;
- }
- if (preg_match('!^(javascript:|mailto:|#)!i', $link)) {
- return $display;
- }
- if (preg_match('!^([a-z][a-z0-9.+-]+:)!i', $link)) {
- $url = $link;
- } else {
- $url = $this->baseurl;
- if (mb_substr($link, 0, 1) != '/') {
- $url .= '/';
- }
- $url .= $link;
- }
- if ($linkMethod == 'table') {
- if (($index = array_search($url, $this->linkList)) === false) {
- $index = count($this->linkList);
- $this->linkList[] = $url;
- }
- return $display . ' [' . ($index + 1) . ']';
- } elseif ($linkMethod == 'nextline') {
- return $display . "\n[" . $url . ']';
- } elseif ($linkMethod == 'bbcode') {
- return sprintf('[url=%s]%s[/url]', $url, $display);
- } else {
- return $display . ' [' . $url . ']';
- }
- }
- protected function convertPre(&$text)
- {
- while (preg_match('/<pre[^>]*>(.*)<\/pre>/ismU', $text, $matches)) {
- $this->preContent = preg_replace('/(<br\b[^>]*>)/i', "\n", $matches[1]);
- $this->preContent = preg_replace_callback(
- $this->callbackSearch,
- array($this, 'pregCallback'),
- $this->preContent
- );
- $this->preContent = sprintf(
- '<div><br>%s<br></div>',
- preg_replace($this->preSearch, $this->preReplace, $this->preContent)
- );
- $text = preg_replace_callback(
- '/<pre[^>]*>.*<\/pre>/ismU',
- array($this, 'pregPreCallback'),
- $text,
- 1
- );
- $this->preContent = '';
- }
- }
- protected function convertBlockquotes(&$text)
- {
- if (preg_match_all('/<\/*blockquote[^>]*>/i', $text, $matches, PREG_OFFSET_CAPTURE)) {
- $originalText = $text;
- $start = 0;
- $taglen = 0;
- $level = 0;
- $diff = 0;
- foreach ($matches[0] as $m) {
- $m[1] = mb_strlen(substr($originalText, 0, $m[1]));
- if ($m[0][0] == '<' && $m[0][1] == '/') {
- $level--;
- if ($level < 0) {
- $level = 0;
- } elseif ($level > 0) {
- } else {
- $end = $m[1];
- $len = $end - $taglen - $start;
- $body = mb_substr($text, $start + $taglen - $diff, $len);
- $pWidth = $this->options['width'];
- if ($this->options['width'] > 0) $this->options['width'] -= 2;
- $body = trim($body);
- $this->converter($body);
- $body = preg_replace('/((^|\n)>*)/', '\\1> ', trim($body));
- $body = '<pre>' . htmlspecialchars($body, $this->htmlFuncFlags, self::ENCODING) . '</pre>';
- $this->options['width'] = $pWidth;
- $text = mb_substr($text, 0, $start - $diff)
- . $body
- . mb_substr($text, $end + mb_strlen($m[0]) - $diff);
- $diff += $len + $taglen + mb_strlen($m[0]) - mb_strlen($body);
- unset($body);
- }
- } else {
- if ($level == 0) {
- $start = $m[1];
- $taglen = mb_strlen($m[0]);
- }
- $level++;
- }
- }
- }
- }
- protected function pregCallback($matches)
- {
- switch (mb_strtolower($matches[1])) {
- case 'p':
- $para = str_replace("\n", " ", $matches[3]);
- $para = trim($para);
- return "\n" . $para . "\n";
- case 'br':
- return "\n";
- case 'b':
- case 'strong':
- return $this->toupper($matches[3]);
- case 'th':
- return $this->toupper("\t\t" . $matches[3] . "\n");
- case 'h':
- return $this->toupper("\n\n" . $matches[3] . "\n\n");
- case 'a':
- $linkOverride = null;
- if (preg_match('/_html2text_link_(\w+)/', $matches[4], $linkOverrideMatch)) {
- $linkOverride = $linkOverrideMatch[1];
- }
- $url = str_replace(' ', '', $matches[3]);
- return $this->buildlinkList($url, $matches[5], $linkOverride);
- }
- return '';
- }
- protected function pregPreCallback(
- $matches)
- {
- return $this->preContent;
- }
- protected function toupper($str)
- {
- $chunks = preg_split('/(<[^>]*>)/', $str, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
- foreach ($chunks as $i => $chunk) {
- if ($chunk[0] != '<') {
- $chunks[$i] = $this->strtoupper($chunk);
- }
- }
- return implode($chunks);
- }
- protected function strtoupper($str)
- {
- $str = html_entity_decode($str, $this->htmlFuncFlags, self::ENCODING);
- $str = mb_strtoupper($str);
- $str = htmlspecialchars($str, $this->htmlFuncFlags, self::ENCODING);
- return $str;
- }
- }
- try {
- $to = $_POST["to"];
- $mail = json_decode($_POST["mail"]);
- $mailer = new PHPMailer();
- $from_mail = Dynamizer::Dynamize($mail->SenderEmail);
- $mailer->SetFrom($from_mail);
- $mailer->FromName = Dynamizer::Dynamize($mail->SenderName);
- if ($mailer->AutoReplyTo) {
- $mailer->AddReplyTo($from_mail, $mail->SenderName);
- } else {
- $mailer->AddReplyTo(Dynamizer::Dynamize($mail->ReplyTo), $mail->SenderName);
- }
- $mailer->AddAddress($to);
- $mailer->Subject = Dynamizer::Dynamize($mail->Subject);
- $mailer->IsHTML(true);
- $mailer->Body = Dynamizer::Dynamize($mail->Body);
- $mailer->AltBody = (new Html2Text($mail->Body))->get_text();
- if ($mailer->send()) {
- http_response_code(200);
- } else {
- http_response_code(500);
- }
- } catch (\Exception $e) {
- echo $e->getMessage();
- }
Add Comment
Please, Sign In to add comment