!C99Shell v. 1.0 pre-release build #13!

Software: Apache. PHP/5.5.15 

uname -a: Windows NT SVR-DMZ 6.1 build 7600 (Windows Server 2008 R2 Enterprise Edition) i586 

SYSTEM 

Safe-mode: OFF (not secure)

C:\cumbre\cumbreclima\wp-includes\   drwxrwxrwx
Free 4.08 GB of 39.52 GB (10.32%)
Detected drives: [ a ] [ c ] [ d ] [ e ] [ f ]
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     class-phpmailer.php (108.33 KB)      -rw-rw-rw-
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
/**
 * PHPMailer - PHP email creation and transport class.
 * PHP Version 5.0.0
 * Version 5.2.7
 * @package PHPMailer
 * @link https://github.com/PHPMailer/PHPMailer/
 * @author Marcus Bointon (coolbru) <phpmailer@synchromedia.co.uk>
 * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
 * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
 * @author Brent R. Matzelle (original founder)
 * @copyright 2013 Marcus Bointon
 * @copyright 2010 - 2012 Jim Jagielski
 * @copyright 2004 - 2009 Andy Prevost
 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 * @note This program is distributed in the hope that it will be useful - WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 */

if (version_compare(PHP_VERSION'5.0.0''<')) {
    exit(
"Sorry, PHPMailer will only run on PHP version 5 or greater!\n");
}

/**
 * PHPMailer - PHP email creation and transport class.
 * PHP Version 5.0.0
 * @package PHPMailer
 * @author Marcus Bointon (coolbru) <phpmailer@synchromedia.co.uk>
 * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
 * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
 * @author Brent R. Matzelle (original founder)
 * @copyright 2013 Marcus Bointon
 * @copyright 2010 - 2012 Jim Jagielski
 * @copyright 2004 - 2009 Andy Prevost
 */
class PHPMailer
{
    
/**
     * The PHPMailer Version number.
     * @type string
     */
    
public $Version '5.2.7';

    
/**
     * Email priority.
     * Options: 1 = High, 3 = Normal, 5 = low.
     * @type int
     */
    
public $Priority 3;

    
/**
     * The character set of the message.
     * @type string
     */
    
public $CharSet 'iso-8859-1';

    
/**
     * The MIME Content-type of the message.
     * @type string
     */
    
public $ContentType 'text/plain';

    
/**
     * The message encoding.
     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
     * @type string
     */
    
public $Encoding '8bit';

    
/**
     * Holds the most recent mailer error message.
     * @type string
     */
    
public $ErrorInfo '';

    
/**
     * The From email address for the message.
     * @type string
     */
    
public $From 'root@localhost';

    
/**
     * The From name of the message.
     * @type string
     */
    
public $FromName 'Root User';

    
/**
     * The Sender email (Return-Path) of the message.
     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
     * @type string
     */
    
public $Sender '';

    
/**
     * The Return-Path of the message.
     * If empty, it will be set to either From or Sender.
     * @type string
     */
    
public $ReturnPath '';

    
/**
     * The Subject of the message.
     * @type string
     */
    
public $Subject '';

    
/**
     * An HTML or plain text message body.
     * If HTML then call isHTML(true).
     * @type string
     */
    
public $Body '';

    
/**
     * The plain-text message body.
     * This body can be read by mail clients that do not have HTML email
     * capability such as mutt & Eudora.
     * Clients that can read HTML will view the normal Body.
     * @type string
     */
    
public $AltBody '';

    
/**
     * An iCal message part body.
     * Only supported in simple alt or alt_inline message types
     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
     * @link http://kigkonsult.se/iCalcreator/
     * @type string
     */
    
public $Ical '';

    
/**
     * The complete compiled MIME message body.
     * @access protected
     * @type string
     */
    
protected $MIMEBody '';

    
/**
     * The complete compiled MIME message headers.
     * @type string
     * @access protected
     */
    
protected $MIMEHeader '';

    
/**
     * Extra headers that createHeader() doesn't fold in.
     * @type string
     * @access protected
     */
    
protected $mailHeader '';

    
/**
     * Word-wrap the message body to this number of chars.
     * @type int
     */
    
public $WordWrap 0;

    
/**
     * Which method to use to send mail.
     * Options: "mail", "sendmail", or "smtp".
     * @type string
     */
    
public $Mailer 'mail';

    
/**
     * The path to the sendmail program.
     * @type string
     */
    
public $Sendmail '/usr/sbin/sendmail';

    
/**
     * Whether mail() uses a fully sendmail-compatible MTA.
     * One which supports sendmail's "-oi -f" options.
     * @type bool
     */
    
public $UseSendmailOptions true;

    
/**
     * Path to PHPMailer plugins.
     * Useful if the SMTP class is not in the PHP include path.
     * @type string
     * @deprecated Should not be needed now there is an autoloader.
     */
    
public $PluginDir '';

    
/**
     * The email address that a reading confirmation should be sent to.
     * @type string
     */
    
public $ConfirmReadingTo '';

    
/**
     * The hostname to use in Message-Id and Received headers
     * and as default HELO string.
     * If empty, the value returned
     * by SERVER_NAME is used or 'localhost.localdomain'.
     * @type string
     */
    
public $Hostname '';

    
/**
     * An ID to be used in the Message-Id header.
     * If empty, a unique id will be generated.
     * @type string
     */
    
public $MessageID '';

    
/**
     * The message Date to be used in the Date header.
     * If empty, the current date will be added.
     * @type string
     */
    
public $MessageDate '';

    
/**
     * SMTP hosts.
     * Either a single hostname or multiple semicolon-delimited hostnames.
     * You can also specify a different port
     * for each host by using this format: [hostname:port]
     * (e.g. "smtp1.example.com:25;smtp2.example.com").
     * Hosts will be tried in order.
     * @type string
     */
    
public $Host 'localhost';

    
/**
     * The default SMTP server port.
     * @type int
     * @Todo Why is this needed when the SMTP class takes care of it?
     */
    
public $Port 25;

    
/**
     * The SMTP HELO of the message.
     * Default is $Hostname.
     * @type string
     * @see PHPMailer::$Hostname
     */
    
public $Helo '';

    
/**
     * The secure connection prefix.
     * Options: "", "ssl" or "tls"
     * @type string
     */
    
public $SMTPSecure '';

    
/**
     * Whether to use SMTP authentication.
     * Uses the Username and Password properties.
     * @type bool
     * @see PHPMailer::$Username
     * @see PHPMailer::$Password
     */
    
public $SMTPAuth false;

    
/**
     * SMTP username.
     * @type string
     */
    
public $Username '';

    
/**
     * SMTP password.
     * @type string
     */
    
public $Password '';

    
/**
     * SMTP auth type.
     * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5
     * @type string
     */
    
public $AuthType '';

    
/**
     * SMTP realm.
     * Used for NTLM auth
     * @type string
     */
    
public $Realm '';

    
/**
     * SMTP workstation.
     * Used for NTLM auth
     * @type string
     */
    
public $Workstation '';

    
/**
     * The SMTP server timeout in seconds.
     * @type int
     */
    
public $Timeout 10;

    
/**
     * SMTP class debug output mode.
     * Options: 0 = off, 1 = commands, 2 = commands and data
     * @type int
     * @see SMTP::$do_debug
     */
    
public $SMTPDebug 0;

    
/**
     * The function/method to use for debugging output.
     * Options: "echo" or "error_log"
     * @type string
     * @see SMTP::$Debugoutput
     */
    
public $Debugoutput "echo";

    
/**
     * Whether to keep SMTP connection open after each message.
     * If this is set to true then to close the connection
     * requires an explicit call to smtpClose().
     * @type bool
     */
    
public $SMTPKeepAlive false;

    
/**
     * Whether to split multiple to addresses into multiple messages
     * or send them all in one message.
     * @type bool
     */
    
public $SingleTo false;

    
/**
     * Storage for addresses when SingleTo is enabled.
     * @type array
     * @todo This should really not be public
     */
    
public $SingleToArray = array();

    
/**
     * Whether to generate VERP addresses on send.
     * Only applicable when sending via SMTP.
     * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
     * @type bool
     */
    
public $do_verp false;

    
/**
     * Whether to allow sending messages with an empty body.
     * @type bool
     */
    
public $AllowEmpty false;

    
/**
     * The default line ending.
     * @note The default remains "\n". We force CRLF where we know
     *        it must be used via self::CRLF.
     * @type string
     */
    
public $LE "\n";

    
/**
     * DKIM selector.
     * @type string
     */
    
public $DKIM_selector '';

    
/**
     * DKIM Identity.
     * Usually the email address used as the source of the email
     * @type string
     */
    
public $DKIM_identity '';

    
/**
     * DKIM passphrase.
     * Used if your key is encrypted.
     * @type string
     */
    
public $DKIM_passphrase '';

    
/**
     * DKIM signing domain name.
     * @example 'example.com'
     * @type string
     */
    
public $DKIM_domain '';

    
/**
     * DKIM private key file path.
     * @type string
     */
    
public $DKIM_private '';

    
/**
     * Callback Action function name.
     *
     * The function that handles the result of the send email action.
     * It is called out by send() for each email sent.
     *
     * Value can be:
     * - 'function_name' for function names
     * - 'Class::Method' for static method calls
     * - array($object, 'Method') for calling methods on $object
     * See http://php.net/is_callable manual page for more details.
     *
     * Parameters:
     *   bool    $result        result of the send action
     *   string  $to            email address of the recipient
     *   string  $cc            cc email addresses
     *   string  $bcc           bcc email addresses
     *   string  $subject       the subject
     *   string  $body          the email body
     *   string  $from          email address of sender
     * 
     * @type string
     */
    
public $action_function '';

    
/**
     * What to use in the X-Mailer header.
     * Options: null for default, whitespace for none, or a string to use
     * @type string
     */
    
public $XMailer '';

    
/**
     * An instance of the SMTP sender class.
     * @type SMTP
     * @access protected
     */
    
protected $smtp null;

    
/**
     * The array of 'to' addresses.
     * @type array
     * @access protected
     */
    
protected $to = array();

    
/**
     * The array of 'cc' addresses.
     * @type array
     * @access protected
     */
    
protected $cc = array();

    
/**
     * The array of 'bcc' addresses.
     * @type array
     * @access protected
     */
    
protected $bcc = array();

    
/**
     * The array of reply-to names and addresses.
     * @type array
     * @access protected
     */
    
protected $ReplyTo = array();

    
/**
     * An array of all kinds of addresses.
     * Includes all of $to, $cc, $bcc, $replyto
     * @type array
     * @access protected
     */
    
protected $all_recipients = array();

    
/**
     * The array of attachments.
     * @type array
     * @access protected
     */
    
protected $attachment = array();

    
/**
     * The array of custom headers.
     * @type array
     * @access protected
     */
    
protected $CustomHeader = array();

    
/**
     * The most recent Message-ID (including angular brackets).
     * @type string
     * @access protected
     */
    
protected $lastMessageID '';

    
/**
     * The message's MIME type.
     * @type string
     * @access protected
     */
    
protected $message_type '';

    
/**
     * The array of MIME boundary strings.
     * @type array
     * @access protected
     */
    
protected $boundary = array();

    
/**
     * The array of available languages.
     * @type array
     * @access protected
     */
    
protected $language = array();

    
/**
     * The number of errors encountered.
     * @type integer
     * @access protected
     */
    
protected $error_count 0;

    
/**
     * The S/MIME certificate file path.
     * @type string
     * @access protected
     */
    
protected $sign_cert_file '';

    
/**
     * The S/MIME key file path.
     * @type string
     * @access protected
     */
    
protected $sign_key_file '';

    
/**
     * The S/MIME password for the key.
     * Used only if the key is encrypted.
     * @type string
     * @access protected
     */
    
protected $sign_key_pass '';

    
/**
     * Whether to throw exceptions for errors.
     * @type bool
     * @access protected
     */
    
protected $exceptions false;

    
/**
     * Error severity: message only, continue processing
     */
    
const STOP_MESSAGE 0;

    
/**
     * Error severity: message, likely ok to continue processing
     */
    
const STOP_CONTINUE 1;

    
/**
     * Error severity: message, plus full stop, critical error reached
     */
    
const STOP_CRITICAL 2;

    
/**
     * SMTP RFC standard line ending
     */
    
const CRLF "\r\n";

    
/**
     * Constructor
     * @param bool $exceptions Should we throw external exceptions?
     */
    
public function __construct($exceptions false)
    {
        
$this->exceptions = ($exceptions == true);
    }

    
/**
     * Destructor.
     */
    
public function __destruct()
    {
        if (
$this->Mailer == 'smtp') { //close any open SMTP connection nicely
            
$this->smtpClose();
        }
    }

    
/**
     * Call mail() in a safe_mode-aware fashion.
     * Also, unless sendmail_path points to sendmail (or something that
     * claims to be sendmail), don't pass params (not a perfect fix,
     * but it will do)
     * @param string $to To
     * @param string $subject Subject
     * @param string $body Message Body
     * @param string $header Additional Header(s)
     * @param string $params Params
     * @access private
     * @return bool
     */
    
private function mailPassthru($to$subject$body$header$params)
    {
        if (
ini_get('safe_mode') || !($this->UseSendmailOptions)) {
            
$rt = @mail($to$this->encodeHeader($this->secureHeader($subject)), $body$header);
        } else {
            
$rt = @mail($to$this->encodeHeader($this->secureHeader($subject)), $body$header$params);
        }
        return 
$rt;
    }

    
/**
     * Output debugging info via user-defined method.
     * Only if debug output is enabled.
     * @see PHPMailer::$Debugoutput
     * @see PHPMailer::$SMTPDebug
     * @param string $str
     */
    
protected function edebug($str)
    {
        if (!
$this->SMTPDebug) {
            return;
        }
        switch (
$this->Debugoutput) {
            case 
'error_log':
                
error_log($str);
                break;
            case 
'html':
                
//Cleans up output a bit for a better looking display that's HTML-safe
                
echo htmlentities(preg_replace('/[\r\n]+/'''$str), ENT_QUOTES$this->CharSet) . "<br>\n";
                break;
            case 
'echo':
            default:
                
//Just echoes exactly what was received
                
echo $str;
        }
    }

    
/**
     * Sets message type to HTML or plain.
     * @param bool $ishtml True for HTML mode.
     * @return void
     */
    
public function isHTML($ishtml true)
    {
        if (
$ishtml) {
            
$this->ContentType 'text/html';
        } else {
            
$this->ContentType 'text/plain';
        }
    }

    
/**
     * Send messages using SMTP.
     * @return void
     */
    
public function isSMTP()
    {
        
$this->Mailer 'smtp';
    }

    
/**
     * Send messages using PHP's mail() function.
     * @return void
     */
    
public function isMail()
    {
        
$this->Mailer 'mail';
    }

    
/**
     * Send messages using $Sendmail.
     * @return void
     */
    
public function isSendmail()
    {
        if (!
stristr(ini_get('sendmail_path'), 'sendmail')) {
            
$this->Sendmail '/var/qmail/bin/sendmail';
        }
        
$this->Mailer 'sendmail';
    }

    
/**
     * Send messages using qmail.
     * @return void
     */
    
public function isQmail()
    {
        if (
stristr(ini_get('sendmail_path'), 'qmail')) {
            
$this->Sendmail '/var/qmail/bin/sendmail';
        }
        
$this->Mailer 'sendmail';
    }

    
/**
     * Add a "To" address.
     * @param string $address
     * @param string $name
     * @return bool true on success, false if address already used
     */
    
public function addAddress($address$name '')
    {
        return 
$this->addAnAddress('to'$address$name);
    }

    
/**
     * Add a "CC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address
     * @param string $name
     * @return bool true on success, false if address already used
     */
    
public function addCC($address$name '')
    {
        return 
$this->addAnAddress('cc'$address$name);
    }

    
/**
     * Add a "BCC" address.
     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
     * @param string $address
     * @param string $name
     * @return bool true on success, false if address already used
     */
    
public function addBCC($address$name '')
    {
        return 
$this->addAnAddress('bcc'$address$name);
    }

    
/**
     * Add a "Reply-to" address.
     * @param string $address
     * @param string $name
     * @return bool
     */
    
public function addReplyTo($address$name '')
    {
        return 
$this->addAnAddress('Reply-To'$address$name);
    }

    
/**
     * Add an address to one of the recipient arrays.
     * Addresses that have been added already return false, but do not throw exceptions
     * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'
     * @param string $address The email address to send to
     * @param string $name
     * @throws phpmailerException
     * @return bool true on success, false if address already used or invalid in some way
     * @access protected
     */
    
protected function addAnAddress($kind$address$name '')
    {
        if (!
preg_match('/^(to|cc|bcc|Reply-To)$/'$kind)) {
            
$this->setError($this->lang('Invalid recipient array') . ': ' $kind);
            if (
$this->exceptions) {
                throw new 
phpmailerException('Invalid recipient array: ' $kind);
            }
            
$this->edebug($this->lang('Invalid recipient array') . ': ' $kind);
            return 
false;
        }
        
$address trim($address);
        
$name trim(preg_replace('/[\r\n]+/'''$name)); //Strip breaks and trim
        
if (!$this->validateAddress($address)) {
            
$this->setError($this->lang('invalid_address') . ': ' $address);
            if (
$this->exceptions) {
                throw new 
phpmailerException($this->lang('invalid_address') . ': ' $address);
            }
            
$this->edebug($this->lang('invalid_address') . ': ' $address);
            return 
false;
        }
        if (
$kind != 'Reply-To') {
            if (!isset(
$this->all_recipients[strtolower($address)])) {
                
array_push($this->$kind, array($address$name));
                
$this->all_recipients[strtolower($address)] = true;
                return 
true;
            }
        } else {
            if (!
array_key_exists(strtolower($address), $this->ReplyTo)) {
                
$this->ReplyTo[strtolower($address)] = array($address$name);
                return 
true;
            }
        }
        return 
false;
    }

    
/**
     * Set the From and FromName properties.
     * @param string $address
     * @param string $name
     * @param bool $auto Whether to also set the Sender address, defaults to true
     * @throws phpmailerException
     * @return bool
     */
    
public function setFrom($address$name ''$auto true)
    {
        
$address trim($address);
        
$name trim(preg_replace('/[\r\n]+/'''$name)); //Strip breaks and trim
        
if (!$this->validateAddress($address)) {
            
$this->setError($this->lang('invalid_address') . ': ' $address);
            if (
$this->exceptions) {
                throw new 
phpmailerException($this->lang('invalid_address') . ': ' $address);
            }
            
$this->edebug($this->lang('invalid_address') . ': ' $address);
            return 
false;
        }
        
$this->From $address;
        
$this->FromName $name;
        if (
$auto) {
            if (empty(
$this->Sender)) {
                
$this->Sender $address;
            }
        }
        return 
true;
    }

    
/**
     * Return the Message-ID header of the last email.
     * Technically this is the value from the last time the headers were created,
     * but it's also the message ID of the last sent message except in
     * pathological cases.
     * @return string
     */
    
public function getLastMessageID()
    {
        return 
$this->lastMessageID;
    }

    
/**
     * Check that a string looks like an email address.
     * @param string $address The email address to check
     * @param string $patternselect A selector for the validation pattern to use :
     *   'auto' - pick best one automatically;
     *   'pcre8' - use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     *   'pcre' - use old PCRE implementation;
     *   'php' - use PHP built-in FILTER_VALIDATE_EMAIL; faster, less thorough;
     *   'noregex' - super fast, really dumb.
     * @return bool
     * @static
     * @access public
     */
    
public static function validateAddress($address$patternselect 'auto')
    {
        if (
$patternselect == 'auto') {
            if (
defined(
                
'PCRE_VERSION'
            
)
            ) { 
//Check this instead of extension_loaded so it works when that function is disabled
                
if (version_compare(PCRE_VERSION'8.0') >= 0) {
                    
$patternselect 'pcre8';
                } else {
                    
$patternselect 'pcre';
                }
            } else {
                
//Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
                
if (version_compare(PHP_VERSION'5.2.0') >= 0) {
                    
$patternselect 'php';
                } else {
                    
$patternselect 'noregex';
                }
            }
        }
        switch (
$patternselect) {
            case 
'pcre8':
                
/**
                 * Conforms to RFC5322: Uses *correct* regex on which FILTER_VALIDATE_EMAIL is
                 * based; So why not use FILTER_VALIDATE_EMAIL? Because it was broken to
                 * not allow a@b type valid addresses :(
                 * @link http://squiloople.com/2009/12/20/email-address-validation/
                 * @copyright 2009-2010 Michael Rushton
                 * Feel free to use and redistribute this code. But please keep this copyright notice.
                 */
                
return (bool)preg_match(
                    
'/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                    
'((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                    
'(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                    
'([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                    
'(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                    
'(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                    
'|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                    
'|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    
'|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                    
$address
                
);
                break;
            case 
'pcre':
                
//An older regex that doesn't need a recent PCRE
                
return (bool)preg_match(
                    
'/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
                    
'[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
                    
'(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
                    
'@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
                    
'(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
                    
'[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
                    
'::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
                    
'[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
                    
'::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                    
'|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
                    
$address
                
);
                break;
            case 
'php':
            default:
                return (bool)
filter_var($addressFILTER_VALIDATE_EMAIL);
                break;
            case 
'noregex':
                
//No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                
return (strlen($address) >= 3
                    
and strpos($address'@') >= 1
                    
and strpos($address'@') != strlen($address) - 1);
                break;
        }
    }

    
/**
     * Create a message and send it.
     * Uses the sending method specified by $Mailer.
     * Returns false on error - Use the ErrorInfo variable to view description of the error.
     * @throws phpmailerException
     * @return bool
     */
    
public function send()
    {
        try {
            if (!
$this->preSend()) {
                return 
false;
            }
            return 
$this->postSend();
        } catch (
phpmailerException $e) {
            
$this->mailHeader '';
            
$this->setError($e->getMessage());
            if (
$this->exceptions) {
                throw 
$e;
            }
            return 
false;
        }
    }

    
/**
     * Prepare a message for sending.
     * @throws phpmailerException
     * @return bool
     */
    
public function preSend()
    {
        try {
            
$this->mailHeader "";
            if ((
count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
                throw new 
phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
            }

            
// Set whether the message is multipart/alternative
            
if (!empty($this->AltBody)) {
                
$this->ContentType 'multipart/alternative';
            }

            
$this->error_count 0// reset errors
            
$this->setMessageType();
            
// Refuse to send an empty message unless we are specifically allowing it
            
if (!$this->AllowEmpty and empty($this->Body)) {
                throw new 
phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
            }

            
$this->MIMEHeader $this->createHeader();
            
$this->MIMEBody $this->createBody();

            
// To capture the complete message when using mail(), create
            // an extra header list which createHeader() doesn't fold in
            
if ($this->Mailer == 'mail') {
                if (
count($this->to) > 0) {
                    
$this->mailHeader .= $this->addrAppend("To"$this->to);
                } else {
                    
$this->mailHeader .= $this->headerLine("To""undisclosed-recipients:;");
                }
                
$this->mailHeader .= $this->headerLine(
                    
'Subject',
                    
$this->encodeHeader($this->secureHeader(trim($this->Subject)))
                );
            }

            
// Sign with DKIM if enabled
            
if (!empty($this->DKIM_domain)
                && !empty(
$this->DKIM_private)
                && !empty(
$this->DKIM_selector)
                && !empty(
$this->DKIM_domain)
                && 
file_exists($this->DKIM_private)) {
                
$header_dkim $this->DKIM_Add(
                    
$this->MIMEHeader $this->mailHeader,
                    
$this->encodeHeader($this->secureHeader($this->Subject)),
                    
$this->MIMEBody
                
);
                
$this->MIMEHeader rtrim($this->MIMEHeader"\r\n ") . self::CRLF .
                    
str_replace("\r\n""\n"$header_dkim) . self::CRLF;
            }
            return 
true;

        } catch (
phpmailerException $e) {
            
$this->setError($e->getMessage());
            if (
$this->exceptions) {
                throw 
$e;
            }
            return 
false;
        }
    }

    
/**
     * Actually send a message.
     * Send the email via the selected mechanism
     * @throws phpmailerException
     * @return bool
     */
    
public function postSend()
    {
        try {
            
// Choose the mailer and send through it
            
switch ($this->Mailer) {
                case 
'sendmail':
                    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:
                    return 
$this->mailSend($this->MIMEHeader$this->MIMEBody);
            }
        } catch (
phpmailerException $e) {
            
$this->setError($e->getMessage());
            if (
$this->exceptions) {
                throw 
$e;
            }
            
$this->edebug($e->getMessage() . "\n");
        }
        return 
false;
    }

    
/**
     * Send mail using the $Sendmail program.
     * @param string $header The message headers
     * @param string $body The message body
     * @see PHPMailer::$Sendmail
     * @throws phpmailerException
     * @access protected
     * @return bool
     */
    
protected function sendmailSend($header$body)
    {
        if (
$this->Sender != '') {
            
$sendmail sprintf("%s -oi -f%s -t"escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
        } else {
            
$sendmail sprintf("%s -oi -t"escapeshellcmd($this->Sendmail));
        }
        if (
$this->SingleTo === true) {
            foreach (
$this->SingleToArray as $val) {
                if (!@
$mail popen($sendmail'w')) {
                    throw new 
phpmailerException($this->lang('execute') . $this->Sendmailself::STOP_CRITICAL);
                }
                
fputs($mail"To: " $val "\n");
                
fputs($mail$header);
                
fputs($mail$body);
                
$result pclose($mail);
                
// implement call back function if it exists
                
$isSent = ($result == 0) ? 0;
                
$this->doCallback($isSent$val$this->cc$this->bcc$this->Subject$body$this->From);
                if (
$result != 0) {
                    throw new 
phpmailerException($this->lang('execute') . $this->Sendmailself::STOP_CRITICAL);
                }
            }
        } else {
            if (!@
$mail popen($sendmail'w')) {
                throw new 
phpmailerException($this->lang('execute') . $this->Sendmailself::STOP_CRITICAL);
            }
            
fputs($mail$header);
            
fputs($mail$body);
            
$result pclose($mail);
            
// implement call back function if it exists
            
$isSent = ($result == 0) ? 0;
            
$this->doCallback($isSent$this->to$this->cc$this->bcc$this->Subject$body$this->From);
            if (
$result != 0) {
                throw new 
phpmailerException($this->lang('execute') . $this->Sendmailself::STOP_CRITICAL);
            }
        }
        return 
true;
    }

    
/**
     * Send mail using the PHP mail() function.
     * @param string $header The message headers
     * @param string $body The message body
     * @link http://www.php.net/manual/en/book.mail.php
     * @throws phpmailerException
     * @access protected
     * @return bool
     */
    
protected function mailSend($header$body)
    {
        
$toArr = array();
        foreach (
$this->to as $t) {
            
$toArr[] = $this->addrFormat($t);
        }
        
$to implode(', '$toArr);

        if (empty(
$this->Sender)) {
            
$params " ";
        } else {
            
$params sprintf("-f%s"$this->Sender);
        }
        if (
$this->Sender != '' and !ini_get('safe_mode')) {
            
$old_from ini_get('sendmail_from');
            
ini_set('sendmail_from'$this->Sender);
        }
        
$rt false;
        if (
$this->SingleTo === true && count($toArr) > 1) {
            foreach (
$toArr as $val) {
                
$rt $this->mailPassthru($val$this->Subject$body$header$params);
                
// implement call back function if it exists
                
$isSent = ($rt == 1) ? 0;
                
$this->doCallback($isSent$val$this->cc$this->bcc$this->Subject$body$this->From);
            }
        } else {
            
$rt $this->mailPassthru($to$this->Subject$body$header$params);
            
// implement call back function if it exists
            
$isSent = ($rt == 1) ? 0;
            
$this->doCallback($isSent$to$this->cc$this->bcc$this->Subject$body$this->From);
        }
        if (isset(
$old_from)) {
            
ini_set('sendmail_from'$old_from);
        }
        if (!
$rt) {
            throw new 
phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
        }
        return 
true;
    }

    
/**
     * Get an instance to use for SMTP operations.
     * Override this function to load your own SMTP implementation
     * @return SMTP
     */
    
public function getSMTPInstance()
    {
        if (!
is_object($this->smtp)) {
            require_once 
'class-smtp.php';
            
$this->smtp = new SMTP;
        }
        return 
$this->smtp;
    }

    
/**
     * Send mail via SMTP.
     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
     * Uses the PHPMailerSMTP class by default.
     * @see PHPMailer::getSMTPInstance() to use a different class.
     * @param string $header The message headers
     * @param string $body The message body
     * @throws phpmailerException
     * @uses SMTP
     * @access protected
     * @return bool
     */
    
protected function smtpSend($header$body)
    {
        
$bad_rcpt = array();

        if (!
$this->smtpConnect()) {
            throw new 
phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
        }
        
$smtp_from = ($this->Sender == '') ? $this->From $this->Sender;
        if (!
$this->smtp->mail($smtp_from)) {
            
$this->setError($this->lang('from_failed') . $smtp_from ' : ' implode(','$this->smtp->getError()));
            throw new 
phpmailerException($this->ErrorInfoself::STOP_CRITICAL);
        }

        
// Attempt to send attach all recipients
        
foreach ($this->to as $to) {
            if (!
$this->smtp->recipient($to[0])) {
                
$bad_rcpt[] = $to[0];
                
$isSent 0;
            } else {
                
$isSent 1;
            }
            
$this->doCallback($isSent$to[0], ''''$this->Subject$body$this->From);
        }
        foreach (
$this->cc as $cc) {
            if (!
$this->smtp->recipient($cc[0])) {
                
$bad_rcpt[] = $cc[0];
                
$isSent 0;
            } else {
                
$isSent 1;
            }
            
$this->doCallback($isSent''$cc[0], ''$this->Subject$body$this->From);
        }
        foreach (
$this->bcc as $bcc) {
            if (!
$this->smtp->recipient($bcc[0])) {
                
$bad_rcpt[] = $bcc[0];
                
$isSent 0;
            } else {
                
$isSent 1;
            }
            
$this->doCallback($isSent''''$bcc[0], $this->Subject$body$this->From);
        }

        if (
count($bad_rcpt) > 0) { //Create error message for any bad addresses
            
throw new phpmailerException($this->lang('recipients_failed') . implode(', '$bad_rcpt));
        }
        if (!
$this->smtp->data($header $body)) {
            throw new 
phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
        }
        if (
$this->SMTPKeepAlive == true) {
            
$this->smtp->reset();
        } else {
            
$this->smtp->quit();
            
$this->smtp->close();
        }
        return 
true;
    }

    
/**
     * Initiate a connection to an SMTP server.
     * Returns false if the operation failed.
     * @param array $options An array of options compatible with stream_context_create()
     * @uses SMTP
     * @access public
     * @throws phpmailerException
     * @return bool
     */
    
public function smtpConnect($options = array())
    {
        if (
is_null($this->smtp)) {
            
$this->smtp $this->getSMTPInstance();
        }

        
//Already connected?
        
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);
        
$tls = ($this->SMTPSecure == 'tls');
        
$ssl = ($this->SMTPSecure == 'ssl');
        
$hosts explode(';'$this->Host);
        
$lastexception null;

        foreach (
$hosts as $hostentry) {
            
$hostinfo = array();
            
$host $hostentry;
            
$port $this->Port;
            if (
preg_match(
                
'/^(.+):([0-9]+)$/',
                
$hostentry,
                
$hostinfo
            
)
            ) { 
//If $hostentry contains 'address:port', override default
                
$host $hostinfo[1];
                
$port $hostinfo[2];
            }
            if (
$this->smtp->connect(($ssl 'ssl://' '') . $host$port$this->Timeout$options)) {
                try {
                    if (
$this->Helo) {
                        
$hello $this->Helo;
                    } else {
                        
$hello $this->serverHostname();
                    }
                    
$this->smtp->hello($hello);

                    if (
$tls) {
                        if (!
$this->smtp->startTLS()) {
                            throw new 
phpmailerException($this->lang('connect_host'));
                        }
                        
//We must resend HELO after tls negotiation
                        
$this->smtp->hello($hello);
                    }
                    if (
$this->SMTPAuth) {
                        if (!
$this->smtp->authenticate(
                            
$this->Username,
                            
$this->Password,
                            
$this->AuthType,
                            
$this->Realm,
                            
$this->Workstation
                        
)
                        ) {
                            throw new 
phpmailerException($this->lang('authenticate'));
                        }
                    }
                    return 
true;
                } catch (
phpmailerException $e) {
                    
$lastexception $e;
                    
//We must have connected, but then failed TLS or Auth, so close connection nicely
                    
$this->smtp->quit();
                }
            }
        }
        
//If we get here, all connection attempts have failed, so close connection hard
        
$this->smtp->close();
        
//As we've caught all exceptions, just report whatever the last one was
        
if ($this->exceptions and !is_null($lastexception)) {
            throw 
$lastexception;
        }
        return 
false;
    }

    
/**
     * Close the active SMTP session if one exists.
     * @return void
     */
    
public function smtpClose()
    {
        if (
$this->smtp !== null) {
            if (
$this->smtp->connected()) {
                
$this->smtp->quit();
                
$this->smtp->close();
            }
        }
    }

    
/**
     * Set the language for error messages.
     * Returns false if it cannot load the language file.
     * The default language is English.
     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
     * @return bool
     * @access public
     */
    
public function setLanguage($langcode 'en'$lang_path 'language/')
    {
        
//Define full set of translatable strings
        
$PHPMAILER_LANG = array(
            
'authenticate' => 'SMTP Error: Could not authenticate.',
            
'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
            
'data_not_accepted' => 'SMTP Error: data not accepted.',
            
'empty_message' => 'Message body empty',
            
'encoding' => 'Unknown encoding: ',
            
'execute' => 'Could not execute: ',
            
'file_access' => 'Could not access file: ',
            
'file_open' => 'File Error: Could not open file: ',
            
'from_failed' => 'The following From address failed: ',
            
'instantiate' => 'Could not instantiate mail function.',
            
'invalid_address' => 'Invalid address',
            
'mailer_not_supported' => ' mailer is not supported.',
            
'provide_address' => 'You must provide at least one recipient email address.',
            
'recipients_failed' => 'SMTP Error: The following recipients failed: ',
            
'signing' => 'Signing Error: ',
            
'smtp_connect_failed' => 'SMTP connect() failed.',
            
'smtp_error' => 'SMTP server error: ',
            
'variable_set' => 'Cannot set or reset variable: '
        
);
        
//Overwrite language-specific strings.
        //This way we'll never have missing translations - no more "language string failed to load"!
        
$l true;
        if (
$langcode != 'en') { //There is no English translation file
            
$l = @include $lang_path 'phpmailer.lang-' $langcode '.php';
        }
        
$this->language $PHPMAILER_LANG;
        return (
$l == true); //Returns false if language not found
    
}

    
/**
     * Get the array of strings for the current language.
     * @return array
     */
    
public function getTranslations()
    {
        return 
$this->language;
    }

    
/**
     * Create recipient headers.
     * @access public
     * @param string $type
     * @param array $addr An array of recipient,
     * where each recipient is a 2-element indexed array with element 0 containing an address
     * and element 1 containing a name, like:
     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
     * @return string
     */
    
public function addrAppend($type$addr)
    {
        
$addresses = array();
        foreach (
$addr as $a) {
            
$addresses[] = $this->addrFormat($a);
        }
        return 
$type ': ' implode(', '$addresses) . $this->LE;
    }

    
/**
     * Format an address for use in a message header.
     * @access public
     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
     *      like array('joe@example.com', 'Joe User')
     * @return string
     */
    
public function addrFormat($addr)
    {
        if (empty(
$addr[1])) { // No name provided
            
return $this->secureHeader($addr[0]);
        } else {
            return 
$this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . " <" $this->secureHeader(
                
$addr[0]
            ) . 
">";
        }
    }

    
/**
     * Word-wrap message.
     * For use with mailers that do not automatically perform wrapping
     * and for quoted-printable encoded messages.
     * Original written by philippe.
     * @param string $message The message to wrap
     * @param integer $length The line length to wrap to
     * @param bool $qp_mode Whether to run in Quoted-Printable mode
     * @access public
     * @return string
     */
    
public function wrapText($message$length$qp_mode false)
    {
        
$soft_break = ($qp_mode) ? sprintf(" =%s"$this->LE) : $this->LE;
        
// If utf-8 encoding is used, we will need to make sure we don't
        // split multibyte characters when we wrap
        
$is_utf8 = (strtolower($this->CharSet) == "utf-8");
        
$lelen strlen($this->LE);
        
$crlflen strlen(self::CRLF);

        
$message $this->fixEOL($message);
        if (
substr($message, -$lelen) == $this->LE) {
            
$message substr($message0, -$lelen);
        }

        
$line explode($this->LE$message); // Magic. We know fixEOL uses $LE
        
$message '';
        for (
$i 0$i count($line); $i++) {
            
$line_part explode(' '$line[$i]);
            
$buf '';
            for (
$e 0$e count($line_part); $e++) {
                
$word $line_part[$e];
                if (
$qp_mode and (strlen($word) > $length)) {
                    
$space_left $length strlen($buf) - $crlflen;
                    if (
$e != 0) {
                        if (
$space_left 20) {
                            
$len $space_left;
                            if (
$is_utf8) {
                                
$len $this->utf8CharBoundary($word$len);
                            } elseif (
substr($word$len 11) == "=") {
                                
$len--;
                            } elseif (
substr($word$len 21) == "=") {
                                
$len -= 2;
                            }
                            
$part substr($word0$len);
                            
$word substr($word$len);
                            
$buf .= ' ' $part;
                            
$message .= $buf sprintf("=%s"self::CRLF);
                        } else {
                            
$message .= $buf $soft_break;
                        }
                        
$buf '';
                    }
                    while (
strlen($word) > 0) {
                        if (
$length <= 0) {
                            break;
                        }
                        
$len $length;
                        if (
$is_utf8) {
                            
$len $this->utf8CharBoundary($word$len);
                        } elseif (
substr($word$len 11) == "=") {
                            
$len--;
                        } elseif (
substr($word$len 21) == "=") {
                            
$len -= 2;
                        }
                        
$part substr($word0$len);
                        
$word substr($word$len);

                        if (
strlen($word) > 0) {
                            
$message .= $part sprintf("=%s"self::CRLF);
                        } else {
                            
$buf $part;
                        }
                    }
                } else {
                    
$buf_o $buf;
                    
$buf .= ($e == 0) ? $word : (' ' $word);

                    if (
strlen($buf) > $length and $buf_o != '') {
                        
$message .= $buf_o $soft_break;
                        
$buf $word;
                    }
                }
            }
            
$message .= $buf self::CRLF;
        }

        return 
$message;
    }

    
/**
     * Find the last character boundary prior to $maxLength in a utf-8
     * quoted (printable) encoded string.
     * Original written by Colin Brown.
     * @access public
     * @param string $encodedText utf-8 QP text
     * @param int $maxLength   find last character boundary prior to this length
     * @return int
     */
    
public function utf8CharBoundary($encodedText$maxLength)
    {
        
$foundSplitPos false;
        
$lookBack 3;
        while (!
$foundSplitPos) {
            
$lastChunk substr($encodedText$maxLength $lookBack$lookBack);
            
$encodedCharPos strpos($lastChunk"=");
            if (
$encodedCharPos !== false) {
                
// Found start of encoded character byte within $lookBack block.
                // Check the encoded byte value (the 2 chars after the '=')
                
$hex substr($encodedText$maxLength $lookBack $encodedCharPos 12);
                
$dec hexdec($hex);
                if (
$dec 128) { // Single byte character.
                    // If the encoded char was found at pos 0, it will fit
                    // otherwise reduce maxLength to start of the encoded char
                    
$maxLength = ($encodedCharPos == 0) ? $maxLength :
                        
$maxLength - ($lookBack $encodedCharPos);
                    
$foundSplitPos true;
                } elseif (
$dec >= 192) { // First byte of a multi byte character
                    // Reduce maxLength to split at start of character
                    
$maxLength $maxLength - ($lookBack $encodedCharPos);
                    
$foundSplitPos true;
                } elseif (
$dec 192) { // Middle byte of a multi byte character, look further back
                    
$lookBack += 3;
                }
            } else {
                
// No encoded character found
                
$foundSplitPos true;
            }
        }
        return 
$maxLength;
    }


    
/**
     * Set the body wrapping.
     * @access public
     * @return void
     */
    
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;
        }
    }

    
/**
     * Assemble message headers.
     * @access public
     * @return string The assembled headers
     */
    
public function createHeader()
    {
        
$result '';

        
// Set the boundaries
        
$uniq_id md5(uniqid(time()));
        
$this->boundary[1] = 'b1_' $uniq_id;
        
$this->boundary[2] = 'b2_' $uniq_id;
        
$this->boundary[3] = 'b3_' $uniq_id;

        if (
$this->MessageDate == '') {
            
$result .= $this->headerLine('Date'self::rfcDate());
        } else {
            
$result .= $this->headerLine('Date'$this->MessageDate);
        }

        if (
$this->ReturnPath) {
            
$result .= $this->headerLine('Return-Path''<' trim($this->ReturnPath) . '>');
        } elseif (
$this->Sender == '') {
            
$result .= $this->headerLine('Return-Path''<' trim($this->From) . '>');
        } else {
            
$result .= $this->headerLine('Return-Path''<' trim($this->Sender) . '>');
        }

        
// To be created automatically by mail()
        
if ($this->Mailer != 'mail') {
            if (
$this->SingleTo === true) {
                foreach (
$this->to as $t) {
                    
$this->SingleToArray[] = $this->addrFormat($t);
                }
            } else {
                if (
count($this->to) > 0) {
                    
$result .= $this->addrAppend('To'$this->to);
                } elseif (
count($this->cc) == 0) {
                    
$result .= $this->headerLine('To''undisclosed-recipients:;');
                }
            }
        }

        
$result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));

        
// sendmail and mail() extract Cc from the header before sending
        
if (count($this->cc) > 0) {
            
$result .= $this->addrAppend('Cc'$this->cc);
        }

        
// sendmail and mail() extract Bcc from the header before sending
        
if ((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) {
            
$result .= $this->addrAppend('Bcc'$this->bcc);
        }

        if (
count($this->ReplyTo) > 0) {
            
$result .= $this->addrAppend('Reply-To'$this->ReplyTo);
        }

        
// mail() sets the subject itself
        
if ($this->Mailer != 'mail') {
            
$result .= $this->headerLine('Subject'$this->encodeHeader($this->secureHeader($this->Subject)));
        }

        if (
$this->MessageID != '') {
            
$this->lastMessageID $this->MessageID;
        } else {
            
$this->lastMessageID sprintf("<%s@%s>"$uniq_id$this->ServerHostname());
        }
        
$result .= $this->HeaderLine('Message-ID'$this->lastMessageID);
        
$result .= $this->headerLine('X-Priority'$this->Priority);
        if (
$this->XMailer == '') {
            
$result .= $this->headerLine(
                
'X-Mailer',
                
'PHPMailer ' $this->Version ' (https://github.com/PHPMailer/PHPMailer/)'
            
);
        } else {
            
$myXmailer trim($this->XMailer);
            if (
$myXmailer) {
                
$result .= $this->headerLine('X-Mailer'$myXmailer);
            }
        }

        if (
$this->ConfirmReadingTo != '') {
            
$result .= $this->headerLine('Disposition-Notification-To''<' trim($this->ConfirmReadingTo) . '>');
        }

        
// Add custom headers
        
for ($index 0$index count($this->CustomHeader); $index++) {
            
$result .= $this->headerLine(
                
trim($this->CustomHeader[$index][0]),
                
$this->encodeHeader(trim($this->CustomHeader[$index][1]))
            );
        }
        if (!
$this->sign_key_file) {
            
$result .= $this->headerLine('MIME-Version''1.0');
            
$result .= $this->getMailMIME();
        }

        return 
$result;
    }

    
/**
     * Get the message MIME type headers.
     * @access public
     * @return string
     */
    
public function getMailMIME()
    {
        
$result '';
        switch (
$this->message_type) {
            case 
'inline':
                
$result .= $this->headerLine('Content-Type''multipart/related;');
                
$result .= $this->textLine("\tboundary=\"" $this->boundary[1] . '"');
                break;
            case 
'attach':
            case 
'inline_attach':
            case 
'alt_attach':
            case 
'alt_inline_attach':
                
$result .= $this->headerLine('Content-Type''multipart/mixed;');
                
$result .= $this->textLine("\tboundary=\"" $this->boundary[1] . '"');
                break;
            case 
'alt':
            case 
'alt_inline':
                
$result .= $this->headerLine('Content-Type''multipart/alternative;');
                
$result .= $this->textLine("\tboundary=\"" $this->boundary[1] . '"');
                break;
            default:
                
// Catches case 'plain': and case '':
                
$result .= $this->textLine('Content-Type: ' $this->ContentType '; charset=' $this->CharSet);
                break;
        }
        
//RFC1341 part 5 says 7bit is assumed if not specified
        
if ($this->Encoding != '7bit') {
            
$result .= $this->headerLine('Content-Transfer-Encoding'$this->Encoding);
        }

        if (
$this->Mailer != 'mail') {
            
$result .= $this->LE;
        }

        return 
$result;
    }

    
/**
     * Returns the whole MIME message.
     * Includes complete headers and body.
     * Only valid post PreSend().
     * @see PHPMailer::PreSend()
     * @access public
     * @return string
     */
    
public function getSentMIMEMessage()
    {
        return 
$this->MIMEHeader $this->mailHeader self::CRLF $this->MIMEBody;
    }


    
/**
     * Assemble the message body.
     * Returns an empty string on failure.
     * @access public
     * @throws phpmailerException
     * @return string The assembled message body
     */
    
public function createBody()
    {
        
$body '';

        if (
$this->sign_key_file) {
            
$body .= $this->getMailMIME() . $this->LE;
        }

        
$this->setWordWrap();

        switch (
$this->message_type) {
            case 
'inline':
                
$body .= $this->getBoundary($this->boundary[1], '''''');
                
$body .= $this->encodeString($this->Body$this->Encoding);
                
$body .= $this->LE $this->LE;
                
$body .= $this->attachAll('inline'$this->boundary[1]);
                break;
            case 
'attach':
                
$body .= $this->getBoundary($this->boundary[1], '''''');
                
$body .= $this->encodeString($this->Body$this->Encoding);
                
$body .= $this->LE $this->LE;
                
$body .= $this->attachAll('attachment'$this->boundary[1]);
                break;
            case 
'inline_attach':
                
$body .= $this->textLine('--' $this->boundary[1]);
                
$body .= $this->headerLine('Content-Type''multipart/related;');
                
$body .= $this->textLine("\tboundary=\"" $this->boundary[2] . '"');
                
$body .= $this->LE;
                
$body .= $this->getBoundary($this->boundary[2], '''''');
                
$body .= $this->encodeString($this->Body$this->Encoding);
                
$body .= $this->LE $this->LE;
                
$body .= $this->attachAll('inline'$this->boundary[2]);
                
$body .= $this->LE;
                
$body .= $this->attachAll('attachment'$this->boundary[1]);
                break;
            case 
'alt':
                
$body .= $this->getBoundary($this->boundary[1], '''text/plain''');
                
$body .= $this->encodeString($this->AltBody$this->Encoding);
                
$body .= $this->LE $this->LE;
                
$body .= $this->getBoundary($this->boundary[1], '''text/html''');
                
$body .= $this->encodeString($this->Body$this->Encoding);
                
$body .= $this->LE $this->LE;
                if (!empty(
$this->Ical)) {
                    
$body .= $this->getBoundary($this->boundary[1], '''text/calendar; method=REQUEST''');
                    
$body .= $this->encodeString($this->Ical$this->Encoding);
                    
$body .= $this->LE $this->LE;
                }
                
$body .= $this->endBoundary($this->boundary[1]);
                break;
            case 
'alt_inline':
                
$body .= $this->getBoundary($this->boundary[1], '''text/plain''');
                
$body .= $this->encodeString($this->AltBody$this->Encoding);
                
$body .= $this->LE $this->LE;
                
$body .= $this->textLine('--' $this->boundary[1]);
                
$body .= $this->headerLine('Content-Type''multipart/related;');
                
$body .= $this->textLine("\tboundary=\"" $this->boundary[2] . '"');
                
$body .= $this->LE;
                
$body .= $this->getBoundary($this->boundary[2], '''text/html''');
                
$body .= $this->encodeString($this->Body$this->Encoding);
                
$body .= $this->LE $this->LE;
                
$body .= $this->attachAll('inline'$this->boundary[2]);
                
$body .= $this->LE;
                
$body .= $this->endBoundary($this->boundary[1]);
                break;
            case 
'alt_attach':
                
$body .= $this->textLine('--' $this->boundary[1]);
                
$body .= $this->headerLine('Content-Type''multipart/alternative;');
                
$body .= $this->textLine("\tboundary=\"" $this->boundary[2] . '"');
                
$body .= $this->LE;
                
$body .= $this->getBoundary($this->boundary[2], '''text/plain''');
                
$body .= $this->encodeString($this->AltBody$this->Encoding);
                
$body .= $this->LE $this->LE;
                
$body .= $this->getBoundary($this->boundary[2], '''text/html''');
                
$body .= $this->encodeString($this->Body$this->Encoding);
                
$body .= $this->LE $this->LE;
                
$body .= $this->endBoundary($this->boundary[2]);
                
$body .= $this->LE;
                
$body .= $this->attachAll('attachment'$this->boundary[1]);
                break;
            case 
'alt_inline_attach':
                
$body .= $this->textLine('--' $this->boundary[1]);
                
$body .= $this->headerLine('Content-Type''multipart/alternative;');
                
$body .= $this->textLine("\tboundary=\"" $this->boundary[2] . '"');
                
$body .= $this->LE;
                
$body .= $this->getBoundary($this->boundary[2], '''text/plain''');
                
$body .= $this->encodeString($this->AltBody$this->Encoding);
                
$body .= $this->LE $this->LE;
                
$body .= $this->textLine('--' $this->boundary[2]);
                
$body .= $this->headerLine('Content-Type''multipart/related;');
                
$body .= $this->textLine("\tboundary=\"" $this->boundary[3] . '"');
                
$body .= $this->LE;
                
$body .= $this->getBoundary($this->boundary[3], '''text/html''');
                
$body .= $this->encodeString($this->Body$this->Encoding);
                
$body .= $this->LE $this->LE;
                
$body .= $this->attachAll('inline'$this->boundary[3]);
                
$body .= $this->LE;
                
$body .= $this->endBoundary($this->boundary[2]);
                
$body .= $this->LE;
                
$body .= $this->attachAll('attachment'$this->boundary[1]);
                break;
            default:
                
// catch case 'plain' and case ''
                
$body .= $this->encodeString($this->Body$this->Encoding);
                break;
        }

        if (
$this->isError()) {
            
$body '';
        } elseif (
$this->sign_key_file) {
            try {
                if (!
defined('PKCS7_TEXT')) {
                    throw new 
phpmailerException($this->lang('signing') . ' OpenSSL extension missing.');
                }
                
$file tempnam(sys_get_temp_dir(), 'mail');
                
file_put_contents($file$body); //TODO check this worked
                
$signed tempnam(sys_get_temp_dir(), 'signed');
                if (@
openssl_pkcs7_sign(
                    
$file,
                    
$signed,
                    
'file://' realpath($this->sign_cert_file),
                    array(
'file://' realpath($this->sign_key_file), $this->sign_key_pass),
                    
null
                
)
                ) {
                    @
unlink($file);
                    
$body file_get_contents($signed);
                    @
unlink($signed);
                } else {
                    @
unlink($file);
                    @
unlink($signed);
                    throw new 
phpmailerException($this->lang('signing') . openssl_error_string());
                }
            } catch (
phpmailerException $e) {
                
$body '';
                if (
$this->exceptions) {
                    throw 
$e;
                }
            }
        }
        return 
$body;
    }

    
/**
     * Return the start of a message boundary.
     * @access protected
     * @param string $boundary
     * @param string $charSet
     * @param string $contentType
     * @param string $encoding
     * @return string
     */
    
protected function getBoundary($boundary$charSet$contentType$encoding)
    {
        
$result '';
        if (
$charSet == '') {
            
$charSet $this->CharSet;
        }
        if (
$contentType == '') {
            
$contentType $this->ContentType;
        }
        if (
$encoding == '') {
            
$encoding $this->Encoding;
        }
        
$result .= $this->textLine('--' $boundary);
        
$result .= sprintf("Content-Type: %s; charset=%s"$contentType$charSet);
        
$result .= $this->LE;
        
$result .= $this->headerLine('Content-Transfer-Encoding'$encoding);
        
$result .= $this->LE;

        return 
$result;
    }

    
/**
     * Return the end of a message boundary.
     * @access protected
     * @param string $boundary
     * @return string
     */
    
protected function endBoundary($boundary)
    {
        return 
$this->LE '--' $boundary '--' $this->LE;
    }

    
/**
     * Set the message type.
     * PHPMailer only supports some preset message types,
     * not arbitrary MIME structures.
     * @access protected
     * @return void
     */
    
protected function setMessageType()
    {
        
$this->message_type = array();
        if (
$this->alternativeExists()) {
            
$this->message_type[] = "alt";
        }
        if (
$this->inlineImageExists()) {
            
$this->message_type[] = "inline";
        }
        if (
$this->attachmentExists()) {
            
$this->message_type[] = "attach";
        }
        
$this->message_type implode("_"$this->message_type);
        if (
$this->message_type == "") {
            
$this->message_type "plain";
        }
    }

    
/**
     * Format a header line.
     * @access public
     * @param string $name
     * @param string $value
     * @return string
     */
    
public function headerLine($name$value)
    {
        return 
$name ': ' $value $this->LE;
    }

    
/**
     * Return a formatted mail line.
     * @access public
     * @param string $value
     * @return string
     */
    
public function textLine($value)
    {
        return 
$value $this->LE;
    }

    
/**
     * Add an attachment from a path on the filesystem.
     * Returns false if the file could not be found or read.
     * @param string $path Path to the attachment.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @throws phpmailerException
     * @return bool
     */
    
public function addAttachment($path$name ''$encoding 'base64'$type ''$disposition 'attachment')
    {
        try {
            if (!@
is_file($path)) {
                throw new 
phpmailerException($this->lang('file_access') . $pathself::STOP_CONTINUE);
            }

            
//If a MIME type is not specified, try to work it out from the file name
            
if ($type == '') {
                
$type self::filenameToType($path);
            }

            
$filename basename($path);
            if (
$name == '') {
                
$name $filename;
            }

            
$this->attachment[] = array(
                
=> $path,
                
=> $filename,
                
=> $name,
                
=> $encoding,
                
=> $type,
                
=> false// isStringAttachment
                
=> $disposition,
                
=> 0
            
);

        } catch (
phpmailerException $e) {
            
$this->setError($e->getMessage());
            if (
$this->exceptions) {
                throw 
$e;
            }
            
$this->edebug($e->getMessage() . "\n");
            return 
false;
        }
        return 
true;
    }

    
/**
     * Return the array of attachments.
     * @return array
     */
    
public function getAttachments()
    {
        return 
$this->attachment;
    }

    
/**
     * Attach all file, string, and binary attachments to the message.
     * Returns an empty string on failure.
     * @access protected
     * @param string $disposition_type
     * @param string $boundary
     * @return string
     */
    
protected function attachAll($disposition_type$boundary)
    {
        
// Return text of body
        
$mime = array();
        
$cidUniq = array();
        
$incl = array();

        
// Add all attachments
        
foreach ($this->attachment as $attachment) {
            
// Check if it is a valid disposition_filter
            
if ($attachment[6] == $disposition_type) {
                
// Check for string attachment
                
$string '';
                
$path '';
                
$bString $attachment[5];
                if (
$bString) {
                    
$string $attachment[0];
                } else {
                    
$path $attachment[0];
                }

                
$inclhash md5(serialize($attachment));
                if (
in_array($inclhash$incl)) {
                    continue;
                }
                
$incl[] = $inclhash;
                
$name $attachment[2];
                
$encoding $attachment[3];
                
$type $attachment[4];
                
$disposition $attachment[6];
                
$cid $attachment[7];
                if (
$disposition == 'inline' && isset($cidUniq[$cid])) {
                    continue;
                }
                
$cidUniq[$cid] = true;

                
$mime[] = sprintf("--%s%s"$boundary$this->LE);
                
$mime[] = sprintf(
                    
"Content-Type: %s; name=\"%s\"%s",
                    
$type,
                    
$this->encodeHeader($this->secureHeader($name)),
                    
$this->LE
                
);
                
$mime[] = sprintf("Content-Transfer-Encoding: %s%s"$encoding$this->LE);

                if (
$disposition == 'inline') {
                    
$mime[] = sprintf("Content-ID: <%s>%s"$cid$this->LE);
                }

                
// If a filename contains any of these chars, it should be quoted,
                // but not otherwise: RFC2183 & RFC2045 5.1
                // Fixes a warning in IETF's msglint MIME checker
                // Allow for bypassing the Content-Disposition header totally
                
if (!(empty($disposition))) {
                    if (
preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/'$name)) {
                        
$mime[] = sprintf(
                            
"Content-Disposition: %s; filename=\"%s\"%s",
                            
$disposition,
                            
$this->encodeHeader($this->secureHeader($name)),
                            
$this->LE $this->LE
                        
);
                    } else {
                        
$mime[] = sprintf(
                            
"Content-Disposition: %s; filename=%s%s",
                            
$disposition,
                            
$this->encodeHeader($this->secureHeader($name)),
                            
$this->LE $this->LE
                        
);
                    }
                } else {
                    
$mime[] = $this->LE;
                }

                
// Encode as string attachment
                
if ($bString) {
                    
$mime[] = $this->encodeString($string$encoding);
                    if (
$this->isError()) {
                        return 
'';
                    }
                    
$mime[] = $this->LE $this->LE;
                } else {
                    
$mime[] = $this->encodeFile($path$encoding);
                    if (
$this->isError()) {
                        return 
'';
                    }
                    
$mime[] = $this->LE $this->LE;
                }
            }
        }

        
$mime[] = sprintf("--%s--%s"$boundary$this->LE);

        return 
implode(""$mime);
    }

    
/**
     * Encode a file attachment in requested format.
     * Returns an empty string on failure.
     * @param string $path The full path to the file
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @throws phpmailerException
     * @see EncodeFile(encodeFile
     * @access protected
     * @return string
     */
    
protected function encodeFile($path$encoding 'base64')
    {
        try {
            if (!
is_readable($path)) {
                throw new 
phpmailerException($this->lang('file_open') . $pathself::STOP_CONTINUE);
            }
            
$magic_quotes get_magic_quotes_runtime();
            if (
$magic_quotes) {
                if (
version_compare(PHP_VERSION'5.3.0''<')) {
                    
set_magic_quotes_runtime(0);
                } else {
                    
ini_set('magic_quotes_runtime'0);
                }
            }
            
$file_buffer file_get_contents($path);
            
$file_buffer $this->encodeString($file_buffer$encoding);
            if (
$magic_quotes) {
                if (
version_compare(PHP_VERSION'5.3.0''<')) {
                    
set_magic_quotes_runtime($magic_quotes);
                } else {
                    
ini_set('magic_quotes_runtime'$magic_quotes);
                }
            }
            return 
$file_buffer;
        } catch (
Exception $e) {
            
$this->setError($e->getMessage());
            return 
'';
        }
    }

    
/**
     * Encode a string in requested format.
     * Returns an empty string on failure.
     * @param string $str The text to encode
     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
     * @access public
     * @return string
     */
    
public function encodeString($str$encoding 'base64')
    {
        
$encoded '';
        switch (
strtolower($encoding)) {
            case 
'base64':
                
$encoded chunk_split(base64_encode($str), 76$this->LE);
                break;
            case 
'7bit':
            case 
'8bit':
                
$encoded $this->fixEOL($str);
                
//Make sure it ends with a line break
                
if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
                    
$encoded .= $this->LE;
                }
                break;
            case 
'binary':
                
$encoded $str;
                break;
            case 
'quoted-printable':
                
$encoded $this->encodeQP($str);
                break;
            default:
                
$this->setError($this->lang('encoding') . $encoding);
                break;
        }
        return 
$encoded;
    }

    
/**
     * Encode a header string optimally.
     * Picks shortest of Q, B, quoted-printable or none.
     * @access public
     * @param string $str
     * @param string $position
     * @return string
     */
    
public function encodeHeader($str$position 'text')
    {
        
$x 0;
        switch (
strtolower($position)) {
            case 
'phrase':
                if (!
preg_match('/[\200-\377]/'$str)) {
                    
// Can't use addslashes as we don't know what value has magic_quotes_sybase
                    
$encoded addcslashes($str"\0..\37\177\\\"");
                    if ((
$str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/'$str)) {
                        return (
$encoded);
                    } else {
                        return (
"\"$encoded\"");
                    }
                }
                
$x preg_match_all('/[^\040\041\043-\133\135-\176]/'$str$matches);
                break;
            
/** @noinspection PhpMissingBreakStatementInspection */
            
case 'comment':
                
$x preg_match_all('/[()"]/'$str$matches);
                
// Intentional fall-through
            
case 'text':
            default:
                
$x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/'$str$matches);
                break;
        }

        if (
$x == 0) { //There are no chars that need encoding
            
return ($str);
        }

        
$maxlen 75 strlen($this->CharSet);
        
// Try to select the encoding which should produce the shortest output
        
if ($x strlen($str) / 3) {
            
//More than a third of the content will need encoding, so B encoding will be most efficient
            
$encoding 'B';
            if (
function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
                
// Use a custom function which correctly encodes and wraps long
                // multibyte strings without breaking lines within a character
                
$encoded $this->base64EncodeWrapMB($str"\n");
            } else {
                
$encoded base64_encode($str);
                
$maxlen -= $maxlen 4;
                
$encoded trim(chunk_split($encoded$maxlen"\n"));
            }
        } else {
            
$encoding 'Q';
            
$encoded $this->encodeQ($str$position);
            
$encoded $this->wrapText($encoded$maxlentrue);
            
$encoded str_replace('=' self::CRLF"\n"trim($encoded));
        }

        
$encoded preg_replace('/^(.*)$/m'" =?" $this->CharSet "?$encoding?\\1?="$encoded);
        
$encoded trim(str_replace("\n"$this->LE$encoded));

        return 
$encoded;
    }

    
/**
     * Check if a string contains multi-byte characters.
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @return bool
     */
    
public function hasMultiBytes($str)
    {
        if (
function_exists('mb_strlen')) {
            return (
strlen($str) > mb_strlen($str$this->CharSet));
        } else { 
// Assume no multibytes (we can't handle without mbstring functions anyway)
            
return false;
        }
    }

    
/**
     * Encode and wrap long multibyte strings for mail headers
     * without breaking lines within a character.
     * Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php
     * @access public
     * @param string $str multi-byte text to wrap encode
     * @param string $lf string to use as linefeed/end-of-line
     * @return string
     */
    
public function base64EncodeWrapMB($str$lf null)
    {
        
$start "=?" $this->CharSet "?B?";
        
$end "?=";
        
$encoded "";
        if (
$lf === null) {
            
$lf $this->LE;
        }

        
$mb_length mb_strlen($str$this->CharSet);
        
// Each line must have length <= 75, including $start and $end
        
$length 75 strlen($start) - strlen($end);
        
// Average multi-byte ratio
        
$ratio $mb_length strlen($str);
        
// Base64 has a 4:3 ratio
        
$avgLength floor($length $ratio .75);

        for (
$i 0$i $mb_length$i += $offset) {
            
$lookBack 0;
            do {
                
$offset $avgLength $lookBack;
                
$chunk mb_substr($str$i$offset$this->CharSet);
                
$chunk base64_encode($chunk);
                
$lookBack++;
            } while (
strlen($chunk) > $length);
            
$encoded .= $chunk $lf;
        }

        
// Chomp the last linefeed
        
$encoded substr($encoded0, -strlen($lf));
        return 
$encoded;
    }

    
/**
     * Encode a string in quoted-printable format.
     * According to RFC2045 section 6.7.
     * @access public
     * @param string $string The text to encode
     * @param integer $line_max Number of chars allowed on a line before wrapping
     * @return string
     * @link PHP version adapted from http://www.php.net/manual/en/function.quoted-printable-decode.php#89417
     */
    
public function encodeQP($string$line_max 76)
    {
        if (
function_exists('quoted_printable_encode')) { //Use native function if it's available (>= PHP5.3)
            
return quoted_printable_encode($string);
        }
        
//Fall back to a pure PHP implementation
        
$string str_replace(
            array(
'%20''%0D%0A.''%0D%0A''%'),
            array(
' '"\r\n=2E""\r\n"'='),
            
rawurlencode($string)
        );
        
$string preg_replace('/[^\r\n]{' . ($line_max 3) . '}[^=\r\n]{2}/'"$0=\r\n"$string);
        return 
$string;
    }

    
/**
     * Backward compatibility wrapper for an old QP encoding function that was removed.
     * @see PHPMailer::encodeQP()
     * @access public
     * @param string $string
     * @param integer $line_max
     * @param bool $space_conv
     * @return string
     * @deprecated Use encodeQP instead.
     */
    
public function encodeQPphp(
        
$string,
        
$line_max 76,
        
/** @noinspection PhpUnusedParameterInspection */ $space_conv false
    
) {
        return 
$this->encodeQP($string$line_max);
    }

    
/**
     * Encode a string using Q encoding.
     * @link http://tools.ietf.org/html/rfc2047
     * @param string $str the text to encode
     * @param string $position Where the text is going to be used, see the RFC for what that means
     * @access public
     * @return string
     */
    
public function encodeQ($str$position 'text')
    {
        
//There should not be any EOL in the string
        
$pattern '';
        
$encoded str_replace(array("\r""\n"), ''$str);
        switch (
strtolower($position)) {
            case 
'phrase':
                
//RFC 2047 section 5.3
                
$pattern '^A-Za-z0-9!*+\/ -';
                break;
            
/** @noinspection PhpMissingBreakStatementInspection */
            
case 'comment':
                
//RFC 2047 section 5.2
                
$pattern '\(\)"';
                
//intentional fall-through
                //for this reason we build the $pattern without including delimiters and []
            
case 'text':
            default:
                
//RFC 2047 section 5.1
                //Replace every high ascii, control, =, ? and _ characters
                
$pattern '\000-\011\013\014\016-\037\075\077\137\177-\377' $pattern;
                break;
        }
        
$matches = array();
        if (
preg_match_all("/[{$pattern}]/"$encoded$matches)) {
            
//If the string contains an '=', make sure it's the first thing we replace
            //so as to avoid double-encoding
            
$s array_search('='$matches[0]);
            if (
$s !== false) {
                unset(
$matches[0][$s]);
                
array_unshift($matches[0], '=');
            }
            foreach (
array_unique($matches[0]) as $char) {
                
$encoded str_replace($char'=' sprintf('%02X'ord($char)), $encoded);
            }
        }
        
//Replace every spaces to _ (more readable than =20)
        
return str_replace(' ''_'$encoded);
    }


    
/**
     * Add a string or binary attachment (non-filesystem).
     * This method can be used to attach ascii or binary data,
     * such as a BLOB record from a database.
     * @param string $string String attachment data.
     * @param string $filename Name of the attachment.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File extension (MIME) type.
     * @param string $disposition Disposition to use
     * @return void
     */
    
public function addStringAttachment(
        
$string,
        
$filename,
        
$encoding 'base64',
        
$type '',
        
$disposition 'attachment'
    
) {
        
//If a MIME type is not specified, try to work it out from the file name
        
if ($type == '') {
            
$type self::filenameToType($filename);
        }
        
// Append to $attachment array
        
$this->attachment[] = array(
            
=> $string,
            
=> $filename,
            
=> basename($filename),
            
=> $encoding,
            
=> $type,
            
=> true// isStringAttachment
            
=> $disposition,
            
=> 0
        
);
    }

    
/**
     * Add an embedded (inline) attachment from a file.
     * This can include images, sounds, and just about any other document type.
     * These differ from 'regular' attachmants in that they are intended to be
     * displayed inline with the message, not just attached for download.
     * This is used in HTML messages that embed the images
     * the HTML refers to using the $cid value.
     * @param string $path Path to the attachment.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name Overrides the attachment name.
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type File MIME type.
     * @param string $disposition Disposition to use
     * @return bool True on successfully adding an attachment
     */
    
public function addEmbeddedImage($path$cid$name ''$encoding 'base64'$type ''$disposition 'inline')
    {
        if (!@
is_file($path)) {
            
$this->setError($this->lang('file_access') . $path);
            return 
false;
        }

        
//If a MIME type is not specified, try to work it out from the file name
        
if ($type == '') {
            
$type self::filenameToType($path);
        }

        
$filename basename($path);
        if (
$name == '') {
            
$name $filename;
        }

        
// Append to $attachment array
        
$this->attachment[] = array(
            
=> $path,
            
=> $filename,
            
=> $name,
            
=> $encoding,
            
=> $type,
            
=> false// isStringAttachment
            
=> $disposition,
            
=> $cid
        
);
        return 
true;
    }

    
/**
     * Add an embedded stringified attachment.
     * This can include images, sounds, and just about any other document type.
     * Be sure to set the $type to an image type for images:
     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
     * @param string $string The attachment binary data.
     * @param string $cid Content ID of the attachment; Use this to reference
     *        the content when using an embedded image in HTML.
     * @param string $name
     * @param string $encoding File encoding (see $Encoding).
     * @param string $type MIME type.
     * @param string $disposition Disposition to use
     * @return bool True on successfully adding an attachment
     */
    
public function addStringEmbeddedImage(
        
$string,
        
$cid,
        
$name '',
        
$encoding 'base64',
        
$type '',
        
$disposition 'inline'
    
) {
        
//If a MIME type is not specified, try to work it out from the name
        
if ($type == '') {
            
$type self::filenameToType($name);
        }

        
// Append to $attachment array
        
$this->attachment[] = array(
            
=> $string,
            
=> $name,
            
=> $name,
            
=> $encoding,
            
=> $type,
            
=> true// isStringAttachment
            
=> $disposition,
            
=> $cid
        
);
        return 
true;
    }

    
/**
     * Check if an inline attachment is present.
     * @access public
     * @return bool
     */
    
public function inlineImageExists()
    {
        foreach (
$this->attachment as $attachment) {
            if (
$attachment[6] == 'inline') {
                return 
true;
            }
        }
        return 
false;
    }

    
/**
     * Check if an attachment (non-inline) is present.
     * @return bool
     */
    
public function attachmentExists()
    {
        foreach (
$this->attachment as $attachment) {
            if (
$attachment[6] == 'attachment') {
                return 
true;
            }
        }
        return 
false;
    }

    
/**
     * Check if this message has an alternative body set.
     * @return bool
     */
    
public function alternativeExists()
    {
        return !empty(
$this->AltBody);
    }

    
/**
     * Clear all To recipients.
     * @return void
     */
    
public function clearAddresses()
    {
        foreach (
$this->to as $to) {
            unset(
$this->all_recipients[strtolower($to[0])]);
        }
        
$this->to = array();
    }

    
/**
     * Clear all CC recipients.
     * @return void
     */
    
public function clearCCs()
    {
        foreach (
$this->cc as $cc) {
            unset(
$this->all_recipients[strtolower($cc[0])]);
        }
        
$this->cc = array();
    }

    
/**
     * Clear all BCC recipients.
     * @return void
     */
    
public function clearBCCs()
    {
        foreach (
$this->bcc as $bcc) {
            unset(
$this->all_recipients[strtolower($bcc[0])]);
        }
        
$this->bcc = array();
    }

    
/**
     * Clear all ReplyTo recipients.
     * @return void
     */
    
public function clearReplyTos()
    {
        
$this->ReplyTo = array();
    }

    
/**
     * Clear all recipient types.
     * @return void
     */
    
public function clearAllRecipients()
    {
        
$this->to = array();
        
$this->cc = array();
        
$this->bcc = array();
        
$this->all_recipients = array();
    }

    
/**
     * Clear all filesystem, string, and binary attachments.
     * @return void
     */
    
public function clearAttachments()
    {
        
$this->attachment = array();
    }

    
/**
     * Clear all custom headers.
     * @return void
     */
    
public function clearCustomHeaders()
    {
        
$this->CustomHeader = array();
    }

    
/**
     * Add an error message to the error container.
     * @access protected
     * @param string $msg
     * @return void
     */
    
protected function setError($msg)
    {
        
$this->error_count++;
        if (
$this->Mailer == 'smtp' and !is_null($this->smtp)) {
            
$lasterror $this->smtp->getError();
            if (!empty(
$lasterror) and array_key_exists('smtp_msg'$lasterror)) {
                
$msg .= '<p>' $this->lang('smtp_error') . $lasterror['smtp_msg'] . "</p>\n";
            }
        }
        
$this->ErrorInfo $msg;
    }

    
/**
     * Return an RFC 822 formatted date.
     * @access public
     * @return string
     * @static
     */
    
public static function rfcDate()
    {
        
//Set the time zone to whatever the default is to avoid 500 errors
        //Will default to UTC if it's not set properly in php.ini
        
date_default_timezone_set(@date_default_timezone_get());
        return 
date('D, j M Y H:i:s O');
    }

    
/**
     * Get the server hostname.
     * Returns 'localhost.localdomain' if unknown.
     * @access protected
     * @return string
     */
    
protected function serverHostname()
    {
        if (!empty(
$this->Hostname)) {
            
$result $this->Hostname;
        } elseif (isset(
$_SERVER['SERVER_NAME'])) {
            
$result $_SERVER['SERVER_NAME'];
        } else {
            
$result 'localhost.localdomain';
        }

        return 
$result;
    }

    
/**
     * Get an error message in the current language.
     * @access protected
     * @param string $key
     * @return string
     */
    
protected function lang($key)
    {
        if (
count($this->language) < 1) {
            
$this->setLanguage('en'); // set the default language
        
}

        if (isset(
$this->language[$key])) {
            return 
$this->language[$key];
        } else {
            return 
'Language string failed to load: ' $key;
        }
    }

    
/**
     * Check if an error occurred.
     * @access public
     * @return bool True if an error did occur.
     */
    
public function isError()
    {
        return (
$this->error_count 0);
    }

    
/**
     * Ensure consistent line endings in a string.
     * Changes every end of line from CRLF, CR or LF to $this->LE.
     * @access public
     * @param string $str String to fixEOL
     * @return string
     */
    
public function fixEOL($str)
    {
        
// Normalise to \n
        
$nstr str_replace(array("\r\n""\r"), "\n"$str);
        
// Now convert LE as needed
        
if ($this->LE !== "\n") {
            
$nstr str_replace("\n"$this->LE$nstr);
        }
        return 
$nstr;
    }

    
/**
     * Add a custom header.
     * $name value can be overloaded to contain
     * both header name and value (name:value)
     * @access public
     * @param string $name Custom header name
     * @param string $value Header value
     * @return void
     */
    
public function addCustomHeader($name$value null)
    {
        if (
$value === null) {
            
// Value passed in as name:value
            
$this->CustomHeader[] = explode(':'$name2);
        } else {
            
$this->CustomHeader[] = array($name$value);
        }
    }

    
/**
     * Create a message from an HTML string.
     * Automatically makes modifications for inline images and backgrounds
     * and creates a plain-text version by converting the HTML.
     * Overwrites any existing values in $this->Body and $this->AltBody
     * @access public
     * @param string $message HTML message string
     * @param string $basedir baseline directory for path
     * @param bool $advanced Whether to use the advanced HTML to text converter
     * @return string $message
     */
    
public function msgHTML($message$basedir ''$advanced false)
    {
        
preg_match_all("/(src|background)=[\"'](.*)[\"']/Ui"$message$images);
        if (isset(
$images[2])) {
            foreach (
$images[2] as $i => $url) {
                
// do not change urls for absolute images (thanks to corvuscorax)
                
if (!preg_match('#^[A-z]+://#'$url)) {
                    
$filename basename($url);
                    
$directory dirname($url);
                    if (
$directory == '.') {
                        
$directory '';
                    }
                    
$cid md5($url) . '@phpmailer.0'//RFC2392 S 2
                    
if (strlen($basedir) > && substr($basedir, -1) != '/') {
                        
$basedir .= '/';
                    }
                    if (
strlen($directory) > && substr($directory, -1) != '/') {
                        
$directory .= '/';
                    }
                    if (
$this->addEmbeddedImage(
                        
$basedir $directory $filename,
                        
$cid,
                        
$filename,
                        
'base64',
                        
self::_mime_types(self::mb_pathinfo($filenamePATHINFO_EXTENSION))
                    )
                    ) {
                        
$message preg_replace(
                            
"/" $images[1][$i] . "=[\"']" preg_quote($url'/') . "[\"']/Ui",
                            
$images[1][$i] . "=\"cid:" $cid "\"",
                            
$message
                        
);
                    }
                }
            }
        }
        
$this->isHTML(true);
        if (empty(
$this->AltBody)) {
            
$this->AltBody 'To view this email message, open it in a program that understands HTML!' "\n\n";
        }
        
//Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
        
$this->Body $this->normalizeBreaks($message);
        
$this->AltBody $this->normalizeBreaks($this->html2text($message$advanced));
        return 
$this->Body;
    }

    
/**
     * Convert an HTML string into plain text.
     * @param string $html The HTML text to convert
     * @param bool $advanced Should this use the more complex html2text converter or just a simple one?
     * @return string
     */
    
public function html2text($html$advanced false)
    {
        if (
$advanced) {
            require_once 
'extras/class.html2text.php';
            
$h = new html2text($html);
            return 
$h->get_text();
        }
        return 
html_entity_decode(
            
trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si'''$html))),
            
ENT_QUOTES,
            
$this->CharSet
        
);
    }

    
/**
     * Get the MIME type for a file extension.
     * @param string $ext File extension
     * @access public
     * @return string MIME type of file.
     * @static
     */
    
public static function _mime_types($ext '')
    {
        
$mimes = array(
            
'xl' => 'application/excel',
            
'hqx' => 'application/mac-binhex40',
            
'cpt' => 'application/mac-compactpro',
            
'bin' => 'application/macbinary',
            
'doc' => 'application/msword',
            
'word' => 'application/msword',
            
'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',
            
'js' => 'application/x-javascript',
            
'swf' => 'application/x-shockwave-flash',
            
'sit' => 'application/x-stuffit',
            
'tar' => 'application/x-tar',
            
'tgz' => 'application/x-tar',
            
'xht' => 'application/xhtml+xml',
            
'xhtml' => 'application/xhtml+xml',
            
'zip' => 'application/zip',
            
'mid' => 'audio/midi',
            
'midi' => 'audio/midi',
            
'mp2' => 'audio/mpeg',
            
'mp3' => 'audio/mpeg',
            
'mpga' => 'audio/mpeg',
            
'aif' => 'audio/x-aiff',
            
'aifc' => 'audio/x-aiff',
            
'aiff' => 'audio/x-aiff',
            
'ram' => 'audio/x-pn-realaudio',
            
'rm' => 'audio/x-pn-realaudio',
            
'rpm' => 'audio/x-pn-realaudio-plugin',
            
'ra' => 'audio/x-realaudio',
            
'wav' => 'audio/x-wav',
            
'bmp' => 'image/bmp',
            
'gif' => 'image/gif',
            
'jpeg' => 'image/jpeg',
            
'jpe' => 'image/jpeg',
            
'jpg' => 'image/jpeg',
            
'png' => 'image/png',
            
'tiff' => 'image/tiff',
            
'tif' => 'image/tiff',
            
'eml' => 'message/rfc822',
            
'css' => 'text/css',
            
'html' => 'text/html',
            
'htm' => 'text/html',
            
'shtml' => 'text/html',
            
'log' => 'text/plain',
            
'text' => 'text/plain',
            
'txt' => 'text/plain',
            
'rtx' => 'text/richtext',
            
'rtf' => 'text/rtf',
            
'xml' => 'text/xml',
            
'xsl' => 'text/xml',
            
'mpeg' => 'video/mpeg',
            
'mpe' => 'video/mpeg',
            
'mpg' => 'video/mpeg',
            
'mov' => 'video/quicktime',
            
'qt' => 'video/quicktime',
            
'rv' => 'video/vnd.rn-realvideo',
            
'avi' => 'video/x-msvideo',
            
'movie' => 'video/x-sgi-movie'
        
);
        return (
array_key_exists(strtolower($ext), $mimes) ? $mimes[strtolower($ext)]: 'application/octet-stream');
    }

    
/**
     * Map a file name to a MIME type.
     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
     * @param string $filename A file name or full path, does not need to exist as a file
     * @return string
     * @static
     */
    
public static function filenameToType($filename)
    {
        
//In case the path is a URL, strip any query string before getting extension
        
$qpos strpos($filename'?');
        if (
$qpos !== false) {
            
$filename substr($filename0$qpos);
        }
        
$pathinfo self::mb_pathinfo($filename);
        return 
self::_mime_types($pathinfo['extension']);
    }

    
/**
     * Multi-byte-safe pathinfo replacement.
     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
     * Works similarly to the one in PHP >= 5.2.0
     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
     * @param string $path A filename or path, does not need to exist as a file
     * @param integer|string $options Either a PATHINFO_* constant,
     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
     * @return string|array
     * @static
     */
    
public static function mb_pathinfo($path$options null)
    {
        
$ret = array('dirname' => '''basename' => '''extension' => '''filename' => '');
        
$m = array();
        
preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im'$path$m);
        if (
array_key_exists(1$m)) {
            
$ret['dirname'] = $m[1];
        }
        if (
array_key_exists(2$m)) {
            
$ret['basename'] = $m[2];
        }
        if (
array_key_exists(5$m)) {
            
$ret['extension'] = $m[5];
        }
        if (
array_key_exists(3$m)) {
            
$ret['filename'] = $m[3];
        }
        switch (
$options) {
            case 
PATHINFO_DIRNAME:
            case 
'dirname':
                return 
$ret['dirname'];
                break;
            case 
PATHINFO_BASENAME:
            case 
'basename':
                return 
$ret['basename'];
                break;
            case 
PATHINFO_EXTENSION:
            case 
'extension':
                return 
$ret['extension'];
                break;
            case 
PATHINFO_FILENAME:
            case 
'filename':
                return 
$ret['filename'];
                break;
            default:
                return 
$ret;
        }
    }

    
/**
     * Set or reset instance properties.
     *
     * Usage Example:
     * $page->set('X-Priority', '3');
     *
     * @access public
     * @param string $name
     * @param mixed $value
     * NOTE: will not work with arrays, there are no arrays to set/reset
     * @throws phpmailerException
     * @return bool
     * @todo Should this not be using __set() magic function?
     */
    
public function set($name$value '')
    {
        try {
            if (isset(
$this->$name)) {
                
$this->$name $value;
            } else {
                throw new 
phpmailerException($this->lang('variable_set') . $nameself::STOP_CRITICAL);
            }
        } catch (
Exception $e) {
            
$this->setError($e->getMessage());
            if (
$e->getCode() == self::STOP_CRITICAL) {
                return 
false;
            }
        }
        return 
true;
    }

    
/**
     * Strip newlines to prevent header injection.
     * @access public
     * @param string $str
     * @return string
     */
    
public function secureHeader($str)
    {
        return 
trim(str_replace(array("\r""\n"), ''$str));
    }

    
/**
     * Normalize line breaks in a string.
     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
     * @param string $text
     * @param string $breaktype What kind of line break to use, defaults to CRLF
     * @return string
     * @access public
     * @static
     */
    
public static function normalizeBreaks($text$breaktype "\r\n")
    {
        return 
preg_replace('/(\r\n|\r|\n)/ms'$breaktype$text);
    }


    
/**
     * Set the private key file and password for S/MIME signing.
     * @access public
     * @param string $cert_filename
     * @param string $key_filename
     * @param string $key_pass Password for private key
     */
    
public function sign($cert_filename$key_filename$key_pass)
    {
        
$this->sign_cert_file $cert_filename;
        
$this->sign_key_file $key_filename;
        
$this->sign_key_pass $key_pass;
    }

    
/**
     * Quoted-Printable-encode a DKIM header.
     * @access public
     * @param string $txt
     * @return string
     */
    
public function DKIM_QP($txt)
    {
        
$line '';
        for (
$i 0$i strlen($txt); $i++) {
            
$ord ord($txt[$i]);
            if (((
0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
                
$line .= $txt[$i];
            } else {
                
$line .= "=" sprintf("%02X"$ord);
            }
        }
        return 
$line;
    }

    
/**
     * Generate a DKIM signature.
     * @access public
     * @param string $s Header
     * @throws phpmailerException
     * @return string
     */
    
public function DKIM_Sign($s)
    {
        if (!
defined('PKCS7_TEXT')) {
            if (
$this->exceptions) {
                throw new 
phpmailerException($this->lang("signing") . ' OpenSSL extension missing.');
            }
            return 
'';
        }
        
$privKeyStr file_get_contents($this->DKIM_private);
        if (
$this->DKIM_passphrase != '') {
            
$privKey openssl_pkey_get_private($privKeyStr$this->DKIM_passphrase);
        } else {
            
$privKey $privKeyStr;
        }
        if (
openssl_sign($s$signature$privKey)) {
            return 
base64_encode($signature);
        }
        return 
'';
    }

    
/**
     * Generate a DKIM canonicalization header.
     * @access public
     * @param string $s Header
     * @return string
     */
    
public function DKIM_HeaderC($s)
    {
        
$s preg_replace("/\r\n\s+/"" "$s);
        
$lines explode("\r\n"$s);
        foreach (
$lines as $key => $line) {
            list(
$heading$value) = explode(":"$line2);
            
$heading strtolower($heading);
            
$value preg_replace("/\s+/"" "$value); // Compress useless spaces
            
$lines[$key] = $heading ":" trim($value); // Don't forget to remove WSP around the value
        
}
        
$s implode("\r\n"$lines);
        return 
$s;
    }

    
/**
     * Generate a DKIM canonicalization body.
     * @access public
     * @param string $body Message Body
     * @return string
     */
    
public function DKIM_BodyC($body)
    {
        if (
$body == '') {
            return 
"\r\n";
        }
        
// stabilize line endings
        
$body str_replace("\r\n""\n"$body);
        
$body str_replace("\n""\r\n"$body);
        
// END stabilize line endings
        
while (substr($bodystrlen($body) - 44) == "\r\n\r\n") {
            
$body substr($body0strlen($body) - 2);
        }
        return 
$body;
    }

    
/**
     * Create the DKIM header and body in a new message header.
     * @access public
     * @param string $headers_line Header lines
     * @param string $subject Subject
     * @param string $body Body
     * @return string
     */
    
public function DKIM_Add($headers_line$subject$body)
    {
        
$DKIMsignatureType 'rsa-sha1'// Signature & hash algorithms
        
$DKIMcanonicalization 'relaxed/simple'// Canonicalization of header/body
        
$DKIMquery 'dns/txt'// Query method
        
$DKIMtime time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
        
$subject_header "Subject: $subject";
        
$headers explode($this->LE$headers_line);
        
$from_header '';
        
$to_header '';
        
$current '';
        foreach (
$headers as $header) {
            if (
strpos($header'From:') === 0) {
                
$from_header $header;
                
$current 'from_header';
            } elseif (
strpos($header'To:') === 0) {
                
$to_header $header;
                
$current 'to_header';
            } else {
                if (
$current && strpos($header' =?') === 0) {
                    
$current .= $header;
                } else {
                    
$current '';
                }
            }
        }
        
$from str_replace('|''=7C'$this->DKIM_QP($from_header));
        
$to str_replace('|''=7C'$this->DKIM_QP($to_header));
        
$subject str_replace(
            
'|',
            
'=7C',
            
$this->DKIM_QP($subject_header)
        ); 
// Copied header fields (dkim-quoted-printable)
        
$body $this->DKIM_BodyC($body);
        
$DKIMlen strlen($body); // Length of body
        
$DKIMb64 base64_encode(pack("H*"sha1($body))); // Base64 of packed binary SHA-1 hash of body
        
$ident = ($this->DKIM_identity == '') ? '' " i=" $this->DKIM_identity ";";
        
$dkimhdrs "DKIM-Signature: v=1; a=" .
            
$DKIMsignatureType "; q=" .
            
$DKIMquery "; l=" .
            
$DKIMlen "; s=" .
            
$this->DKIM_selector .
            
";\r\n" .
            
"\tt=" $DKIMtime "; c=" $DKIMcanonicalization ";\r\n" .
            
"\th=From:To:Subject;\r\n" .
            
"\td=" $this->DKIM_domain ";" $ident "\r\n" .
            
"\tz=$from\r\n" .
            
"\t|$to\r\n" .
            
"\t|$subject;\r\n" .
            
"\tbh=" $DKIMb64 ";\r\n" .
            
"\tb=";
        
$toSign $this->DKIM_HeaderC(
            
$from_header "\r\n" $to_header "\r\n" $subject_header "\r\n" $dkimhdrs
        
);
        
$signed $this->DKIM_Sign($toSign);
        return 
$dkimhdrs $signed "\r\n";
    }

    
/**
     * Perform a callback.
     * @param bool $isSent
     * @param string $to
     * @param string $cc
     * @param string $bcc
     * @param string $subject
     * @param string $body
     * @param string $from
     */
    
protected function doCallback($isSent$to$cc$bcc$subject$body$from null)
    {
        if (!empty(
$this->action_function) && is_callable($this->action_function)) {
            
$params = array($isSent$to$cc$bcc$subject$body$from);
            
call_user_func_array($this->action_function$params);
        }
    }
}

/**
 * PHPMailer exception handler
 * @package PHPMailer
 */
class phpmailerException extends Exception
{
    
/**
     * Prettify error message output
     * @return string
     */
    
public function errorMessage()
    {
        
$errorMsg '<strong>' $this->getMessage() . "</strong><br />\n";
        return 
$errorMsg;
    }
}

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 1.0 pre-release build #13 powered by Captain Crunch Security Team | http://ccteam.ru | Generation time: 0.0468 ]--