X-Git-Url: https://git.mxchange.org/?p=mailer.git;a=blobdiff_plain;f=inc%2Fphpmailer%2Fclass.phpmailer.php;h=114effae2eee232351b37f14b953db15e1b31f55;hp=0879aff5e298b6bcfba2c23fe4d0c93d8505077e;hb=d3c4fdd9bfab35389e1a5ff48f3952d527c7b4bb;hpb=8383fc52cd2340ea1756f9e1808fa3589e27c341 diff --git a/inc/phpmailer/class.phpmailer.php b/inc/phpmailer/class.phpmailer.php index 0879aff5e2..114effae2e 100644 --- a/inc/phpmailer/class.phpmailer.php +++ b/inc/phpmailer/class.phpmailer.php @@ -2,7 +2,7 @@ /*~ class.phpmailer.php .---------------------------------------------------------------------------. | Software: PHPMailer - PHP email class | -| Version: 2.0.0 rc3 | +| Version: 2.0.3 | | Contact: via sourceforge.net support pages (also www.codeworxtech.com) | | Info: http://phpmailer.sourceforge.net | | Support: http://sourceforge.net/projects/phpmailer/ | @@ -28,7 +28,7 @@ * PHPMailer - PHP email transport class * @package PHPMailer * @author Andy Prevost - * @copyright 2004 - 2007 Andy Prevost + * @copyright 2004 - 2008 Andy Prevost */ class PHPMailer { @@ -66,7 +66,7 @@ class PHPMailer { * Holds the most recent mailer error message. * @var string */ - var $ErrorInfo = ""; + var $ErrorInfo = ''; /** * Sets the From email address for the message. @@ -85,20 +85,20 @@ class PHPMailer { * will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode. * @var string */ - var $Sender = ""; + var $Sender = ''; /** * Sets the Subject of the message. * @var string */ - var $Subject = ""; + var $Subject = ''; /** * Sets the Body of the message. This can be either an HTML or text body. * If HTML then run IsHTML(true). * @var string */ - var $Body = ""; + var $Body = ''; /** * Sets the text-only body of the message. This automatically sets the @@ -107,7 +107,7 @@ class PHPMailer { * that can read HTML will view the normal Body. * @var string */ - var $AltBody = ""; + var $AltBody = ''; /** * Sets word wrapping on the body of the message to a given number of @@ -133,19 +133,19 @@ class PHPMailer { * is in a different directory than the PHP include path. * @var string */ - var $PluginDir = ""; + var $PluginDir = ''; /** * Holds PHPMailer version. * @var string */ - var $Version = "2.0.0 rc3"; + var $Version = "2.0.3"; /** * Sets the email address that a reading confirmation will be sent. * @var string */ - var $ConfirmReadingTo = ""; + var $ConfirmReadingTo = ''; /** * Sets the hostname to use in Message-Id and Received headers @@ -153,7 +153,14 @@ class PHPMailer { * by SERVER_NAME is used or 'localhost.localdomain'. * @var string */ - var $Hostname = ""; + var $Hostname = ''; + + /** + * Sets the message id to be used in the Message-Id header. + * If empty, a unique id will be generated. + * @var string + */ + var $MessageID = ''; ///////////////////////////////////////////////// // PROPERTIES FOR SMTP @@ -179,7 +186,7 @@ class PHPMailer { * Sets the SMTP HELO of the message (Default is $Hostname). * @var string */ - var $Helo = ""; + var $Helo = ''; /** * Sets connection prefix. @@ -198,13 +205,13 @@ class PHPMailer { * Sets SMTP username. * @var string */ - var $Username = ""; + var $Username = ''; /** * Sets SMTP password. * @var string */ - var $Password = ""; + var $Password = ''; /** * Sets the SMTP server timeout in seconds. This function will not @@ -245,11 +252,14 @@ class PHPMailer { var $ReplyTo = array(); var $attachment = array(); var $CustomHeader = array(); - var $message_type = ""; + var $message_type = ''; var $boundary = array(); var $language = array(); var $error_count = 0; - var $LE = "\n"; + var $LE = "\r\n"; + var $sign_cert_file = ""; + var $sign_key_file = ""; + var $sign_key_pass = ""; ///////////////////////////////////////////////// // METHODS, VARIABLES @@ -311,7 +321,7 @@ class PHPMailer { * @param string $name * @return void */ - function AddAddress($address, $name = "") { + function AddAddress($address, $name = '') { $cur = count($this->to); $this->to[$cur][0] = trim($address); $this->to[$cur][1] = $name; @@ -325,7 +335,7 @@ class PHPMailer { * @param string $name * @return void */ - function AddCC($address, $name = "") { + function AddCC($address, $name = '') { $cur = count($this->cc); $this->cc[$cur][0] = trim($address); $this->cc[$cur][1] = $name; @@ -339,7 +349,7 @@ class PHPMailer { * @param string $name * @return void */ - function AddBCC($address, $name = "") { + function AddBCC($address, $name = '') { $cur = count($this->bcc); $this->bcc[$cur][0] = trim($address); $this->bcc[$cur][1] = $name; @@ -351,7 +361,7 @@ class PHPMailer { * @param string $name * @return void */ - function AddReplyTo($address, $name = "") { + function AddReplyTo($address, $name = '') { $cur = count($this->ReplyTo); $this->ReplyTo[$cur][0] = trim($address); $this->ReplyTo[$cur][1] = $name; @@ -368,8 +378,8 @@ class PHPMailer { * @return bool */ function Send() { - $header = ""; - $body = ""; + $header = ''; + $body = ''; $result = true; if((count($this->to) + count($this->cc) + count($this->bcc)) < 1) { @@ -387,7 +397,7 @@ class PHPMailer { $header .= $this->CreateHeader(); $body = $this->CreateBody(); - if($body == "") { + if($body == '') { return false; } @@ -433,12 +443,14 @@ class PHPMailer { fputs($mail, $header); fputs($mail, $body); - $result = pclose($mail) >> 8 & 0xFF; + $result = pclose($mail); + if (version_compare(phpversion(), '4.2.3') == -1) { + $result = $result >> 8 & 0xFF; + } if($result != 0) { $this->SetError($this->Lang('execute') . $this->Sendmail); return false; } - return true; } @@ -449,7 +461,7 @@ class PHPMailer { */ function MailSend($header, $body) { - $to = ""; + $to = ''; for($i = 0; $i < count($this->to); $i++) { if($i != 0) { $to .= ', '; } $to .= $this->AddrFormat($this->to[$i]); @@ -457,10 +469,10 @@ class PHPMailer { $toArr = split(',', $to); - if ($this->Sender != '' && strlen(ini_get('safe_mode'))< 1) { + $params = sprintf("-oi -f %s", $this->Sender); + if ($this->Sender != '' && strlen(ini_get('safe_mode')) < 1) { $old_from = ini_get('sendmail_from'); ini_set('sendmail_from', $this->Sender); - $params = sprintf("-oi -f %s", $this->Sender); if ($this->SingleTo === true && count($toArr) > 1) { foreach ($toArr as $key => $val) { $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); @@ -499,14 +511,14 @@ class PHPMailer { */ function SmtpSend($header, $body) { include_once($this->PluginDir . 'class.smtp.php'); - $error = ""; + $error = ''; $bad_rcpt = array(); if(!$this->SmtpConnect()) { return false; } - $smtp_from = ($this->Sender == "") ? $this->From : $this->Sender; + $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender; if(!$this->smtp->Mail($smtp_from)) { $error = $this->Lang('from_failed') . $smtp_from; $this->SetError($error); @@ -585,7 +597,7 @@ class PHPMailer { $port = $this->Port; } - if($this->smtp->Connect(((!empty($this->SMTPSecure))?$this->SMTPSecure.'://':"").$host, $port, $this->Timeout)) { + if($this->smtp->Connect(((!empty($this->SMTPSecure))?$this->SMTPSecure.'://':'').$host, $port, $this->Timeout)) { if ($this->Helo != '') { $this->smtp->Hello($this->Helo); } else { @@ -638,8 +650,20 @@ class PHPMailer { } elseif (file_exists($lang_path.'phpmailer.lang-en.php')) { include($lang_path.'phpmailer.lang-en.php'); } else { - $this->SetError('Could not load language file'); - return false; + $PHPMAILER_LANG = array(); + $PHPMAILER_LANG["provide_address"] = 'You must provide at least one ' . + $PHPMAILER_LANG["mailer_not_supported"] = ' mailer is not supported.'; + $PHPMAILER_LANG["execute"] = 'Could not execute: '; + $PHPMAILER_LANG["instantiate"] = 'Could not instantiate mail function.'; + $PHPMAILER_LANG["authenticate"] = 'SMTP Error: Could not authenticate.'; + $PHPMAILER_LANG["from_failed"] = 'The following From address failed: '; + $PHPMAILER_LANG["recipients_failed"] = 'SMTP Error: The following ' . + $PHPMAILER_LANG["data_not_accepted"] = 'SMTP Error: Data not accepted.'; + $PHPMAILER_LANG["connect_host"] = 'SMTP Error: Could not connect to SMTP host.'; + $PHPMAILER_LANG["file_access"] = 'Could not access file: '; + $PHPMAILER_LANG["file_open"] = 'File Error: Could not open file: '; + $PHPMAILER_LANG["encoding"] = 'Unknown encoding: '; + $PHPMAILER_LANG["signing"] = 'Signing Error: '; } $this->language = $PHPMAILER_LANG; @@ -692,6 +716,9 @@ class PHPMailer { */ 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"); $message = $this->FixEOL($message); if (substr($message, -1) == $this->LE) { @@ -699,10 +726,10 @@ class PHPMailer { } $line = explode($this->LE, $message); - $message = ""; + $message = ''; for ($i=0 ;$i < count($line); $i++) { $line_part = explode(' ', $line[$i]); - $buf = ""; + $buf = ''; for ($e = 0; $e $length)) { @@ -710,9 +737,11 @@ class PHPMailer { if ($e != 0) { if ($space_left > 20) { $len = $space_left; - if (substr($word, $len - 1, 1) == '=') { + if ($is_utf8) { + $len = $this->UTF8CharBoundary($word, $len); + } elseif (substr($word, $len - 1, 1) == "=") { $len--; - } elseif (substr($word, $len - 2, 1) == '=') { + } elseif (substr($word, $len - 2, 1) == "=") { $len -= 2; } $part = substr($word, 0, $len); @@ -722,13 +751,15 @@ class PHPMailer { } else { $message .= $buf . $soft_break; } - $buf = ""; + $buf = ''; } while (strlen($word) > 0) { $len = $length; - if (substr($word, $len - 1, 1) == '=') { + if ($is_utf8) { + $len = $this->UTF8CharBoundary($word, $len); + } elseif (substr($word, $len - 1, 1) == "=") { $len--; - } elseif (substr($word, $len - 2, 1) == '=') { + } elseif (substr($word, $len - 2, 1) == "=") { $len -= 2; } $part = substr($word, 0, $len); @@ -756,6 +787,47 @@ class PHPMailer { return $message; } + /** + * Finds last character boundary prior to maxLength in a utf-8 + * quoted (printable) encoded string. + * Original written by Colin Brown. + * @access private + * @param string $encodedText utf-8 QP text + * @param int $maxLength find last character boundary prior to this length + * @return int + */ + 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 + 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 = 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 private @@ -784,7 +856,7 @@ class PHPMailer { * @return string */ function CreateHeader() { - $result = ""; + $result = ''; /* Set the boundaries */ $uniq_id = md5(uniqid(time())); @@ -792,7 +864,7 @@ class PHPMailer { $this->boundary[2] = 'b2_' . $uniq_id; $result .= $this->HeaderLine('Date', $this->RFCDate()); - if($this->Sender == "") { + if($this->Sender == '') { $result .= $this->HeaderLine('Return-Path', trim($this->From)); } else { $result .= $this->HeaderLine('Return-Path', trim($this->Sender)); @@ -805,9 +877,6 @@ class PHPMailer { } elseif (count($this->cc) == 0) { $result .= $this->HeaderLine('To', 'undisclosed-recipients:;'); } - if(count($this->cc) > 0) { - $result .= $this->AddrAppend('Cc', $this->cc); - } } $from = array(); @@ -834,7 +903,11 @@ class PHPMailer { $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject))); } - $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE); + if($this->MessageID != '') { + $result .= $this->HeaderLine('Message-Id',$this->MessageID); + } else { + $result .= sprintf("Message-Id: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE); + } $result .= $this->HeaderLine('X-Priority', $this->Priority); $result .= $this->HeaderLine('X-Mailer', 'PHPMailer (phpmailer.sourceforge.net) [version ' . $this->Version . ']'); @@ -846,8 +919,21 @@ class PHPMailer { for($index = 0; $index < count($this->CustomHeader); $index++) { $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1]))); } - $result .= $this->HeaderLine('MIME-Version', '1.0'); + if (!$this->sign_key_file) { + $result .= $this->HeaderLine('MIME-Version', '1.0'); + $result .= $this->GetMailMIME(); + } + return $result; + } + + /** + * Returns the message MIME. + * @access private + * @return string + */ + function GetMailMIME() { + $result = ''; switch($this->message_type) { case 'plain': $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding); @@ -882,16 +968,19 @@ class PHPMailer { * @return string */ function CreateBody() { - $result = ""; + $result = ''; + if ($this->sign_key_file) { + $result .= $this->GetMailMIME(); + } $this->SetWordWrap(); switch($this->message_type) { case 'alt': - $result .= $this->GetBoundary($this->boundary[1], "", 'text/plain', ""); + $result .= $this->GetBoundary($this->boundary[1], '', 'text/plain', ''); $result .= $this->EncodeString($this->AltBody, $this->Encoding); $result .= $this->LE.$this->LE; - $result .= $this->GetBoundary($this->boundary[1], "", 'text/html', ""); + $result .= $this->GetBoundary($this->boundary[1], '', 'text/html', ''); $result .= $this->EncodeString($this->Body, $this->Encoding); $result .= $this->LE.$this->LE; $result .= $this->EndBoundary($this->boundary[1]); @@ -900,7 +989,7 @@ class PHPMailer { $result .= $this->EncodeString($this->Body, $this->Encoding); break; case 'attachments': - $result .= $this->GetBoundary($this->boundary[1], "", "", ""); + $result .= $this->GetBoundary($this->boundary[1], '', '', ''); $result .= $this->EncodeString($this->Body, $this->Encoding); $result .= $this->LE; $result .= $this->AttachAll(); @@ -908,18 +997,41 @@ class PHPMailer { case 'alt_attachments': $result .= sprintf("--%s%s", $this->boundary[1], $this->LE); $result .= sprintf("Content-Type: %s;%s" . "\tboundary=\"%s\"%s", 'multipart/alternative', $this->LE, $this->boundary[2], $this->LE.$this->LE); - $result .= $this->GetBoundary($this->boundary[2], "", 'text/plain', "") . $this->LE; // Create text body + $result .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '') . $this->LE; // Create text body $result .= $this->EncodeString($this->AltBody, $this->Encoding); $result .= $this->LE.$this->LE; - $result .= $this->GetBoundary($this->boundary[2], "", 'text/html', "") . $this->LE; // Create the HTML body + $result .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body $result .= $this->EncodeString($this->Body, $this->Encoding); $result .= $this->LE.$this->LE; $result .= $this->EndBoundary($this->boundary[2]); $result .= $this->AttachAll(); break; } + if($this->IsError()) { - $result = ""; + $result = ''; + } else if ($this->sign_key_file) { + $file = tempnam("", "mail"); + $fp = fopen($file, "w"); + fwrite($fp, $result); + fclose($fp); + $signed = tempnam("", "signed"); + + if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_cert_file, array("file://".$this->sign_key_file, $this->sign_key_pass), null)) { + $fp = fopen($signed, "r"); + $result = fread($fp, filesize($this->sign_key_file)); + $result = ''; + while(!feof($fp)){ + $result = $result . fread($fp, 1024); + } + fclose($fp); + } else { + $this->SetError($this->Lang("signing").openssl_error_string()); + $result = ''; + } + + unlink($file); + unlink($signed); } return $result; @@ -930,14 +1042,14 @@ class PHPMailer { * @access private */ function GetBoundary($boundary, $charSet, $contentType, $encoding) { - $result = ""; - if($charSet == "") { + $result = ''; + if($charSet == '') { $charSet = $this->CharSet; } - if($contentType == "") { + if($contentType == '') { $contentType = $this->ContentType; } - if($encoding == "") { + if($encoding == '') { $encoding = $this->Encoding; } $result .= $this->TextLine('--' . $boundary); @@ -1009,14 +1121,14 @@ class PHPMailer { * @param string $type File extension (MIME) type. * @return bool */ - function AddAttachment($path, $name = "", $encoding = 'base64', $type = 'application/octet-stream') { + function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { if(!@is_file($path)) { $this->SetError($this->Lang('file_access') . $path); return false; } $filename = basename($path); - if($name == "") { + if($name == '') { $name = $filename; } @@ -1061,26 +1173,26 @@ class PHPMailer { $cid = $this->attachment[$i][7]; $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE); - $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $name, $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); + $mime[] = sprintf("Content-Id: <%s>%s", $cid, $this->LE); } - $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $name, $this->LE.$this->LE); + $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $this->EncodeHeader($this->SecureHeader($name)), $this->LE.$this->LE); /* Encode as string attachment */ if($bString) { $mime[] = $this->EncodeString($string, $encoding); if($this->IsError()) { - return ""; + return ''; } $mime[] = $this->LE.$this->LE; } else { $mime[] = $this->EncodeFile($path, $encoding); if($this->IsError()) { - return ""; + return ''; } $mime[] = $this->LE.$this->LE; } @@ -1088,7 +1200,7 @@ class PHPMailer { $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE); - return join("", $mime); + return join('', $mime); } /** @@ -1100,7 +1212,7 @@ class PHPMailer { function EncodeFile ($path, $encoding = 'base64') { if(!@$fd = fopen($path, 'rb')) { $this->SetError($this->Lang('file_open') . $path); - return ""; + return ''; } $magic_quotes = get_magic_quotes_runtime(); set_magic_quotes_runtime(0); @@ -1119,7 +1231,7 @@ class PHPMailer { * @return string */ function EncodeString ($str, $encoding = 'base64') { - $encoded = ""; + $encoded = ''; switch(strtolower($encoding)) { case 'base64': /* chunk_split is found in PHP >= 3.0.6 */ @@ -1182,9 +1294,15 @@ class PHPMailer { /* Try to select the encoding which should produce the shortest output */ if (strlen($str)/3 < $x) { $encoding = 'B'; - $encoded = base64_encode($str); - $maxlen -= $maxlen % 4; - $encoded = trim(chunk_split($encoded, $maxlen, "\n")); + 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); + } else { + $encoded = base64_encode($str); + $maxlen -= $maxlen % 4; + $encoded = trim(chunk_split($encoded, $maxlen, "\n")); + } } else { $encoding = 'Q'; $encoded = $this->EncodeQ($str, $position); @@ -1198,20 +1316,74 @@ class PHPMailer { return $encoded; } + /** + * Checks if a string contains multibyte characters. + * @access private + * @param string $str multi-byte text to wrap encode + * @return bool + */ + 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; + } + } + + /** + * Correctly encodes and wraps 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 private + * @param string $str multi-byte text to wrap encode + * @return string + */ + function Base64EncodeWrapMB($str) { + $start = "=?".$this->CharSet."?B?"; + $end = "?="; + $encoded = ""; + + $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 + $offset = $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 . $this->LE; + } + + // Chomp the last linefeed + $encoded = substr($encoded, 0, -strlen($this->LE)); + return $encoded; + } + /** * Encode string to quoted-printable. * @access private * @return string */ - function EncodeQP( $input = "", $line_max = 76, $space_conv = false ) { + function EncodeQP( $input = '', $line_max = 76, $space_conv = false ) { $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); $lines = preg_split('/(?:\r\n|\r|\n)/', $input); $eol = "\r\n"; $escape = '='; - $output = ""; + $output = ''; while( list(, $line) = each($lines) ) { $linlen = strlen($line); - $newline = ""; + $newline = ''; for($i = 0; $i < $linlen; $i++) { $c = substr( $line, $i, 1 ); $dec = ord( $c ); @@ -1231,7 +1403,7 @@ class PHPMailer { } if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay - $newline = ""; + $newline = ''; // check if newline first character will be point or not if ( $dec == 46 ) { $c = '=2E'; @@ -1241,7 +1413,7 @@ class PHPMailer { } // end of for $output .= $newline.$eol; } // end of while - return trim($output); + return $output; } /** @@ -1251,7 +1423,7 @@ class PHPMailer { */ function EncodeQ ($str, $position = 'text') { /* There should not be any EOL in the string */ - $encoded = preg_replace("[\r\n]", "", $str); + $encoded = preg_replace("[\r\n]", '', $str); switch (strtolower($position)) { case 'phrase': @@ -1302,14 +1474,14 @@ class PHPMailer { * image type. For JPEG images use "image/jpeg" and for GIF images * use "image/gif". * @param string $path Path to the attachment. - * @param string $cid Content ID of the attachment. Use this to identify + * @param string $cid Content id of the attachment. Use this to identify * the Id for accessing the image in an HTML form. * @param string $name Overrides the attachment name. * @param string $encoding File encoding (see $Encoding). * @param string $type File extension (MIME) type. * @return bool */ - function AddEmbeddedImage($path, $cid, $name = "", $encoding = 'base64', $type = 'application/octet-stream') { + function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { if(!@is_file($path)) { $this->SetError($this->Lang('file_access') . $path); @@ -1317,7 +1489,7 @@ class PHPMailer { } $filename = basename($path); - if($name == "") { + if($name == '') { $name = $filename; } @@ -1467,7 +1639,7 @@ class PHPMailer { if(isset($_SERVER[$varName])) { return $_SERVER[$varName]; } else { - return ""; + return ''; } } @@ -1538,25 +1710,32 @@ class PHPMailer { * @access public * @return $message */ - function MsgHTML($message) { + function MsgHTML($message,$basedir='') { preg_match_all("/(src|background)=\"(.*)\"/Ui", $message, $images); if(isset($images[2])) { foreach($images[2] as $i => $url) { - $filename = basename($url); - $directory = dirname($url); - $cid = 'cid:' . md5($filename); - $fileParts = split("\.", $filename); - $ext = $fileParts[1]; - $mimeType = $this->_mime_types($ext); - $message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message); - $this->AddEmbeddedImage($url, md5($filename), $filename, 'base64', $mimeType); + // do not change urls for absolute images (thanks to corvuscorax) + if (!preg_match('/^[A-z][A-z]*:\/\//',$url)) { + $filename = basename($url); + $directory = dirname($url); + ($directory == '.')?$directory='':''; + $cid = 'cid:' . md5($filename); + $fileParts = split("\.", $filename); + $ext = $fileParts[1]; + $mimeType = $this->_mime_types($ext); + if ( strlen($basedir) > 1 && substr($basedir,-1) != '/') { $basedir .= '/'; } + if ( strlen($directory) > 1 && substr($directory,-1) != '/') { $directory .= '/'; } + if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64',$mimeType) ) { + $message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message); + } + } } } $this->IsHTML(true); $this->Body = $message; - $textMsg = trim(strip_tags($message)); + $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message))); if ( !empty($textMsg) && empty($this->AltBody) ) { - $this->AltBody = $textMsg; + $this->AltBody = html_entity_decode($textMsg); } if ( empty($this->AltBody) ) { $this->AltBody = 'To view this email message, open the email in with HTML compatibility!' . "\n\n"; @@ -1568,97 +1747,96 @@ class PHPMailer { * @access private * @return mime type of ext */ - function _mime_types($ext = "") { + function _mime_types($ext = '') { $mimes = array( - 'hqx' => 'application/mac-binhex40', - 'cpt' => 'application/mac-compactpro', - 'doc' => 'application/msword', + 'ai' => 'application/postscript', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'avi' => 'video/x-msvideo', 'bin' => 'application/macbinary', - 'dms' => 'application/octet-stream', - 'lha' => 'application/octet-stream', - 'lzh' => 'application/octet-stream', - 'exe' => 'application/octet-stream', + 'bmp' => 'image/bmp', 'class' => 'application/octet-stream', - 'psd' => 'application/octet-stream', - 'so' => 'application/octet-stream', - 'sea' => 'application/octet-stream', - 'dll' => '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', + 'cpt' => 'application/mac-compactpro', + 'css' => 'text/css', 'dcr' => 'application/x-director', 'dir' => 'application/x-director', - 'dxr' => 'application/x-director', + 'dll' => 'application/octet-stream', + 'dms' => 'application/octet-stream', + 'doc' => 'application/msword', 'dvi' => 'application/x-dvi', + 'dxr' => 'application/x-director', + 'eml' => 'message/rfc822', + 'eps' => 'application/postscript', + 'exe' => 'application/octet-stream', + 'gif' => 'image/gif', 'gtar' => 'application/x-gtar', - 'php' => 'application/x-httpd-php', - 'php4' => 'application/x-httpd-php', - 'php3' => 'application/x-httpd-php', - 'phtml' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', + 'htm' => 'text/html', + 'html' => 'text/html', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'hqx' => 'application/mac-binhex40', 'js' => 'application/x-javascript', - 'swf' => 'application/x-shockwave-flash', - 'sit' => 'application/x-stuffit', - 'tar' => 'application/x-tar', - 'tgz' => 'application/x-tar', - 'xhtml' => 'application/xhtml+xml', - 'xht' => 'application/xhtml+xml', - 'zip' => 'application/zip', + 'lha' => 'application/octet-stream', + 'log' => 'text/plain', + 'lzh' => 'application/octet-stream', 'mid' => 'audio/midi', 'midi' => 'audio/midi', - 'mpga' => 'audio/mpeg', + 'mif' => 'application/vnd.mif', + 'mov' => 'video/quicktime', + 'movie' => 'video/x-sgi-movie', 'mp2' => 'audio/mpeg', 'mp3' => 'audio/mpeg', - 'aif' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpga' => 'audio/mpeg', + 'oda' => 'application/oda', + 'pdf' => 'application/pdf', + 'php' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'php4' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'phtml' => 'application/x-httpd-php', + 'png' => 'image/png', + 'ppt' => 'application/vnd.ms-powerpoint', + 'ps' => 'application/postscript', + 'psd' => 'application/octet-stream', + 'qt' => 'video/quicktime', + 'ra' => 'audio/x-realaudio', 'ram' => 'audio/x-pn-realaudio', 'rm' => 'audio/x-pn-realaudio', 'rpm' => 'audio/x-pn-realaudio-plugin', - 'ra' => 'audio/x-realaudio', + 'rtf' => 'text/rtf', + 'rtx' => 'text/richtext', 'rv' => 'video/vnd.rn-realvideo', - 'wav' => 'audio/x-wav', - 'bmp' => 'image/bmp', - 'gif' => 'image/gif', - 'jpeg' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'jpe' => 'image/jpeg', - 'png' => 'image/png', - 'tiff' => 'image/tiff', - 'tif' => 'image/tiff', - 'css' => 'text/css', - 'html' => 'text/html', - 'htm' => 'text/html', + 'sea' => 'application/octet-stream', 'shtml' => 'text/html', - 'txt' => 'text/plain', + 'sit' => 'application/x-stuffit', + 'so' => 'application/octet-stream', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'swf' => 'application/x-shockwave-flash', + 'tar' => 'application/x-tar', 'text' => 'text/plain', - 'log' => 'text/plain', - 'rtx' => 'text/richtext', - 'rtf' => 'text/rtf', - 'xml' => 'text/xml', - 'xsl' => 'text/xml', - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpe' => 'video/mpeg', - 'qt' => 'video/quicktime', - 'mov' => 'video/quicktime', - 'avi' => 'video/x-msvideo', - 'movie' => 'video/x-sgi-movie', - 'doc' => 'application/msword', + 'txt' => 'text/plain', + 'tgz' => 'application/x-tar', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'wav' => 'audio/x-wav', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wmlc' => 'application/vnd.wap.wmlc', 'word' => 'application/msword', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', 'xl' => 'application/excel', - 'eml' => 'message/rfc822' + 'xls' => 'application/vnd.ms-excel', + 'xml' => 'text/xml', + 'xsl' => 'text/xml', + 'zip' => 'application/zip' ); - return ( ! isset($mimes[strtolower($ext)])) ? 'application/x-unknown-content-type' : $mimes[strtolower($ext)]; + return ( ! isset($mimes[strtolower($ext)])) ? 'application/octet-stream' : $mimes[strtolower($ext)]; } /** @@ -1672,7 +1850,7 @@ class PHPMailer { * @param mixed $value Parameter Value * NOTE: will not work with arrays, there are no arrays to set/reset */ - function set ( $name, $value = "" ) { + function set ( $name, $value = '' ) { if ( isset($this->$name) ) { $this->$name = $value; } else { @@ -1688,7 +1866,7 @@ class PHPMailer { * @param string $filename Parameter File Name */ function getFile($filename) { - $return = ""; + $return = ''; if ($fp = fopen($filename, 'rb')) { while (!feof($fp)) { $return .= fread($fp, 1024); @@ -1713,6 +1891,19 @@ class PHPMailer { return $str; } + /** + * Set the private key file and password to sign the message. + * + * @access public + * @param string $key_filename Parameter File Name + * @param string $key_pass Password for private key + */ + 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; + } + } -?> +?> \ No newline at end of file