Quick Search:

View

Revision:

Diff

Diff from 1 to:

Annotations

Annotate by Age | Author | Mixed | None
/fisheye/browse/osCommerce/branches/hpdl/oscommerce/includes/classes/mime.php

Annotated File View

hpdl
1
1 <?php
2 /*
3   $Id: mime.php,v 1.8 2003/06/17 17:54:09 dgw_ Exp $
4
5   osCommerce, Open Source E-Commerce Solutions
6   http://www.oscommerce.com
7
8   Copyright (c) 2003 osCommerce
9
10   mime.php - a class to assist in building mime-HTML eMails
11
12   The original class was made by Richard Heyes <richard@phpguru.org>
13   and can be found here: http://www.phpguru.org
14
15   Renamed and Modified by Jan Wildeboer for osCommerce
16 */
17
18   class mime {
19     var $_encoding;
20     var $_subparts;
21     var $_encoded;
22     var $_headers;
23     var $_body;
24
25 /**
26  * Constructor.
27  * 
28  * Sets up the object.
29  *
30  * @param $body   - The body of the mime part if any.
31  * @param $params - An associative array of parameters:
32  *                  content_type - The content type for this part eg multipart/mixed
33  *                  encoding     - The encoding to use, 7bit, base64, or quoted-printable
34  *                  cid          - Content ID to apply
35  *                  disposition  - Content disposition, inline or attachment
36  *                  dfilename    - Optional filename parameter for content disposition
37  *                  description  - Content description
38  * @access public
39  */
40
41     function mime($body, $params = '') {
42       if ($params == '') $params = array();
43
44 // Make sure we use the correct linfeed sequence
45       if (EMAIL_LINEFEED == 'CRLF') {
46         $this->lf = "\r\n";
47       } else {
48         $this->lf = "\n";
49       }
50
51       reset($params);
52       while (list($key, $value) = each($params)) {
53         switch ($key) {
54           case 'content_type':
55             $headers['Content-Type'] = $value . (isset($charset) ? '; charset="' . $charset . '"' : '');
56             break;
57           case 'encoding':
58             $this->_encoding = $value;
59             $headers['Content-Transfer-Encoding'] = $value;
60             break;
61           case 'cid':
62             $headers['Content-ID'] = '<' . $value . '>';
63             break;
64           case 'disposition':
65             $headers['Content-Disposition'] = $value . (isset($dfilename) ? '; filename="' . $dfilename . '"' : '');
66             break;
67           case 'dfilename':
68             if (isset($headers['Content-Disposition'])) {
69               $headers['Content-Disposition'] .= '; filename="' . $value . '"';
70             } else {
71               $dfilename = $value;
72             }
73             break;
74           case 'description':
75             $headers['Content-Description'] = $value;
76             break;
77           case 'charset':
78             if (isset($headers['Content-Type'])) {
79               $headers['Content-Type'] .= '; charset="' . $value . '"';
80             } else {
81               $charset = $value;
82             }
83             break;
84         }
85       }
86
87 // Default content-type
88       if (!isset($_headers['Content-Type'])) {
89         $_headers['Content-Type'] = 'text/plain';
90       }
91
92 // Assign stuff to member variables
93       $this->_encoded = array();
94 /* HPDL PHP3 */
95 //      $this->_headers  =& $headers;
96       $this->_headers = $headers;
97       $this->_body = $body;
98     }
99
100 /**
101  * encode()
102  * 
103  * Encodes and returns the email. Also stores
104  * it in the encoded member variable
105  *
106  * @return An associative array containing two elements,
107  *         body and headers. The headers element is itself
108  *         an indexed array.
109  * @access public
110  */
111
112     function encode() {
113 /* HPDL PHP3 */
114 //      $encoded =& $this->_encoded;
115       $encoded = $this->_encoded;
116
117       if (tep_not_null($this->_subparts)) {
118         $boundary = '=_' . md5(uniqid(tep_rand()) . microtime());
119         $this->_headers['Content-Type'] .= ';' . $this->lf . chr(9) . 'boundary="' . $boundary . '"';
120
121 // Add body parts to $subparts
122         for ($i=0; $i<count($this->_subparts); $i++) {
123           $headers = array();
124 /* HPDL PHP3 */
125 //          $tmp = $this->_subparts[$i]->encode();
126           $_subparts = $this->_subparts[$i];
127           $tmp = $_subparts->encode();
128
129           reset($tmp['headers']);
130           while (list($key, $value) = each($tmp['headers'])) {
131             $headers[] = $key . ': ' . $value;
132           }
133
134           $subparts[] = implode($this->lf, $headers) . $this->lf . $this->lf . $tmp['body'];
135         }
136
137         $encoded['body'] = '--' . $boundary . $this->lf . implode('--' . $boundary . $this->lf, $subparts) . '--' . $boundary.'--' . $this->lf;
138       } else {
139         $encoded['body'] = $this->_getEncodedData($this->_body, $this->_encoding) . $this->lf;
140       }
141
142 // Add headers to $encoded
143 /* HPDL PHP3 */
144 //      $encoded['headers'] =& $this->_headers;
145       $encoded['headers'] = $this->_headers;
146
147       return $encoded;
148     }
149
150 /**
151  * &addSubPart()
152  * 
153  * Adds a subpart to current mime part and returns
154  * a reference to it
155  *
156  * @param $body   The body of the subpart, if any.
157  * @param $params The parameters for the subpart, same
158  *                as the $params argument for constructor.
159  * @return A reference to the part you just added. It is
160  *         crucial if using multipart/* in your subparts that
161  *         you use =& in your script when calling this function,
162  *         otherwise you will not be able to add further subparts.
163  * @access public
164  */
165
166 /* HPDL PHP3 */
167 //    function &addSubPart($body, $params) {
168     function addSubPart($body, $params) {
169       $this->_subparts[] = new mime($body, $params);
170
171       return $this->_subparts[count($this->_subparts) - 1];
172     }
173
174 /**
175  * _getEncodedData()
176  * 
177  * Returns encoded data based upon encoding passed to it
178  *
179  * @param $data     The data to encode.
180  * @param $encoding The encoding type to use, 7bit, base64,
181  *                  or quoted-printable.
182  * @access private
183  */
184
185     function _getEncodedData($data, $encoding) {
186       switch ($encoding) {
187        case '7bit':
188          return $data;
189          break;
190        case 'quoted-printable':
191          return $this->_quotedPrintableEncode($data);
192          break;
193        case 'base64':
194          return rtrim(chunk_split(base64_encode($data), 76, $this->lf));
195          break;
196       }
197     }
198
199 /**
200  * quoteadPrintableEncode()
201  * 
202  * Encodes data to quoted-printable standard.
203  *
204  * @param $input    The data to encode
205  * @param $line_max Optional max line length. Should 
206  *                  not be more than 76 chars
207  *
208  * @access private
209  */
210
211     function _quotedPrintableEncode($input , $line_max = 76) {
212       $lines = preg_split("/\r\n|\r|\n/", $input);
213       $eol = $this->lf;
214       $escape = '=';
215       $output = '';
216
217       while (list(, $line) = each($lines)) {
218         $linlen = strlen($line);
219         $newline = '';
220
221         for ($i = 0; $i < $linlen; $i++) {
222           $char = substr($line, $i, 1);
223           $dec = ord($char);
224
225 // convert space at eol only
226           if ( ($dec == 32) && ($i == ($linlen - 1)) ) {
227             $char = '=20';
228           } elseif ($dec == 9) {
229 // Do nothing if a tab.
230           } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) {
231             $char = $escape . strtoupper(sprintf('%02s', dechex($dec)));
232           }
233
234 // $this->lf is not counted
235           if ((strlen($newline) + strlen($char)) >= $line_max) {
236 // soft line break; " =\r\n" is okay
237             $output .= $newline . $escape . $eol;
238             $newline = '';
239           }
240           $newline .= $char;
241         }
242         $output .= $newline . $eol;
243       }
244 // Don't want last crlf
245       $output = substr($output, 0, -1 * strlen($eol));
246
247       return $output;
248     }
249   }
250 ?>