class_mimePart.php
上传用户:gzy2002
上传日期:2010-02-11
资源大小:1785k
文件大小:10k
源码类别:

电子政务应用

开发平台:

Java

  1. <?php
  2. /**
  3. *
  4. *  Raw mime encoding class
  5. *
  6. * What is it?
  7. *   This class enables you to manipulate and build
  8. *   a mime email from the ground up.
  9. *
  10. * Why use this instead of mime.php?
  11. *   mime.php is a userfriendly api to this class for
  12. *   people who aren't interested in the internals of
  13. *   mime mail. This class however allows full control
  14. *   over the email.
  15. *
  16. * Eg.
  17. *
  18. * // Since multipart/mixed has no real body, (the body is
  19. * // the subpart), we set the body argument to blank.
  20. *
  21. * $params['content_type'] = 'multipart/mixed';
  22. * $email = new Mail_mimePart('', $params);
  23. *
  24. * // Here we add a text part to the multipart we have
  25. * // already. Assume $body contains plain text.
  26. *
  27. * $params['content_type'] = 'text/plain';
  28. * $params['encoding']     = '7bit';
  29. * $text = $email->addSubPart($body, $params);
  30. *
  31. * // Now add an attachment. Assume $attach is
  32. * the contents of the attachment
  33. *
  34. * $params['content_type'] = 'application/zip';
  35. * $params['encoding']     = 'base64';
  36. * $params['disposition']  = 'attachment';
  37. * $params['dfilename']    = 'example.zip';
  38. * $attach =& $email->addSubPart($body, $params);
  39. *
  40. * // Now build the email. Note that the encode
  41. * // function returns an associative array containing two
  42. * // elements, body and headers. You will need to add extra
  43. * // headers, (eg. Mime-Version) before sending.
  44. *
  45. * $email = $message->encode();
  46. * $email['headers'][] = 'Mime-Version: 1.0';
  47. *
  48. *
  49. * TODO:
  50. *  - Set encode() to return the $obj->encoded if encode()
  51. *    has already been run. Unless a flag is passed to specifically
  52. *    re-build the message.
  53. *
  54. * @author  Richard Heyes
  55. * @version $Revision: 1.2 $
  56. * @package Mail
  57. */
  58. class Mail_mimePart {
  59.    /**
  60.     * The encoding type of this part
  61.     * @var string
  62.     */
  63.     var $_encoding;
  64.    /**
  65.     * An array of subparts
  66.     * @var array
  67.     */
  68.     var $_subparts;
  69.    /**
  70.     * The output of this part after being built
  71.     * @var string
  72.     */
  73.     var $_encoded;
  74.    /**
  75.     * Headers for this part
  76.     * @var array
  77.     */
  78.     var $_headers;
  79.    /**
  80.     * The body of this part (not encoded)
  81.     * @var string
  82.     */
  83.     var $_body;
  84.     /**
  85.      * Constructor.
  86.      *
  87.      * Sets up the object.
  88.      *
  89.      * @param $body   - The body of the mime part if any.
  90.      * @param $params - An associative array of parameters:
  91.      *                  content_type - The content type for this part eg multipart/mixed
  92.      *                  encoding     - The encoding to use, 7bit, 8bit, base64, or quoted-printable
  93.      *                  cid          - Content ID to apply
  94.      *                  disposition  - Content disposition, inline or attachment
  95.      *                  dfilename    - Optional filename parameter for content disposition
  96.      *                  description  - Content description
  97.      *                  charset      - Character set to use
  98.      * @access public
  99.      */
  100.     function Mail_mimePart($body = '', $params = array())
  101.     {
  102.         if (!defined('MAIL_MIMEPART_CRLF')) {
  103.             define('MAIL_MIMEPART_CRLF', defined('MAIL_MIME_CRLF') ? MAIL_MIME_CRLF : "rn", TRUE);
  104.         }
  105.         foreach ($params as $key => $value) {
  106.             switch ($key) {
  107.                 case 'content_type':
  108.                     $headers['Content-Type'] = $value . (isset($charset) ? '; charset="' . $charset . '"' : '');
  109.                     break;
  110.                 case 'encoding':
  111.                     $this->_encoding = $value;
  112.                     $headers['Content-Transfer-Encoding'] = $value;
  113.                     break;
  114.                 case 'cid':
  115.                     $headers['Content-ID'] = '<' . $value . '>';
  116.                     break;
  117.                 case 'disposition':
  118.                     $headers['Content-Disposition'] = $value . (isset($dfilename) ? '; filename="' . $dfilename . '"' : '');
  119.                     break;
  120.                 case 'dfilename':
  121.                     if (isset($headers['Content-Disposition'])) {
  122.                         $headers['Content-Disposition'] .= '; filename="' . $value . '"';
  123.                     } else {
  124.                         $dfilename = $value;
  125.                     }
  126.                     break;
  127.                 case 'description':
  128.                     $headers['Content-Description'] = $value;
  129.                     break;
  130.                 case 'charset':
  131.                     if (isset($headers['Content-Type'])) {
  132.                         $headers['Content-Type'] .= '; charset="' . $value . '"';
  133.                     } else {
  134.                         $charset = $value;
  135.                     }
  136.                     break;
  137.             }
  138.         }
  139.         // Default content-type
  140.         if (!isset($headers['Content-Type'])) {
  141.             $headers['Content-Type'] = 'text/plain';
  142.         }
  143.         //Default encoding
  144.         if (!isset($this->_encoding)) {
  145.             $this->_encoding = '7bit';
  146.         }
  147.         // Assign stuff to member variables
  148.         $this->_encoded  = array();
  149.         $this->_headers  = $headers;
  150.         $this->_body     = $body;
  151.     }
  152.     /**
  153.      * encode()
  154.      *
  155.      * Encodes and returns the email. Also stores
  156.      * it in the encoded member variable
  157.      *
  158.      * @return An associative array containing two elements,
  159.      *         body and headers. The headers element is itself
  160.      *         an indexed array.
  161.      * @access public
  162.      */
  163.     function encode()
  164.     {
  165.         $encoded =& $this->_encoded;
  166.         if (!empty($this->_subparts)) {
  167.             $boundary = '=_' . md5(uniqid(rand()) . microtime());
  168.             $this->_headers['Content-Type'] .= ';' . MAIL_MIMEPART_CRLF . "t" . 'boundary="' . $boundary . '"';
  169.             // Add body parts to $subparts
  170.             for ($i = 0; $i < count($this->_subparts); $i++) {
  171.                 $headers = array();
  172.                 $tmp = $this->_subparts[$i]->encode();
  173.                 foreach ($tmp['headers'] as $key => $value) {
  174.                     $headers[] = $key . ': ' . $value;
  175.                 }
  176.                 $subparts[] = implode(MAIL_MIMEPART_CRLF, $headers) . MAIL_MIMEPART_CRLF . MAIL_MIMEPART_CRLF . $tmp['body'];
  177.             }
  178.             $encoded['body'] = '--' . $boundary . MAIL_MIMEPART_CRLF .
  179.                                implode('--' . $boundary . MAIL_MIMEPART_CRLF, $subparts) .
  180.                                '--' . $boundary.'--' . MAIL_MIMEPART_CRLF;
  181.         } else {
  182.             $encoded['body'] = $this->_getEncodedData($this->_body, $this->_encoding) . MAIL_MIMEPART_CRLF;
  183.         }
  184.         // Add headers to $encoded
  185.         $encoded['headers'] =& $this->_headers;
  186.         return $encoded;
  187.     }
  188.     /**
  189.      * &addSubPart()
  190.      *
  191.      * Adds a subpart to current mime part and returns
  192.      * a reference to it
  193.      *
  194.      * @param $body   The body of the subpart, if any.
  195.      * @param $params The parameters for the subpart, same
  196.      *                as the $params argument for constructor.
  197.      * @return A reference to the part you just added. It is
  198.      *         crucial if using multipart/* in your subparts that
  199.      *         you use =& in your script when calling this function,
  200.      *         otherwise you will not be able to add further subparts.
  201.      * @access public
  202.      */
  203.     function &addSubPart($body, $params)
  204.     {
  205.         $this->_subparts[] = new Mail_mimePart($body, $params);
  206.         return $this->_subparts[count($this->_subparts) - 1];
  207.     }
  208.     /**
  209.      * _getEncodedData()
  210.      *
  211.      * Returns encoded data based upon encoding passed to it
  212.      *
  213.      * @param $data     The data to encode.
  214.      * @param $encoding The encoding type to use, 7bit, base64,
  215.      *                  or quoted-printable.
  216.      * @access private
  217.      */
  218.     function _getEncodedData($data, $encoding)
  219.     {
  220.         switch ($encoding) {
  221.             case '8bit':
  222.             case '7bit':
  223.                 return $data;
  224.                 break;
  225.             case 'quoted-printable':
  226.                 return $this->_quotedPrintableEncode($data);
  227.                 break;
  228.             case 'base64':
  229.                 return rtrim(chunk_split(base64_encode($data), 76, MAIL_MIMEPART_CRLF));
  230.                 break;
  231.             default:
  232.                 return $data;
  233.         }
  234.     }
  235.     /**
  236.      * quoteadPrintableEncode()
  237.      *
  238.      * Encodes data to quoted-printable standard.
  239.      *
  240.      * @param $input    The data to encode
  241.      * @param $line_max Optional max line length. Should
  242.      *                  not be more than 76 chars
  243.      *
  244.      * @access private
  245.      */
  246.     function _quotedPrintableEncode($input , $line_max = 76)
  247.     {
  248.         $lines  = preg_split("/r?n/", $input);
  249.         $eol    = MAIL_MIMEPART_CRLF;
  250.         $escape = '=';
  251.         $output = '';
  252.         while(list(, $line) = each($lines)){
  253.             $linlen     = strlen($line);
  254.             $newline = '';
  255.             for ($i = 0; $i < $linlen; $i++) {
  256.                 $char = substr($line, $i, 1);
  257.                 $dec  = ord($char);
  258.                 if (($dec == 32) AND ($i == ($linlen - 1))){    // convert space at eol only
  259.                     $char = '=20';
  260.                 } elseif($dec == 9) {
  261.                     ; // Do nothing if a tab.
  262.                 } elseif(($dec == 61) OR ($dec < 32 ) OR ($dec > 126)) {
  263.                     $char = $escape . strtoupper(sprintf('%02s', dechex($dec)));
  264.                 }
  265.                 if ((strlen($newline) + strlen($char)) >= $line_max) {        // MAIL_MIMEPART_CRLF is not counted
  266.                     $output  .= $newline . $escape . $eol;                    // soft line break; " =rn" is okay
  267.                     $newline  = '';
  268.                 }
  269.                 $newline .= $char;
  270.             } // end of for
  271.             $output .= $newline . $eol;
  272.         }
  273.         $output = substr($output, 0, -1 * strlen($eol)); // Don't want last crlf
  274.         return $output;
  275.     }
  276. } // End of class
  277. ?>