/myproj/class.phpmailer.php
PHP | 2057 lines | 1499 code | 203 blank | 355 comment | 230 complexity | c988160bbe1165de1d661dfd06b327f2 MD5 | raw file
Large files files are truncated, but you can click here to view the full file
- <?php
-
- // *****************
- //
- //Programmer : Ms. Mihika Jain
- //Student ID : 12526075
- //Contact email : mihika.jain@my.jcu.edu.au
- //
- // *****************
-
- if (version_compare(PHP_VERSION, '5.0.0', '<') ) exit("Sorry, this version of PHPMailer will only run on PHP version 5 or greater!\n");
- class PHPMailer {
- public $Priority = 3;
-
- public $CharSet = 'iso-8859-1';
-
- public $ContentType = 'text/plain';
-
- public $Encoding = '8bit';
-
- public $ErrorInfo = '';
-
- public $From = 'root@localhost';
-
- public $FromName = 'Root User';
-
- public $Sender = '';
- public $Subject = '';
-
- public $Body = '';
-
- public $AltBody = '';
-
- protected $MIMEBody = '';
-
- protected $MIMEHeader = '';
-
- public $WordWrap = 0;
-
- public $Mailer = 'mail';
-
- public $Sendmail = '/usr/sbin/sendmail';
-
- public $PluginDir = '';
-
- public $ConfirmReadingTo = '';
-
- public $Hostname = '';
-
- public $MessageID = '';
-
- public $Host = 'localhost';
-
- public $Port = 25;
-
- public $Helo = '';
-
- public $SMTPSecure = '';
-
- public $SMTPAuth = false;
-
- public $Username = '';
-
- public $Password = '';
-
- public $Timeout = 10;
-
- public $SMTPDebug = false;
- public $SMTPKeepAlive = false;
-
- public $SingleTo = false;
-
- public $SingleToArray = array();
- public $LE = "\n";
-
- public $DKIM_selector = 'phpmailer';
-
- public $DKIM_identity = '';
-
- public $DKIM_passphrase = '';
-
- public $DKIM_domain = '';
-
- public $DKIM_private = '';
- public $action_function = ''; //'callbackAction';
-
- public $Version = '5.2';
-
- public $XMailer = '';
-
- protected $smtp = NULL;
- protected $to = array();
- protected $cc = array();
- protected $bcc = array();
- protected $ReplyTo = array();
- protected $all_recipients = array();
- protected $attachment = array();
- protected $CustomHeader = array();
- protected $message_type = '';
- protected $boundary = array();
- protected $language = array();
- protected $error_count = 0;
- protected $sign_cert_file = '';
- protected $sign_key_file = '';
- protected $sign_key_pass = '';
- protected $exceptions = false;
-
- const STOP_MESSAGE = 0; // message only, continue processing
- const STOP_CONTINUE = 1; // message?, likely ok to continue processing
- const STOP_CRITICAL = 2; // message, plus full stop, critical error reached
- /////////////////////////////////////////////////
- // METHODS, VARIABLES
- /////////////////////////////////////////////////
- /**
- * Constructor
- * @param boolean $exceptions Should we throw external exceptions?
- */
- public function __construct($exceptions = false) {
- $this->exceptions = ($exceptions == true);
- }
- /**
- * Sets message type to HTML.
- * @param bool $ishtml
- * @return void
- */
- public function IsHTML($ishtml = true) {
- if ($ishtml) {
- $this->ContentType = 'text/html';
- } else {
- $this->ContentType = 'text/plain';
- }
- }
- /**
- * Sets Mailer to send message using SMTP.
- * @return void
- */
- public function IsSMTP() {
- $this->Mailer = 'smtp';
- }
- /**
- * Sets Mailer to send message using PHP mail() function.
- * @return void
- */
- public function IsMail() {
- $this->Mailer = 'mail';
- }
- /**
- * Sets Mailer to send message using the $Sendmail program.
- * @return void
- */
- public function IsSendmail() {
- if (!stristr(ini_get('sendmail_path'), 'sendmail')) {
- $this->Sendmail = '/var/qmail/bin/sendmail';
- }
- $this->Mailer = 'sendmail';
- }
- /**
- * Sets Mailer to send message using the qmail MTA.
- * @return void
- */
- public function IsQmail() {
- if (stristr(ini_get('sendmail_path'), 'qmail')) {
- $this->Sendmail = '/var/qmail/bin/sendmail';
- }
- $this->Mailer = 'sendmail';
- }
- /////////////////////////////////////////////////
- // METHODS, RECIPIENTS
- /////////////////////////////////////////////////
- /**
- * Adds a "To" address.
- * @param string $address
- * @param string $name
- * @return boolean true on success, false if address already used
- */
- public function AddAddress($address, $name = '') {
- return $this->AddAnAddress('to', $address, $name);
- }
- /**
- * Adds 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 boolean true on success, false if address already used
- */
- public function AddCC($address, $name = '') {
- return $this->AddAnAddress('cc', $address, $name);
- }
- /**
- * Adds 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 boolean true on success, false if address already used
- */
- public function AddBCC($address, $name = '') {
- return $this->AddAnAddress('bcc', $address, $name);
- }
- /**
- * Adds a "Reply-to" address.
- * @param string $address
- * @param string $name
- * @return boolean
- */
- public function AddReplyTo($address, $name = '') {
- return $this->AddAnAddress('ReplyTo', $address, $name);
- }
- /**
- * Adds 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
- * @return boolean 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|ReplyTo)$/', $kind)) {
- $this->SetError($this->Lang('Invalid recipient array').': '.$kind);
- if ($this->exceptions) {
- throw new phpmailerException('Invalid recipient array: ' . $kind);
- }
- echo $this->Lang('Invalid recipient array').': '.$kind;
- return false;
- }
- $address = trim($address);
- $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
- if (!self::ValidateAddress($address)) {
- $this->SetError($this->Lang('invalid_address').': '. $address);
- if ($this->exceptions) {
- throw new phpmailerException($this->Lang('invalid_address').': '.$address);
- }
- echo $this->Lang('invalid_address').': '.$address;
- return false;
- }
- if ($kind != 'ReplyTo') {
- if (!isset($this->all_recipients[strtolower($address)])) {
- array_push($this->$kind, array($address, $name));
- $this->all_recipients[strtolower($address)] = true;
- return true;
- }
- } else {
- if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
- $this->ReplyTo[strtolower($address)] = array($address, $name);
- return true;
- }
- }
- return false;
- }
- /**
- * Set the From and FromName properties
- * @param string $address
- * @param string $name
- * @return boolean
- */
- public function SetFrom($address, $name = '', $auto = 1) {
- $address = trim($address);
- $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
- if (!self::ValidateAddress($address)) {
- $this->SetError($this->Lang('invalid_address').': '. $address);
- if ($this->exceptions) {
- throw new phpmailerException($this->Lang('invalid_address').': '.$address);
- }
- echo $this->Lang('invalid_address').': '.$address;
- return false;
- }
- $this->From = $address;
- $this->FromName = $name;
- if ($auto) {
- if (empty($this->ReplyTo)) {
- $this->AddAnAddress('ReplyTo', $address, $name);
- }
- if (empty($this->Sender)) {
- $this->Sender = $address;
- }
- }
- return true;
- }
- /**
- * Check that a string looks roughly like an email address should
- * Static so it can be used without instantiation
- * Tries to use PHP built-in validator in the filter extension (from PHP 5.2), falls back to a reasonably competent regex validator
- * Conforms approximately to RFC2822
- * @link http://www.hexillion.com/samples/#Regex Original pattern found here
- * @param string $address The email address to check
- * @return boolean
- * @static
- * @access public
- */
- public static function ValidateAddress($address) {
- if (function_exists('filter_var')) { //Introduced in PHP 5.2
- if(filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) {
- return false;
- } else {
- return true;
- }
- } else {
- return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[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_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address);
- }
- }
- /////////////////////////////////////////////////
- // METHODS, MAIL SENDING
- /////////////////////////////////////////////////
- /**
- * Creates message and assigns Mailer. If the message is
- * not sent successfully then it returns false. Use the ErrorInfo
- * variable to view description of the error.
- * @return bool
- */
- public function Send() {
- try {
- if(!$this->PreSend()) return false;
- return $this->PostSend();
- } catch (phpmailerException $e) {
- $this->SetError($e->getMessage());
- if ($this->exceptions) {
- throw $e;
- }
- return false;
- }
- }
- protected function PreSend() {
- try {
- 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
- if (empty($this->Body)) {
- throw new phpmailerException($this->Lang('empty_message'), self::STOP_CRITICAL);
- }
- $this->MIMEHeader = $this->CreateHeader();
- $this->MIMEBody = $this->CreateBody();
- // digitally sign with DKIM if enabled
- if ($this->DKIM_domain && $this->DKIM_private) {
- $header_dkim = $this->DKIM_Add($this->MIMEHeader, $this->EncodeHeader($this->SecureHeader($this->Subject)), $this->MIMEBody);
- $this->MIMEHeader = str_replace("\r\n", "\n", $header_dkim) . $this->MIMEHeader;
- }
- return true;
- } catch (phpmailerException $e) {
- $this->SetError($e->getMessage());
- if ($this->exceptions) {
- throw $e;
- }
- return false;
- }
- }
- protected function PostSend() {
- try {
- // Choose the mailer and send through it
- switch($this->Mailer) {
- case 'sendmail':
- return $this->SendmailSend($this->MIMEHeader, $this->MIMEBody);
- case 'smtp':
- return $this->SmtpSend($this->MIMEHeader, $this->MIMEBody);
- default:
- return $this->MailSend($this->MIMEHeader, $this->MIMEBody);
- }
- } catch (phpmailerException $e) {
- $this->SetError($e->getMessage());
- if ($this->exceptions) {
- throw $e;
- }
- echo $e->getMessage()."\n";
- return false;
- }
- }
- /**
- * Sends mail using the $Sendmail program.
- * @param string $header The message headers
- * @param string $body The message body
- * @access protected
- * @return bool
- */
- protected function SendmailSend($header, $body) {
- if ($this->Sender != '') {
- $sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
- } else {
- $sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail));
- }
- if ($this->SingleTo === true) {
- foreach ($this->SingleToArray as $key => $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);
- if($result != 0) {
- throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
- }
- }
- } else {
- 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);
- if($result != 0) {
- throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
- }
- }
- return true;
- }
- /**
- * Sends mail using the PHP mail() function.
- * @param string $header The message headers
- * @param string $body The message body
- * @access protected
- * @return bool
- */
- protected function MailSend($header, $body) {
- $toArr = array();
- foreach($this->to as $t) {
- $toArr[] = $this->AddrFormat($t);
- }
- $to = implode(', ', $toArr);
- if (empty($this->Sender)) {
- $params = "-oi -f %s";
- } else {
- $params = sprintf("-oi -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 $key => $val) {
- $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
- // implement call back function if it exists
- $isSent = ($rt == 1) ? 1 : 0;
- $this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body);
- }
- } else {
- $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
- // implement call back function if it exists
- $isSent = ($rt == 1) ? 1 : 0;
- $this->doCallback($isSent, $to, $this->cc, $this->bcc, $this->Subject, $body);
- }
- } else {
- if ($this->SingleTo === true && count($toArr) > 1) {
- foreach ($toArr as $key => $val) {
- $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
- // implement call back function if it exists
- $isSent = ($rt == 1) ? 1 : 0;
- $this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body);
- }
- } else {
- $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header);
- // implement call back function if it exists
- $isSent = ($rt == 1) ? 1 : 0;
- $this->doCallback($isSent, $to, $this->cc, $this->bcc, $this->Subject, $body);
- }
- }
- if (isset($old_from)) {
- ini_set('sendmail_from', $old_from);
- }
- if(!$rt) {
- throw new phpmailerException($this->Lang('instantiate'), self::STOP_CRITICAL);
- }
- return true;
- }
- /**
- * Sends mail via SMTP using PhpSMTP
- * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
- * @param string $header The message headers
- * @param string $body The message body
- * @uses SMTP
- * @access protected
- * @return bool
- */
- protected function SmtpSend($header, $body) {
- require_once $this->PluginDir . 'class.smtp.php';
- $bad_rcpt = array();
- if(!$this->SmtpConnect()) {
- throw new phpmailerException($this->Lang('smtp_connect_failed'), self::STOP_CRITICAL);
- }
- $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;
- if(!$this->smtp->Mail($smtp_from)) {
- throw new phpmailerException($this->Lang('from_failed') . $smtp_from, self::STOP_CRITICAL);
- }
- // Attempt to send attach all recipients
- foreach($this->to as $to) {
- if (!$this->smtp->Recipient($to[0])) {
- $bad_rcpt[] = $to[0];
- // implement call back function if it exists
- $isSent = 0;
- $this->doCallback($isSent, $to[0], '', '', $this->Subject, $body);
- } else {
- // implement call back function if it exists
- $isSent = 1;
- $this->doCallback($isSent, $to[0], '', '', $this->Subject, $body);
- }
- }
- foreach($this->cc as $cc) {
- if (!$this->smtp->Recipient($cc[0])) {
- $bad_rcpt[] = $cc[0];
- // implement call back function if it exists
- $isSent = 0;
- $this->doCallback($isSent, '', $cc[0], '', $this->Subject, $body);
- } else {
- // implement call back function if it exists
- $isSent = 1;
- $this->doCallback($isSent, '', $cc[0], '', $this->Subject, $body);
- }
- }
- foreach($this->bcc as $bcc) {
- if (!$this->smtp->Recipient($bcc[0])) {
- $bad_rcpt[] = $bcc[0];
- // implement call back function if it exists
- $isSent = 0;
- $this->doCallback($isSent, '', '', $bcc[0], $this->Subject, $body);
- } else {
- // implement call back function if it exists
- $isSent = 1;
- $this->doCallback($isSent, '', '', $bcc[0], $this->Subject, $body);
- }
- }
- if (count($bad_rcpt) > 0 ) { //Create error message for any bad addresses
- $badaddresses = implode(', ', $bad_rcpt);
- throw new phpmailerException($this->Lang('recipients_failed') . $badaddresses);
- }
- if(!$this->smtp->Data($header . $body)) {
- throw new phpmailerException($this->Lang('data_not_accepted'), self::STOP_CRITICAL);
- }
- if($this->SMTPKeepAlive == true) {
- $this->smtp->Reset();
- }
- return true;
- }
- /**
- * Initiates a connection to an SMTP server.
- * Returns false if the operation failed.
- * @uses SMTP
- * @access public
- * @return bool
- */
- public function SmtpConnect() {
- if(is_null($this->smtp)) {
- $this->smtp = new SMTP();
- }
- $this->smtp->do_debug = $this->SMTPDebug;
- $hosts = explode(';', $this->Host);
- $index = 0;
- $connection = $this->smtp->Connected();
- // Retry while there is no connection
- try {
- while($index < count($hosts) && !$connection) {
- $hostinfo = array();
- if (preg_match('/^(.+):([0-9]+)$/', $hosts[$index], $hostinfo)) {
- $host = $hostinfo[1];
- $port = $hostinfo[2];
- } else {
- $host = $hosts[$index];
- $port = $this->Port;
- }
- $tls = ($this->SMTPSecure == 'tls');
- $ssl = ($this->SMTPSecure == 'ssl');
- if ($this->smtp->Connect(($ssl ? 'ssl://':'').$host, $port, $this->Timeout)) {
- $hello = ($this->Helo != '' ? $this->Helo : $this->ServerHostname());
- $this->smtp->Hello($hello);
- if ($tls) {
- if (!$this->smtp->StartTLS()) {
- throw new phpmailerException($this->Lang('tls'));
- }
- //We must resend HELO after tls negotiation
- $this->smtp->Hello($hello);
- }
- $connection = true;
- if ($this->SMTPAuth) {
- if (!$this->smtp->Authenticate($this->Username, $this->Password)) {
- throw new phpmailerException($this->Lang('authenticate'));
- }
- }
- }
- $index++;
- if (!$connection) {
- throw new phpmailerException($this->Lang('connect_host'));
- }
- }
- } catch (phpmailerException $e) {
- $this->smtp->Reset();
- throw $e;
- }
- return true;
- }
- /**
- * Closes the active SMTP session if one exists.
- * @return void
- */
- public function SmtpClose() {
- if(!is_null($this->smtp)) {
- if($this->smtp->Connected()) {
- $this->smtp->Quit();
- $this->smtp->Close();
- }
- }
- }
- /**
- * Sets the language for all class 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. Portuguese: "br")
- * @param string $lang_path Path to the language file directory
- * @access public
- */
- function SetLanguage($langcode = 'en', $lang_path = 'language/') {
- //Define full set of translatable strings
- $PHPMAILER_LANG = array(
- 'provide_address' => 'You must provide at least one recipient email address.',
- 'mailer_not_supported' => ' mailer is not supported.',
- 'execute' => 'Could not execute: ',
- 'instantiate' => 'Could not instantiate mail function.',
- 'authenticate' => 'SMTP Error: Could not authenticate.',
- 'from_failed' => 'The following From address failed: ',
- 'recipients_failed' => 'SMTP Error: The following recipients failed: ',
- 'data_not_accepted' => 'SMTP Error: Data not accepted.',
- 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
- 'file_access' => 'Could not access file: ',
- 'file_open' => 'File Error: Could not open file: ',
- 'encoding' => 'Unknown encoding: ',
- 'signing' => 'Signing Error: ',
- 'smtp_error' => 'SMTP server error: ',
- 'empty_message' => 'Message body empty',
- 'invalid_address' => 'Invalid address',
- 'variable_set' => 'Cannot set or reset variable: '
- );
- //Overwrite language-specific strings. This way we'll never have missing translations - no more "language string failed to load"!
- $l = true;
- if ($langcode != 'en') { //There is no English translation file
- $l = @include $lang_path.'phpmailer.lang-'.$langcode.'.php';
- }
- $this->language = $PHPMAILER_LANG;
- return ($l == true); //Returns false if language not found
- }
- /**
- * Return the current array of language strings
- * @return array
- */
- public function GetTranslations() {
- return $this->language;
- }
- /////////////////////////////////////////////////
- // METHODS, MESSAGE CREATION
- /////////////////////////////////////////////////
- /**
- * Creates recipient headers.
- * @access public
- * @return string
- */
- public function AddrAppend($type, $addr) {
- $addr_str = $type . ': ';
- $addresses = array();
- foreach ($addr as $a) {
- $addresses[] = $this->AddrFormat($a);
- }
- $addr_str .= implode(', ', $addresses);
- $addr_str .= $this->LE;
- return $addr_str;
- }
- /**
- * Formats an address correctly.
- * @access public
- * @return string
- */
- public function AddrFormat($addr) {
- if (empty($addr[1])) {
- return $this->SecureHeader($addr[0]);
- } else {
- return $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">";
- }
- }
- /**
- * Wraps message for use with mailers that do not
- * automatically perform wrapping and for quoted-printable.
- * Original written by philippe.
- * @param string $message The message to wrap
- * @param integer $length The line length to wrap to
- * @param boolean $qp_mode Whether to run in Quoted-Printable mode
- * @access public
- * @return string
- */
- public function WrapText($message, $length, $qp_mode = false) {
- $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;
- // If utf-8 encoding is used, we will need to make sure we don't
- // split multibyte characters when we wrap
- $is_utf8 = (strtolower($this->CharSet) == "utf-8");
- $message = $this->FixEOL($message);
- if (substr($message, -1) == $this->LE) {
- $message = substr($message, 0, -1);
- }
- $line = explode($this->LE, $message);
- $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) - 1;
- if ($e != 0) {
- if ($space_left > 20) {
- $len = $space_left;
- if ($is_utf8) {
- $len = $this->UTF8CharBoundary($word, $len);
- } elseif (substr($word, $len - 1, 1) == "=") {
- $len--;
- } elseif (substr($word, $len - 2, 1) == "=") {
- $len -= 2;
- }
- $part = substr($word, 0, $len);
- $word = substr($word, $len);
- $buf .= ' ' . $part;
- $message .= $buf . sprintf("=%s", $this->LE);
- } else {
- $message .= $buf . $soft_break;
- }
- $buf = '';
- }
- while (strlen($word) > 0) {
- $len = $length;
- if ($is_utf8) {
- $len = $this->UTF8CharBoundary($word, $len);
- } elseif (substr($word, $len - 1, 1) == "=") {
- $len--;
- } elseif (substr($word, $len - 2, 1) == "=") {
- $len -= 2;
- }
- $part = substr($word, 0, $len);
- $word = substr($word, $len);
- if (strlen($word) > 0) {
- $message .= $part . sprintf("=%s", $this->LE);
- } else {
- $buf = $part;
- }
- }
- } else {
- $buf_o = $buf;
- $buf .= ($e == 0) ? $word : (' ' . $word);
- if (strlen($buf) > $length and $buf_o != '') {
- $message .= $buf_o . $soft_break;
- $buf = $word;
- }
- }
- }
- $message .= $buf . $this->LE;
- }
- return $message;
- }
- /**
- * Finds last character boundary prior to maxLength in a utf-8
- * quoted (printable) encoded string.
- * Original written by Colin Brown.
- * @access public
- * @param string $encodedText utf-8 QP text
- * @param int $maxLength find last character boundary prior to this length
- * @return int
- */
- public function UTF8CharBoundary($encodedText, $maxLength) {
- $foundSplitPos = false;
- $lookBack = 3;
- while (!$foundSplitPos) {
- $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
- $encodedCharPos = strpos($lastChunk, "=");
- if ($encodedCharPos !== false) {
- // Found start of encoded character byte within $lookBack block.
- // Check the encoded byte value (the 2 chars after the '=')
- $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 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 public
- * @return void
- */
- public function SetWordWrap() {
- if($this->WordWrap < 1) {
- return;
- }
- switch($this->message_type) {
- case 'alt':
- case 'alt_inline':
- case 'alt_attach':
- case 'alt_inline_attach':
- $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);
- break;
- default:
- $this->Body = $this->WrapText($this->Body, $this->WordWrap);
- break;
- }
- }
- /**
- * Assembles message header.
- * @access public
- * @return string The assembled header
- */
- public function CreateHeader() {
- $result = '';
- // Set the boundaries
- $uniq_id = md5(uniqid(time()));
- $this->boundary[1] = 'b1_' . $uniq_id;
- $this->boundary[2] = 'b2_' . $uniq_id;
- $this->boundary[3] = 'b3_' . $uniq_id;
- $result .= $this->HeaderLine('Date', self::RFCDate());
- if($this->Sender == '') {
- $result .= $this->HeaderLine('Return-Path', trim($this->From));
- } else {
- $result .= $this->HeaderLine('Return-Path', trim($this->Sender));
- }
- // To be created automatically by mail()
- if($this->Mailer != 'mail') {
- if ($this->SingleTo === true) {
- foreach($this->to as $t) {
- $this->SingleToArray[] = $this->AddrFormat($t);
- }
- } else {
- if(count($this->to) > 0) {
- $result .= $this->AddrAppend('To', $this->to);
- } elseif (count($this->cc) == 0) {
- $result .= $this->HeaderLine('To', 'undisclosed-recipients:;');
- }
- }
- }
- $from = array();
- $from[0][0] = trim($this->From);
- $from[0][1] = $this->FromName;
- $result .= $this->AddrAppend('From', $from);
- // sendmail and mail() extract Cc from the header before sending
- if(count($this->cc) > 0) {
- $result .= $this->AddrAppend('Cc', $this->cc);
- }
- // sendmail and mail() extract Bcc from the header before sending
- if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) {
- $result .= $this->AddrAppend('Bcc', $this->bcc);
- }
- if(count($this->ReplyTo) > 0) {
- $result .= $this->AddrAppend('Reply-to', $this->ReplyTo);
- }
- // mail() sets the subject itself
- if($this->Mailer != 'mail') {
- $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject)));
- }
- if($this->MessageID != '') {
- $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);
- if($this->XMailer) {
- $result .= $this->HeaderLine('X-Mailer', $this->XMailer);
- } else {
- $result .= $this->HeaderLine('X-Mailer', 'PHPMailer '.$this->Version.' (http://code.google.com/a/apache-extras.org/p/phpmailer/)');
- }
- if($this->ConfirmReadingTo != '') {
- $result .= $this->HeaderLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');
- }
- // Add custom headers
- for($index = 0; $index < count($this->CustomHeader); $index++) {
- $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1])));
- }
- if (!$this->sign_key_file) {
- $result .= $this->HeaderLine('MIME-Version', '1.0');
- $result .= $this->GetMailMIME();
- }
- return $result;
- }
- /**
- * Returns the message MIME.
- * @access public
- * @return string
- */
- public function GetMailMIME() {
- $result = '';
- switch($this->message_type) {
- case 'plain':
- $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);
- $result .= $this->TextLine('Content-Type: '.$this->ContentType.'; charset="'.$this->CharSet.'"');
- break;
- case 'inline':
- $result .= $this->HeaderLine('Content-Type', 'multipart/related;');
- $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
- break;
- case 'attach':
- case 'inline_attach':
- case 'alt_attach':
- case 'alt_inline_attach':
- $result .= $this->HeaderLine('Content-Type', 'multipart/mixed;');
- $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
- break;
- case 'alt':
- case 'alt_inline':
- $result .= $this->HeaderLine('Content-Type', 'multipart/alternative;');
- $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
- break;
- }
- if($this->Mailer != 'mail') {
- $result .= $this->LE.$this->LE;
- }
- return $result;
- }
- /**
- * Assembles the message body. Returns an empty string on failure.
- * @access public
- * @return string The assembled message body
- */
- public function CreateBody() {
- $body = '';
- if ($this->sign_key_file) {
- $body .= $this->GetMailMIME();
- }
- $this->SetWordWrap();
- switch($this->message_type) {
- case 'plain':
- $body .= $this->EncodeString($this->Body, $this->Encoding);
- break;
- case 'inline':
- $body .= $this->GetBoundary($this->boundary[1], '', '', '');
- $body .= $this->EncodeString($this->Body, $this->Encoding);
- $body .= $this->LE.$this->LE;
- $body .= $this->AttachAll("inline", $this->boundary[1]);
- break;
- case 'attach':
- $body .= $this->GetBoundary($this->boundary[1], '', '', '');
- $body .= $this->EncodeString($this->Body, $this->Encoding);
- $body .= $this->LE.$this->LE;
- $body .= $this->AttachAll("attachment", $this->boundary[1]);
- break;
- case 'inline_attach':
- $body .= $this->TextLine("--" . $this->boundary[1]);
- $body .= $this->HeaderLine('Content-Type', 'multipart/related;');
- $body .= $this->TextLine("\tboundary=\"" . $this->boundary[2] . '"');
- $body .= $this->LE;
- $body .= $this->GetBoundary($this->boundary[2], '', '', '');
- $body .= $this->EncodeString($this->Body, $this->Encoding);
- $body .= $this->LE.$this->LE;
- $body .= $this->AttachAll("inline", $this->boundary[2]);
- $body .= $this->LE;
- $body .= $this->AttachAll("attachment", $this->boundary[1]);
- break;
- case 'alt':
- $body .= $this->GetBoundary($this->boundary[1], '', 'text/plain', '');
- $body .= $this->EncodeString($this->AltBody, $this->Encoding);
- $body .= $this->LE.$this->LE;
- $body .= $this->GetBoundary($this->boundary[1], '', 'text/html', '');
- $body .= $this->EncodeString($this->Body, $this->Encoding);
- $body .= $this->LE.$this->LE;
- $body .= $this->EndBoundary($this->boundary[1]);
- break;
- case 'alt_inline':
- $body .= $this->GetBoundary($this->boundary[1], '', 'text/plain', '');
- $body .= $this->EncodeString($this->AltBody, $this->Encoding);
- $body .= $this->LE.$this->LE;
- $body .= $this->TextLine("--" . $this->boundary[1]);
- $body .= $this->HeaderLine('Content-Type', 'multipart/related;');
- $body .= $this->TextLine("\tboundary=\"" . $this->boundary[2] . '"');
- $body .= $this->LE;
- $body .= $this->GetBoundary($this->boundary[2], '', 'text/html', '');
- $body .= $this->EncodeString($this->Body, $this->Encoding);
- $body .= $this->LE.$this->LE;
- $body .= $this->AttachAll("inline", $this->boundary[2]);
- $body .= $this->LE;
- $body .= $this->EndBoundary($this->boundary[1]);
- break;
- case 'alt_attach':
- $body .= $this->TextLine("--" . $this->boundary[1]);
- $body .= $this->HeaderLine('Content-Type', 'multipart/alternative;');
- $body .= $this->TextLine("\tboundary=\"" . $this->boundary[2] . '"');
- $body .= $this->LE;
- $body .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '');
- $body .= $this->EncodeString($this->AltBody, $this->Encoding);
- $body .= $this->LE.$this->LE;
- $body .= $this->GetBoundary($this->boundary[2], '', 'text/html', '');
- $body .= $this->EncodeString($this->Body, $this->Encoding);
- $body .= $this->LE.$this->LE;
- $body .= $this->EndBoundary($this->boundary[2]);
- $body .= $this->LE;
- $body .= $this->AttachAll("attachment", $this->boundary[1]);
- break;
- case 'alt_inline_attach':
- $body .= $this->TextLine("--" . $this->boundary[1]);
- $body .= $this->HeaderLine('Content-Type', 'multipart/alternative;');
- $body .= $this->TextLine("\tboundary=\"" . $this->boundary[2] . '"');
- $body .= $this->LE;
- $body .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '');
- $body .= $this->EncodeString($this->AltBody, $this->Encoding);
- $body .= $this->LE.$this->LE;
- $body .= $this->TextLine("--" . $this->boundary[2]);
- $body .= $this->HeaderLine('Content-Type', 'multipart/related;');
- $body .= $this->TextLine("\tboundary=\"" . $this->boundary[3] . '"');
- $body .= $this->LE;
- $body .= $this->GetBoundary($this->boundary[3], '', 'text/html', '');
- $body .= $this->EncodeString($this->Body, $this->Encoding);
- $body .= $this->LE.$this->LE;
- $body .= $this->AttachAll("inline", $this->boundary[3]);
- $body .= $this->LE;
- $body .= $this->EndBoundary($this->boundary[2]);
- $body .= $this->LE;
- $body .= $this->AttachAll("attachment", $this->boundary[1]);
- break;
- }
- if ($this->IsError()) {
- $body = '';
- } elseif ($this->sign_key_file) {
- try {
- $file = tempnam('', 'mail');
- file_put_contents($file, $body); //TODO check this worked
- $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)) {
- @unlink($file);
- @unlink($signed);
- $body = file_get_contents($signed);
- } else {
- @unlink($file);
- @unlink($signed);
- throw new phpmailerException($this->Lang("signing").openssl_error_string());
- }
- } catch (phpmailerException $e) {
- $body = '';
- if ($this->exceptions) {
- throw $e;
- }
- }
- }
- return $body;
- }
- /**
- * Returns the start of a message boundary.
- * @access protected
- * @return string
- */
- protected function GetBoundary($boundary, $charSet, $contentType, $encoding) {
- $result = '';
- if($charSet == '') {
- $charSet = $this->CharSet;
- }
- if($contentType == '') {
- $contentType = $this->ContentType;
- }
- if($encoding == '') {
- $encoding = $this->Encoding;
- }
- $result .= $this->TextLine('--' . $boundary);
- $result .= sprintf("Content-Type: %s; charset=\"%s\"", $contentType, $charSet);
- $result .= $this->LE;
- $result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding);
- $result .= $this->LE;
- return $result;
- }
- /**
- * Returns the end of a message boundary.
- * @access protected
- * @return string
- */
- protected function EndBoundary($boundary) {
- return $this->LE . '--' . $boundary . '--' . $this->LE;
- }
- /**
- * Sets the message type.
- * @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";
- }
- /**
- * Returns a formatted header line.
- * @access public
- * @return string
- */
- public function HeaderLine($name, $value) {
- return $name . ': ' . $value . $this->LE;
- }
- /**
- * Returns a formatted mail line.
- * @access public
- * @return string
- */
- public function TextLine($value) {
- return $value . $this->LE;
- }
- /////////////////////////////////////////////////
- // CLASS METHODS, ATTACHMENTS
- /////////////////////////////////////////////////
- /**
- * Adds an attachment from a path on the filesystem.
- * Returns false if the file could not be found
- * or accessed.
- * @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.
- * @return bool
- */
- public function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
- try {
- if ( !@is_file($path) ) {
- throw new phpmailerException($this->Lang('file_access') . $path, self::STOP_CONTINUE);
- }
- $filename = basename($path);
- if ( $name == '' ) {
- $name = $filename;
- }
- $this->attachment[] = array(
- 0 => $path,
- 1 => $filename,
- 2 => $name,
- 3 => $encoding,
- 4 => $type,
- 5 => false, // isStringAttachment
- 6 => 'attachment',
- 7 => 0
- );
- } catch (phpmailerException $e) {
- $this->SetError($e->getMessage());
- if ($this->exceptions) {
- throw $e;
- }
- echo $e->getMessage()."\n";
- if ( $e->getCode() == self::STOP_CRITICAL ) {
- return false;
- }
- }
- return true;
- }
- /**
- * Return the current array of attachments
- * @return array
- */
- public function GetAttachments() {
- return $this->attachment;
- }
- /**
- * Attaches all fs, string, and binary attachments to the message.
- * Returns an empty string on failure.
- * @access protected
- * @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
- $bString = $attachment[5];
- if ($bString) {
- $string = $attachment[0];
- } else {
- $path = $attachment[0];
- }
- $inclhash = md5(serialize($attachment));
- if (in_array($inclhash, $incl)) { continue; }
- $incl[] = $inclhash;
- $filename = $attachment[1];
- $name = $attachment[2];
- $encoding = $attachment[3];
- $type = $attachment[4];
- $disposition = $attachment[6];
- $cid = $attachment[7];
- if ( $disposition == 'inline' && isset($cidUniq[$cid]) ) { continue; }
- $cidUniq[$cid] = true;
- $mime[] = sprintf("--%s%s", $boundary, $this->LE);
- $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $this->EncodeHeader($this->SecureHeader($name)), $this->LE);
- $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);
- if($disposition == 'inline') {
- $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);
- }
- $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 '';
- }
- $mime[] = $this->LE.$this->LE;
- } else {
- $mime[] = $this->EncodeFile($path, $encoding);
- if($this->IsError()) {
- return '';
- }
- $mime[] = $this->LE.$this->LE;
- }
- }
- }
- $mime[] = sprintf("--%s--%s", $boundary, $this->LE);
- return implode("", $mime);
- }
- /**
- * Encodes attachment in requested format.
- * Returns an empty string on failure.
- * @param string $path The full path to the file
- * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
- * @see EncodeFile()
- * @access protected
- * @return string
- */
- protected function EncodeFile($path, $encoding = 'base64') {
- try {
- if (!is_readable($path)) {
- throw new phpmailerException($this->Lang('file_open') . $path, self::STOP_CONTINUE);
- }
- if (function_exists('get_magic_quotes')) {
- function get_magic_quotes() {
- return false;
- }
- }
- if (version_compare(PHP_VERSION, '5.3.0', '<')) {
- $magic_quotes = get_magic_quotes_runtime();
- set_magic_quotes_runtime(0);
- }
- $file_buffer = file_get_contents($path);
- $file_buffer = $this->EncodeString($file_buffer, $encoding);
- if (version_compare(PHP_VERSION, '5.3.0', '<')) {
- set_magic_quotes_runtime($magic_quotes);
- }
- return $file_buffer;
- } catch (Exception $e) {
- $this->SetError($e->getMessage());
- return '';
- }
- }
- /**
- * Encodes string to requested format.
- * Returns an empty string on failure.
- * @param string $str The text to encode
- * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
- * @access public
- * @return string
- */
- public function EncodeString($str, $encoding = 'base64') {
- $encoded = '';
- switch(strtolower($encoding)) {
- case 'base64':
- $encoded = chunk_split(base64_encode($str), 76, $this->LE);
- break;
- case '7bit':
- case '8bit':
- $encoded = $this->FixEOL($str);
- //Make sure it ends with a line break
- if (substr($encoded, -(strlen($this->LE))) != $this->LE)
- $encoded .= $this->LE;
- break;
- case 'binary':
- $encoded = $str;
- break;
- case 'quoted-printable':
- $encoded = $this->EncodeQP($str);
- break;
- default:
- $this->SetError($this->Lang('encoding') . $encoding);
- break;
- }
- return $encoded;
- }
- /**
- * Encode a header string to best (shortest) of Q, B, quoted or none.
- * @access public
- * @return string
- */
- public function EncodeHeader($str, $position = 'text') {
- $x = 0;
- switch (strtolower($position)) {
- case 'phrase':
- if (!preg_match('/[\200-\377]/', $str)) {
- // Can't use addslashes as we don't know what value has magic_quotes_sybase
- $encoded = addcslashes($str, "\0..\37\177\\\"");
- if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
- return ($encoded);
- } else {
- return ("\"$encoded\"");
- }
- }
- $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
- break;
- case 'comment':
- $x = preg_match_all('/[()"]/', $str, $matches);
- // Fall-through
- case 'text':
- default:
- $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
- break;
- }
- if ($x == 0) {
- return ($str);
- }
- $maxlen = 75 - 7 - strlen($this->CharSet);
- // Try to select the encoding which should produce the shortest output
- if (strlen($str)/3 < $x) {
- $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);
- } else {
- $encoded = base64_encode($str);
- $maxlen -= $maxlen % 4;
- $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
- }
- } else {
- $encoding = 'Q';
- $encoded = $this->EncodeQ($str, $position);
- $encoded = $this->WrapText($encoded, $maxlen, true);
- $encoded = str_replace('='.$this->LE, "\n", trim($encoded));
- }
- $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded);
- $encoded = trim(str_replace("\n", $this->LE, $encoded));
- return $encoded;
- }
- /**
- * Checks if a string contains multibyte characters.
- * @access public
- * @param string $str multi-byte text to wrap encode
- * @return bool
- */
- public function HasMultiBytes($str) {
- if (function_exists('mb_strlen')) {
- return (strlen($str) > mb_strlen($str, $this->CharSet));
- } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
- return false;
- }
- }
- /**
- * 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 public
- * @param string $str multi-byte text to wrap encode
- * @return string
- */
- public 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.
- * Only uses standard PHP, slow, but will always work
- * @access public
- * @param string $string the text to encode
- * @param integer $line_max Number of chars allowed on a line before wrapping
- * @return string
- */
- public function EncodeQPphp( $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 = …
Large files files are truncated, but you can click here to view the full file