iwebshop授权破解中的layout是什么意思

/ iwebshop
项目语言:PHP
权限:read-only(如需更高权限请先加入项目)
Index: phpmailer/class.phpmailer.php
===================================================================
--- phpmailer/class.phpmailer.php (revision 0)
+++ phpmailer/class.phpmailer.php (revision 1)
@@ -0,0 +1,3404 @@
+ * PHPMailer - PHP email creation and transport class.
+ * PHP Version 5
+ * @package PHPMailer
+ * @link /PHPMailer/PHPMailer/ The PHPMailer GitHub project
+ * @author Marcus Bointon (Synchro/coolbru) &phpmailer@synchromedia.co.uk&
+ * @author Jim Jagielski (jimjag) &&
+ * @author Andy Prevost (codeworxtech) &codeworxtech@users.sourceforge.net&
+ * @author Brent R. Matzelle (original founder)
+ * @copyright 2012 - 2014 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.
+ * PHPMailer - PHP email creation and transport class.
+ * @package PHPMailer
+ * @author Marcus Bointon (Synchro/coolbru) &phpmailer@synchromedia.co.uk&
+ * @author Jim Jagielski (jimjag) &&
+ * @author Andy Prevost (codeworxtech) &codeworxtech@users.sourceforge.net&
+ * @author Brent R. Matzelle (original founder)
+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 = 'UTF-8';
* 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
* @deprecated Email senders should never set a return-
* it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
* @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
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 =
* 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. &:25;&).
* 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 =
* 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: no output
1: commands
2: data and commands
3: as 2 plus connection status
4: low level data output
* @type int
* @see SMTP::$do_debug
public $SMTPDebug = 0;
* How to handle debug output.
* Options:
'echo': Output plain-text as-is, appropriate for CLI
'html': Output escaped, line breaks converted to &br&, appropriate for browser output
'error_log': Output to error log as configured in php.ini
* @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 =
* Whether to split multiple to addresses into multiple messages
* or send them all in one message.
* @type bool
public $SingleTo =
* 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
* @link http://www.postfix.org/VERP_README.html Postfix VERP info
* @type bool
public $do_verp =
* Whether to allow sending messages with an empty body.
* @type bool
public $AllowEmpty =
* 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 &#'
* @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 any php callable: http://www.php.net/is_callable
* Parameters:
result of the send action
email address of the recipient
cc email addresses
bcc email addresses
the subject
the email body
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 =
* 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 =
* 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)
if (version_compare(PHP_VERSION, '5.0.0', '&')) {
exit(&Sorry, PHPMailer will only run on PHP version 5 or greater!\n&);
$this-&exceptions = ($exceptions == true);
//Make sure our autoloader is loaded
if (version_compare(PHP_VERSION, '5.1.2', '&=')) {
$autoload = spl_autoload_functions();
if ($autoload === false or !in_array('PHPMailerAutoload', $autoload)) {
require 'PHPMailerAutoload.php';
* 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)
//Check overloading of mail function to avoid double-encoding
if (ini_get('mbstring.func_overload') & 1) {
$subject = $this-&secureHeader($subject);
$subject = $this-&encodeHeader($this-&secureHeader($subject));
if (ini_get('safe_mode') || !($this-&UseSendmailOptions)) {
$result = @mail($to, $subject, $body, $header);
$result = @mail($to, $subject, $body, $header, $params);
* 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) {
switch ($this-&Debugoutput) {
case 'error_log':
error_log($str);
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&;
case 'echo':
echo $str.&\n&;
* 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';
$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 = '/usr/sbin/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/qmail-inject';
$this-&Mailer = 'qmail';
* 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);
$this-&edebug($this-&lang('Invalid recipient array') . ': ' . $kind);
if ($this-&exceptions) {
throw new phpmailerException('Invalid recipient array: ' . $kind);
$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);
$this-&edebug($this-&lang('invalid_address') . ': ' . $address);
if ($this-&exceptions) {
throw new phpmailerException($this-&lang('invalid_address') . ': ' . $address);
if ($kind != 'Reply-To') {
if (!isset($this-&all_recipients[strtolower($address)])) {
array_push($this-&$kind, array($address, $name));
$this-&all_recipients[strtolower($address)] =
if (!array_key_exists(strtolower($address), $this-&ReplyTo)) {
$this-&ReplyTo[strtolower($address)] = array($address, $name);
* 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);
$this-&edebug($this-&lang('invalid_address') . ': ' . $address);
if ($this-&exceptions) {
throw new phpmailerException($this-&lang('invalid_address') . ': ' . $address);
$this-&From = $
$this-&FromName = $
if ($auto) {
if (empty($this-&Sender)) {
$this-&Sender = $
* 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 stricte
* * `pcre8` Use
pattern, requires PCRE & 8.0, PHP &= 5.3.2, 5.2.14;
* * `pcre` Use old PCRE
* * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; same as pcre8 but does not allow 'dotless'
* * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
* * `noregex` Don't use a regex: super fast, really dumb.
* @return bool
* @access public
public static function validateAddress($address, $patternselect = 'auto')
if ($patternselect == 'auto') {
if (defined(
'PCRE_VERSION'
) { //Check this constant so it works when extension_loaded() is disabled
if (version_compare(PCRE_VERSION, '8.0') &= 0) {
$patternselect = 'pcre8';
$patternselect = 'pcre';
//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';
$patternselect = 'noregex';
switch ($patternselect) {
case 'pcre8':
* Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
* @link //email-address-validation/
* @copyright
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',
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',
case 'html5':
* This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
* @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
return '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])'.
'?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD';
case 'php':
return (bool)filter_var($address, FILTER_VALIDATE_EMAIL);
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);
* Create a message and send it.
* Uses the sending method specified by $Mailer.
* @throws phpmailerException
* @return bool false on error - See the ErrorInfo property for details of the error.
public function send()
if (!$this-&preSend()) {
return $this-&postSend();
} catch (phpmailerException $exc) {
$this-&mailHeader = '';
$this-&setError($exc-&getMessage());
if ($this-&exceptions) {
* Prepare a message for sending.
* @throws phpmailerException
* @return bool
public function preSend()
$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);
$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;
} catch (phpmailerException $exc) {
$this-&setError($exc-&getMessage());
if ($this-&exceptions) {
* Actually send a message.
* Send the email via the selected mechanism
* @throws phpmailerException
* @return bool
public function postSend()
// Choose the mailer and send through it
switch ($this-&Mailer) {
case 'sendmail':
case 'qmail':
return $this-&sendmailSend($this-&MIMEHeader, $this-&MIMEBody);
case 'smtp':
return $this-&smtpSend($this-&MIMEHeader, $this-&MIMEBody);
case 'mail':
return $this-&mailSend($this-&MIMEHeader, $this-&MIMEBody);
$sendMethod = $this-&Mailer.'Send';
if (method_exists($this, $sendMethod)) {
return $this-&$sendMethod($this-&MIMEHeader, $this-&MIMEBody);
return $this-&mailSend($this-&MIMEHeader, $this-&MIMEBody);
} catch (phpmailerException $exc) {
$this-&setError($exc-&getMessage());
$this-&edebug($exc-&getMessage());
if ($this-&exceptions) {
* 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 != '') {
if ($this-&Mailer == 'qmail') {
$sendmail = sprintf(&%s -f%s&, escapeshellcmd($this-&Sendmail), escapeshellarg($this-&Sender));
$sendmail = sprintf(&%s -oi -f%s -t&, escapeshellcmd($this-&Sendmail), escapeshellarg($this-&Sender));
if ($this-&Mailer == 'qmail') {
$sendmail = sprintf(&%s&, escapeshellcmd($this-&Sendmail));
$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-&Sendmail, self::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) ? 1 : 0;
$this-&doCallback($isSent, $val, $this-&cc, $this-&bcc, $this-&Subject, $body, $this-&From);
if ($result != 0) {
throw new phpmailerException($this-&lang('execute') . $this-&Sendmail, self::STOP_CRITICAL);
if (!@$mail = popen($sendmail, 'w')) {
throw new phpmailerException($this-&lang('execute') . $this-&Sendmail, self::STOP_CRITICAL);
fputs($mail, $header);
fputs($mail, $body);
$result = pclose($mail);
// implement call back function if it exists
$isSent = ($result == 0) ? 1 : 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-&Sendmail, self::STOP_CRITICAL);
* 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 $toaddr) {
$toArr[] = $this-&addrFormat($toaddr);
$to = implode(', ', $toArr);
if (empty($this-&Sender)) {
$params = & &;
$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);
if ($this-&SingleTo === true && count($toArr) & 1) {
foreach ($toArr as $val) {
$result = $this-&mailPassthru($val, $this-&Subject, $body, $header, $params);
// implement call back function if it exists
$isSent = ($result == 1) ? 1 : 0;
$this-&doCallback($isSent, $val, $this-&cc, $this-&bcc, $this-&Subject, $body, $this-&From);
$result = $this-&mailPassthru($to, $this-&Subject, $body, $header, $params);
// implement call back function if it exists
$isSent = ($result == 1) ? 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 (!$result) {
throw new phpmailerException($this-&lang('instantiate'), self::STOP_CRITICAL);
* 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)) {
$this-&smtp = new SMTP;
return $this-&
* 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-&S
if (!$this-&smtp-&mail($smtp_from)) {
$this-&setError($this-&lang('from_failed') . $smtp_from . ' : ' . implode(',', $this-&smtp-&getError()));
throw new phpmailerException($this-&ErrorInfo, self::STOP_CRITICAL);
// Attempt to send to all recipients
foreach ($this-&to as $to) {
if (!$this-&smtp-&recipient($to[0])) {
$bad_rcpt[] = $to[0];
$isSent = 0;
$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;
$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;
$isSent = 1;
$this-&doCallback($isSent, '', '', $bcc[0], $this-&Subject, $body, $this-&From);
//Only send the DATA command if we have viable recipients
if ((count($this-&all_recipients) & count($bad_rcpt)) and !$this-&smtp-&data($header . $body)) {
throw new phpmailerException($this-&lang('data_not_accepted'), self::STOP_CRITICAL);
if ($this-&SMTPKeepAlive == true) {
$this-&smtp-&reset();
$this-&smtp-&quit();
$this-&smtp-&close();
if (count($bad_rcpt) & 0) { //Create error message for any bad addresses
throw new phpmailerException(
$this-&lang('recipients_failed') . implode(', ', $bad_rcpt),
self::STOP_CONTINUE
* 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()) {
$this-&smtp-&setTimeout($this-&Timeout);
$this-&smtp-&setDebugLevel($this-&SMTPDebug);
$this-&smtp-&setDebugOutput($this-&Debugoutput);
$this-&smtp-&setVerp($this-&do_verp);
$hosts = explode(';', $this-&Host);
$lastexception =
foreach ($hosts as $hostentry) {
$hostinfo = array();
if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {
//Not a valid host entry
//$hostinfo[2]: optional ssl or tls prefix
//$hostinfo[3]: the hostname
//$hostinfo[4]: optional port number
//The host string prefix can temporarily override the current setting for SMTPSecure
//If it's not specified, the default value is used
$prefix = '';
$tls = ($this-&SMTPSecure == 'tls');
if ($hostinfo[2] == 'ssl' or ($hostinfo[2] == '' and $this-&SMTPSecure == 'ssl')) {
$prefix = 'ssl://';
$tls = //Can't have SSL and TLS at once
} elseif ($hostinfo[2] == 'tls') {
//tls doesn't use a prefix
$host = $hostinfo[3];
$port = $this-&P
$tport = (integer)$hostinfo[4];
if ($tport & 0 and $tport & 65536) {
if ($this-&smtp-&connect($prefix . $host, $port, $this-&Timeout, $options)) {
if ($this-&Helo) {
$hello = $this-&H
$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'));
} catch (phpmailerException $exc) {
$lastexception = $
//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)) {
* 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 = '')
//Define full set of translatable strings in English
$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: '
if (empty($lang_path)) {
//Calculate an absolute path so it can work if CWD is not here
$lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
$foundlang =
$lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
if ($langcode != 'en') { //There is no English translation file
//Make sure language file path is readable
if (!is_readable($lang_file)) {
$foundlang =
//Overwrite language-specific strings.
//This way we'll never have missing translations.
$foundlang = include $lang_
$this-&language = $PHPMAILER_LANG;
return ($foundlang == true); //Returns false if language not found
* Get the array of strings for the current language.
* @return array
public function getTranslations()
return $this-&
* 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 User'), array('', 'Zoe User'))
* @return string
public function addrAppend($type, $addr)
$addresses = array();
foreach ($addr as $address) {
$addresses[] = $this-&addrFormat($address);
return $type . ': ' . implode(', ', $addresses) . $this-≤
* 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 User')
* @return string
public function addrFormat($addr)
if (empty($addr[1])) { // No name provided
return $this-&secureHeader($addr[0]);
return $this-&encodeHeader($this-&secureHeader($addr[1]), 'phrase') . & && . $this-&secureHeader(
* 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-≤
// 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($message, 0, -$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) - $
if ($e != 0) {
if ($space_left & 20) {
$len = $space_
if ($is_utf8) {
$len = $this-&utf8CharBoundary($word, $len);
} elseif (substr($word, $len - 1, 1) == &=&) {
} elseif (substr($word, $len - 2, 1) == &=&) {
$len -= 2;
$part = substr($word, 0, $len);
$word = substr($word, $len);
$buf .= ' ' . $
$message .= $buf . sprintf(&=%s&, self::CRLF);
$message .= $buf . $soft_
$buf = '';
while (strlen($word) & 0) {
if ($length &= 0) {
if ($is_utf8) {
$len = $this-&utf8CharBoundary($word, $len);
} elseif (substr($word, $len - 1, 1) == &=&) {
} elseif (substr($word, $len - 2, 1) == &=&) {
$len -= 2;
$part = substr($word, 0, $len);
$word = substr($word, $len);
if (strlen($word) & 0) {
$message .= $part . sprintf(&=%s&, self::CRLF);
$buf_o = $
$buf .= ($e == 0) ? $word : (' ' . $word);
if (strlen($buf) & $length and $buf_o != '') {
$message .= $buf_o . $soft_
$message .= $buf . self::CRLF;
* 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 =
$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 + 1, 2);
$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 =
} elseif ($dec &= 192) { // First byte of a multi byte character
// Reduce maxLength to split at start of character
$maxLength = $maxLength - ($lookBack - $encodedCharPos);
$foundSplitPos =
} elseif ($dec & 192) { // Middle byte of a multi byte character, look further back
$lookBack += 3;
// No encoded character found
$foundSplitPos =
return $maxL
* Set the body wrapping.
* @access public
* @return void
public function setWordWrap()
if ($this-&WordWrap & 1) {
switch ($this-&message_type) {
case 'alt':
case 'alt_inline':
case 'alt_attach':
case 'alt_inline_attach':
$this-&AltBody = $this-&wrapText($this-&AltBody, $this-&WordWrap);
$this-&Body = $this-&wrapText($this-&Body, $this-&WordWrap);
* 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_
$this-&boundary[2] = 'b2_' . $uniq_
$this-&boundary[3] = 'b3_' . $uniq_
if ($this-&MessageDate == '') {
$result .= $this-&headerLine('Date', self::rfcDate());
$result .= $this-&headerLine('Date', $this-&MessageDate);
// To be created automatically by mail()
if ($this-&SingleTo === true) {
if ($this-&Mailer != 'mail') {
foreach ($this-&to as $toaddr) {
$this-&SingleToArray[] = $this-&addrFormat($toaddr);
if (count($this-&to) & 0) {
if ($this-&Mailer != 'mail') {
$result .= $this-&addrAppend('To', $this-&to);
} elseif (count($this-&cc) == 0) {
$result .= $this-&headerLine('To', 'undisclosed-recipients:;');
$result .= $this-&addrAppend('From', array(array(trim($this-&From), $this-&FromName)));
// 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
$this-&Mailer == 'sendmail' or $this-&Mailer == 'qmail' or $this-&Mailer == 'mail'
and 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;
$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 . ' (/PHPMailer/PHPMailer/)'
$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();
* 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/');
$result .= $this-&textLine(&\tboundary=\&& . $this-&boundary[1] . '&');
case 'attach':
case 'inline_attach':
case 'alt_attach':
case 'alt_inline_attach':
$result .= $this-&headerLine('Content-Type', 'multipart/');
$result .= $this-&textLine(&\tboundary=\&& . $this-&boundary[1] . '&');
case 'alt':
case 'alt_inline':
$result .= $this-&headerLine('Content-Type', 'multipart/');
$result .= $this-&textLine(&\tboundary=\&& . $this-&boundary[1] . '&');
// Catches case 'plain': and case '':
$result .= $this-&textLine('Content-Type: ' . $this-&ContentType . '; charset=' . $this-&CharSet);
//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-≤
* 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-&MIMEB
* 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-≤
$this-&setWordWrap();
$bodyEncoding = $this-&E
$bodyCharSet = $this-&CharS
if (!$this-&has8bitChars($this-&Body)) {
$bodyEncoding = '7bit';
$bodyCharSet = 'us-ascii';
$altBodyEncoding = $this-&E
$altBodyCharSet = $this-&CharS
if (!$this-&has8bitChars($this-&AltBody)) {
$altBodyEncoding = '7bit';
$altBodyCharSet = 'us-ascii';
switch ($this-&message_type) {
case 'inline':
$body .= $this-&getBoundary($this-&boundary[1], $bodyCharSet, '', $bodyEncoding);
$body .= $this-&encodeString($this-&Body, $bodyEncoding);
$body .= $this-&LE . $this-≤
$body .= $this-&attachAll('inline', $this-&boundary[1]);
case 'attach':
$body .= $this-&getBoundary($this-&boundary[1], $bodyCharSet, '', $bodyEncoding);
$body .= $this-&encodeString($this-&Body, $bodyEncoding);
$body .= $this-&LE . $this-≤
$body .= $this-&attachAll('attachment', $this-&boundary[1]);
case 'inline_attach':
$body .= $this-&textLine('--' . $this-&boundary[1]);
$body .= $this-&headerLine('Content-Type', 'multipart/');
$body .= $this-&textLine(&\tboundary=\&& . $this-&boundary[2] . '&');
$body .= $this-≤
$body .= $this-&getBoundary($this-&boundary[2], $bodyCharSet, '', $bodyEncoding);
$body .= $this-&encodeString($this-&Body, $bodyEncoding);
$body .= $this-&LE . $this-≤
$body .= $this-&attachAll('inline', $this-&boundary[2]);
$body .= $this-≤
$body .= $this-&attachAll('attachment', $this-&boundary[1]);
case 'alt':
$body .= $this-&getBoundary($this-&boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
$body .= $this-&encodeString($this-&AltBody, $altBodyEncoding);
$body .= $this-&LE . $this-≤
$body .= $this-&getBoundary($this-&boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
$body .= $this-&encodeString($this-&Body, $bodyEncoding);
$body .= $this-&LE . $this-≤
if (!empty($this-&Ical)) {
$body .= $this-&getBoundary($this-&boundary[1], '', 'text/ method=REQUEST', '');
$body .= $this-&encodeString($this-&Ical, $this-&Encoding);
$body .= $this-&LE . $this-≤
$body .= $this-&endBoundary($this-&boundary[1]);
case 'alt_inline':
$body .= $this-&getBoundary($this-&boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
$body .= $this-&encodeString($this-&AltBody, $altBodyEncoding);
$body .= $this-&LE . $this-≤
$body .= $this-&textLine('--' . $this-&boundary[1]);
$body .= $this-&headerLine('Content-Type', 'multipart/');
$body .= $this-&textLine(&\tboundary=\&& . $this-&boundary[2] . '&');
$body .= $this-≤
$body .= $this-&getBoundary($this-&boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
$body .= $this-&encodeString($this-&Body, $bodyEncoding);
$body .= $this-&LE . $this-≤
$body .= $this-&attachAll('inline', $this-&boundary[2]);
$body .= $this-≤
$body .= $this-&endBoundary($this-&boundary[1]);
case 'alt_attach':
$body .= $this-&textLine('--' . $this-&boundary[1]);
$body .= $this-&headerLine('Content-Type', 'multipart/');
$body .= $this-&textLine(&\tboundary=\&& . $this-&boundary[2] . '&');
$body .= $this-≤
$body .= $this-&getBoundary($this-&boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
$body .= $this-&encodeString($this-&AltBody, $altBodyEncoding);
$body .= $this-&LE . $this-≤
$body .= $this-&getBoundary($this-&boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
$body .= $this-&encodeString($this-&Body, $bodyEncoding);
$body .= $this-&LE . $this-≤
$body .= $this-&endBoundary($this-&boundary[2]);
$body .= $this-≤
$body .= $this-&attachAll('attachment', $this-&boundary[1]);
case 'alt_inline_attach':
$body .= $this-&textLine('--' . $this-&boundary[1]);
$body .= $this-&headerLine('Content-Type', 'multipart/');
$body .= $this-&textLine(&\tboundary=\&& . $this-&boundary[2] . '&');
$body .= $this-≤
$body .= $this-&getBoundary($this-&boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
$body .= $this-&encodeString($this-&AltBody, $altBodyEncoding);
$body .= $this-&LE . $this-≤
$body .= $this-&textLine('--' . $this-&boundary[2]);
$body .= $this-&headerLine('Content-Type', 'multipart/');
$body .= $this-&textLine(&\tboundary=\&& . $this-&boundary[3] . '&');
$body .= $this-≤
$body .= $this-&getBoundary($this-&boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
$body .= $this-&encodeString($this-&Body, $bodyEncoding);
$body .= $this-&LE . $this-≤
$body .= $this-&attachAll('inline', $this-&boundary[3]);
$body .= $this-≤
$body .= $this-&endBoundary($this-&boundary[2]);
$body .= $this-≤
$body .= $this-&attachAll('attachment', $this-&boundary[1]);
// catch case 'plain' and case ''
$body .= $this-&encodeString($this-&Body, $bodyEncoding);
if ($this-&isError()) {
$body = '';
} elseif ($this-&sign_key_file) {
if (!defined('PKCS7_TEXT')) {
throw new phpmailerException($this-&lang('signing') . ' OpenSSL extension missing.');
//TODO would be nice to use php://temp streams here, but need to wrap for PHP & 5.1
$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://' . realpath($this-&sign_cert_file),
array('file://' . realpath($this-&sign_key_file), $this-&sign_key_pass),
@unlink($file);
$body = file_get_contents($signed);
@unlink($signed);
@unlink($file);
@unlink($signed);
throw new phpmailerException($this-&lang('signing') . openssl_error_string());
} catch (phpmailerException $exc) {
$body = '';
if ($this-&exceptions) {
* 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-&CharS
if ($contentType == '') {
$contentType = $this-&ContentT
if ($encoding == '') {
$encoding = $this-&E
$result .= $this-&textLine('--' . $boundary);
$result .= sprintf(&Content-Type: %s; charset=%s&, $contentType, $charSet);
$result .= $this-≤
//RFC1341 part 5 says 7bit is assumed if not specified
if ($encoding != '7bit') {
$result .= $this-&headerLine('Content-Transfer-Encoding', $encoding);
$result .= $this-≤
* Return the end of a message boundary.
* @access protected
* @param string $boundary
* @return string
protected function endBoundary($boundary)
return $this-&LE . '--' . $boundary . '--' . $this-≤
* 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-≤
* Return a formatted mail line.
* @access public
* @param string $value
* @return string
public function textLine($value)
return $value . $this-≤
* 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')
if (!@is_file($path)) {
throw new phpmailerException($this-&lang('file_access') . $path, self::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 == '') {
$this-&attachment[] = array(
0 =& $path,
1 =& $filename,
2 =& $name,
3 =& $encoding,
4 =& $type,
5 =& false, // isStringAttachment
6 =& $disposition,
} catch (phpmailerException $exc) {
$this-&setError($exc-&getMessage());
$this-&edebug($exc-&getMessage());
if ($this-&exceptions) {
* Return the array of attachments.
* @return array
public function getAttachments()
return $this-&
* 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];
$path = $attachment[0];
$inclhash = md5(serialize($attachment));
if (in_array($inclhash, $incl)) {
$incl[] = $
$name = $attachment[2];
$encoding = $attachment[3];
$type = $attachment[4];
$disposition = $attachment[6];
$cid = $attachment[7];
if ($disposition == 'inline' && isset($cidUniq[$cid])) {
$cidUniq[$cid] =
$mime[] = sprintf(&--%s%s&, $boundary, $this-&LE);
$mime[] = sprintf(
&Content-Type: %s; name=\&%s\&%s&,
$this-&encodeHeader($this-&secureHeader($name)),
//RFC1341 part 5 says 7bit is assumed if not specified
if ($encoding != '7bit') {
$mime[] = sprintf(&Content-Transfer-Encoding: %s%s&, $encoding, $this-&LE);
if ($disposition == 'inline') {
$mime[] = sprintf(&Content-ID: &%s&%s&, $cid, $this-&LE);
// If a filename contains any of these chars, it should be quoted,
// but not otherwise: RFC2183 & RFC
// 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
$mime[] = sprintf(
&Content-Disposition: %s; filename=%s%s&,
$disposition,
$this-&encodeHeader($this-&secureHeader($name)),
$this-&LE . $this-&LE
$mime[] = $this-≤
// Encode as string attachment
if ($bString) {
$mime[] = $this-&encodeString($string, $encoding);
if ($this-&isError()) {
return '';
$mime[] = $this-&LE . $this-≤
$mime[] = $this-&encodeFile($path, $encoding);
if ($this-&isError()) {
return '';
$mime[] = $this-&LE . $this-≤
$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 T one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
* @throws phpmailerException
* @see EncodeFile(encodeFile
* @access protected
* @return string
protected function encodeFile($path, $encoding = 'base64')
if (!is_readable($path)) {
throw new phpmailerException($this-&lang('file_open') . $path, self::STOP_CONTINUE);
$magic_quotes = get_magic_quotes_runtime();
if ($magic_quotes) {
if (version_compare(PHP_VERSION, '5.3.0', '&')) {
set_magic_quotes_runtime(0);
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);
ini_set('magic_quotes_runtime', $magic_quotes);
return $file_
} catch (Exception $exc) {
$this-&setError($exc-&getMessage());
return '';
* Encode a string in requested format.
* Returns an empty string on failure.
* @param string $str The text to encode
* @param string $encoding T 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);
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-≤
case 'binary':
$encoded = $
case 'quoted-printable':
$encoded = $this-&encodeQP($str);
$this-&setError($this-&lang('encoding') . $encoding);
* 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')
$matchcount = 0;
switch (strtolower($position)) {
case 'phrase':
if (!preg_match('/[\200-\377]/', $str)) {
// Can't use addslashes as we don't know the value of magic_quotes_sybase
$encoded = addcslashes($str, &\0..\37\177\\\&&);
if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
return ($encoded);
return (&\&$encoded\&&);
$matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
/** @noinspection PhpMissingBreakStatementInspection */
case 'comment':
$matchcount = preg_match_all('/[()&]/', $str, $matches);
// Intentional fall-through
case 'text':
$matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
if ($matchcount == 0) { //There are no chars that need encoding
return ($str);
$maxlen = 75 - 7 - strlen($this-&CharSet);
// Try to select the encoding which should produce the shortest output
if ($matchcount & 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&);
$encoded = base64_encode($str);
$maxlen -= $maxlen % 4;
$encoded = trim(chunk_split($encoded, $maxlen, &\n&));
$encoding = 'Q';
$encoded = $this-&encodeQ($str, $position);
$encoded = $this-&wrapText($encoded, $maxlen, true);
$encoded = str_replace('=' . self::CRLF, &\n&, trim($encoded));
$encoded = preg_replace('/^(.*)$/m', ' =?' . $this-&CharSet . &?$encoding?\\1?=&, $encoded);
$encoded = trim(str_replace(&\n&, $this-&LE, $encoded));
* 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)
* Does a string contain any 8-bit chars (in any charset)?
* @param string $text
* @return bool
public function has8bitChars($text)
return (bool)preg_match('/[\x80-\xFF]/', $text);
* Encode and wrap long multibyte strings for mail headers
* without breaking lines within a character.
* Adapted from a function by paravoid
* @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
* @access public
* @param string $str multi-byte text to wrap encode
* @param string $linebreak string to use as linefeed/end-of-line
* @return string
public function base64EncodeWrapMB($str, $linebreak = null)
$start = &=?& . $this-&CharSet . &?B?&;
$end = &?=&;
$encoded = &&;
if ($linebreak === null) {
$linebreak = $this-≤
$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_ $i += $offset) {
$lookBack = 0;
$offset = $avgLength - $lookB
$chunk = mb_substr($str, $i, $offset, $this-&CharSet);
$chunk = base64_encode($chunk);
$lookBack++;
} while (strlen($chunk) & $length);
$encoded .= $chunk . $
// Chomp the last linefeed
$encoded = substr($encoded, 0, -strlen($linebreak));
* 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 http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
public function encodeQP($string, $line_max = 76)
if (function_exists('quoted_printable_encode')) { //Use native function if it's available (&= PHP5.3)
return $this-&fixEOL(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 $this-&fixEOL($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(
$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!*+\/ -';
/** @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':
//RFC 2047 section 5.1
//Replace every high ascii, control, =, ? and _ characters
$pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $
$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
$eqkey = array_search('=', $matches[0]);
if ($eqkey !== false) {
unset($matches[0][$eqkey]);
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}

我要回帖

更多关于 iwebshop邮箱 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信