⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 class.phpmailer.php

📁 邮箱加即时聊天
💻 PHP
📖 第 1 页 / 共 4 页
字号:
    return $result;  }  /**   * Assembles the message body.  Returns an empty string on failure.   * @access private   * @return string   */  function CreateBody() {    $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->EncodeString($this->AltBody, $this->Encoding);        $result .= $this->LE.$this->LE;        $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]);        break;      case 'plain':        $result .= $this->EncodeString($this->Body, $this->Encoding);        break;      case 'attachments':        $result .= $this->GetBoundary($this->boundary[1], '', '', '');        $result .= $this->EncodeString($this->Body, $this->Encoding);        $result .= $this->LE;        $result .= $this->AttachAll();        break;      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->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->EncodeString($this->Body, $this->Encoding);        $result .= $this->LE.$this->LE;        $result .= $this->EndBoundary($this->boundary[2]);        $result .= $this->AttachAll();        break;    }    if($this->IsError()) {      $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_key_file, array("file://".$this->sign_key_file, $this->sign_key_pass), null)) {        $fp = fopen($signed, "r");        $result = fread($fp, filesize($this->sign_key_file));        fclose($fp);      } else {        $this->SetError($this->Lang("signing").openssl_error_string());        $result = '';      }      unlink($file);      unlink($signed);    }    return $result;  }  /**   * Returns the start of a message boundary.   * @access private   */  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 private   */  function EndBoundary($boundary) {    return $this->LE . '--' . $boundary . '--' . $this->LE;  }  /**   * Sets the message type.   * @access private   * @return void   */  function SetMessageType() {    if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) {      $this->message_type = 'plain';    } else {      if(count($this->attachment) > 0) {        $this->message_type = 'attachments';      }      if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) {        $this->message_type = 'alt';      }      if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) {        $this->message_type = 'alt_attachments';      }    }  }  /* Returns a formatted header line.   * @access private   * @return string   */  function HeaderLine($name, $value) {    return $name . ': ' . $value . $this->LE;  }  /**   * Returns a formatted mail line.   * @access private   * @return string   */  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   */  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 == '') {      $name = $filename;    }    $cur = count($this->attachment);    $this->attachment[$cur][0] = $path;    $this->attachment[$cur][1] = $filename;    $this->attachment[$cur][2] = $name;    $this->attachment[$cur][3] = $encoding;    $this->attachment[$cur][4] = $type;    $this->attachment[$cur][5] = false; // isStringAttachment    $this->attachment[$cur][6] = 'attachment';    $this->attachment[$cur][7] = 0;    return true;  }  /**   * Attaches all fs, string, and binary attachments to the message.   * Returns an empty string on failure.   * @access private   * @return string   */  function AttachAll() {    /* Return text of body */    $mime = array();    /* Add all attachments */    for($i = 0; $i < count($this->attachment); $i++) {      /* Check for string attachment */      $bString = $this->attachment[$i][5];      if ($bString) {        $string = $this->attachment[$i][0];      } else {        $path = $this->attachment[$i][0];      }      $filename    = $this->attachment[$i][1];      $name        = $this->attachment[$i][2];      $encoding    = $this->attachment[$i][3];      $type        = $this->attachment[$i][4];      $disposition = $this->attachment[$i][6];      $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-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, $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", $this->boundary[1], $this->LE);    return join('', $mime);  }  /**   * Encodes attachment in requested format.  Returns an   * empty string on failure.   * @access private   * @return string   */  function EncodeFile ($path, $encoding = 'base64') {    if(!@$fd = fopen($path, 'rb')) {      $this->SetError($this->Lang('file_open') . $path);      return '';    }    $magic_quotes = get_magic_quotes_runtime();    set_magic_quotes_runtime(0);    $file_buffer = fread($fd, filesize($path));    $file_buffer = $this->EncodeString($file_buffer, $encoding);    fclose($fd);    set_magic_quotes_runtime($magic_quotes);    return $file_buffer;  }  /**   * Encodes string to requested format. Returns an   * empty string on failure.   * @access private   * @return string   */  function EncodeString ($str, $encoding = 'base64') {    $encoded = '';    switch(strtolower($encoding)) {      case 'base64':        /* chunk_split is found in PHP >= 3.0.6 */        $encoded = chunk_split(base64_encode($str), 76, $this->LE);        break;      case '7bit':      case '8bit':        $encoded = $this->FixEOL($str);        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 of Q, B, quoted or none.   * @access private   * @return string   */  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 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 ) {    $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 = '';    while( list(, $line) = each($lines) ) {      $linlen = strlen($line);      $newline = '';      for($i = 0; $i < $linlen; $i++) {        $c = substr( $line, $i, 1 );        $dec = ord( $c );        if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E          $c = '=2E';        }        if ( $dec == 32 ) {          if ( $i == ( $linlen - 1 ) ) { // convert space at eol only            $c = '=20';          } else if ( $space_conv ) {            $c = '=20';          }        } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required          $h2 = floor($dec/16);          $h1 = floor($dec%16);          $c = $escape.$hex[$h2].$hex[$h1];        }        if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted          $output .= $newline.$escape.$eol; //  soft line break; " =\r\n" is okay          $newline = '';          // check if newline first character will be point or not          if ( $dec == 46 ) {            $c = '=2E';          }        }        $newline .= $c;      } // end of for      $output .= $newline.$eol;    } // end of while    return trim($output);  }  /**   * Encode string to q encoding.   * @access private   * @return string   */  function EncodeQ ($str, $position = 'text') {    /* There should not be any EOL in the string */    $encoded = preg_replace("[\r\n]", '', $str);    switch (strtolower($position)) {      case 'phrase':        $encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);        break;      case 'comment':        $encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);      case 'text':      default:        /* Replace every high ascii, control =, ? and _ characters */        $encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',              "'='.sprintf('%02X', ord('\\1'))", $encoded);        break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -