Quick Search:

View

Revision:

Diff

Diff from 153 to:

Annotations

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

Annotated File View

hpdl
1
1 <?php
2 /*
hpdl
153
3   $Id: email.php 153 2005-08-04 12:57:59Z hpdl $
hpdl
1
4
5   osCommerce, Open Source E-Commerce Solutions
6   http://www.oscommerce.com
7
8   Copyright (c) 2003 osCommerce
9
10   Released under the GNU General Public License
11
12   mail.php - a class to assist in building mime-HTML eMails
13
14   The original class was made by Richard Heyes <richard@phpguru.org>
15   and can be found here: http://www.phpguru.org
16
17   Renamed and Modified by Jan Wildeboer for osCommerce
18 */
19
20   class email {
21     var $html;
22     var $text;
23     var $output;
24     var $html_text;
25     var $html_images;
26     var $image_types;
27     var $build_params;
28     var $attachments;
29     var $headers;
30
31     function email($headers = '') {
32       if ($headers == '') $headers = array();
33
34       $this->html_images = array();
35       $this->headers = array();
36
37       if (EMAIL_LINEFEED == 'CRLF') {
38         $this->lf = "\r\n";
39       } else {
40         $this->lf = "\n";
41       }
42
43 /**
44  * If you want the auto load functionality
45  * to find other mime-image/file types, add the
46  * extension and content type here.
47  */
48
49       $this->image_types = array('gif' => 'image/gif',
50                                  'jpg' => 'image/jpeg',
51                                  'jpeg' => 'image/jpeg',
52                                  'jpe' => 'image/jpeg',
53                                  'bmp' => 'image/bmp',
54                                  'png' => 'image/png',
55                                  'tif' => 'image/tiff',
56                                  'tiff' => 'image/tiff',
57                                  'swf' => 'application/x-shockwave-flash');
58
59       $this->build_params['html_encoding'] = 'quoted-printable';
60       $this->build_params['text_encoding'] = '7bit';
61       $this->build_params['html_charset'] = constant('CHARSET');
62       $this->build_params['text_charset'] = constant('CHARSET');
63       $this->build_params['text_wrap'] = 998;
64
65 /**
66  * Make sure the MIME version header is first.
67  */
68
69       $this->headers[] = 'MIME-Version: 1.0';
70
71       reset($headers);
72       while (list(,$value) = each($headers)) {
73         if (tep_not_null($value)) {
74           $this->headers[] = $value;
75         }
76       }
77     }
78
79 /**
80  * This function will read a file in
81  * from a supplied filename and return
82  * it. This can then be given as the first
83  * argument of the the functions
84  * add_html_image() or add_attachment().
85  */
86
87     function get_file($filename) {
88       $return = '';
89
90       if ($fp = fopen($filename, 'rb')) {
91         while (!feof($fp)) {
92           $return .= fread($fp, 1024);
93         }
94         fclose($fp);
95
96         return $return;
97       } else {
98         return false;
99       }
100     }
101
102 /**
103  * Function for extracting images from
104  * html source. This function will look
105  * through the html code supplied by add_html()
106  * and find any file that ends in one of the
107  * extensions defined in $obj->image_types.
108  * If the file exists it will read it in and
109  * embed it, (not an attachment).
110  *
111  * Function contributed by Dan Allen
112  */
113
114     function find_html_images($images_dir) {
115 // Build the list of image extensions
116       while (list($key, ) = each($this->image_types)) {
117         $extensions[] = $key;
118       }
119
120       preg_match_all('/"([^"]+\.(' . implode('|', $extensions).'))"/Ui', $this->html, $images);
121
122       for ($i=0; $i<count($images[1]); $i++) {
123         if (file_exists($images_dir . $images[1][$i])) {
124           $html_images[] = $images[1][$i];
125           $this->html = str_replace($images[1][$i], basename($images[1][$i]), $this->html);
126         }
127       }
128
129       if (tep_not_null($html_images)) {
130 // If duplicate images are embedded, they may show up as attachments, so remove them.
131         $html_images = array_unique($html_images);
132         sort($html_images);
133
134         for ($i=0; $i<count($html_images); $i++) {
135           if ($image = $this->get_file($images_dir . $html_images[$i])) {
136             $content_type = $this->image_types[substr($html_images[$i], strrpos($html_images[$i], '.') + 1)];
137             $this->add_html_image($image, basename($html_images[$i]), $content_type);
138           }
139         }
140       }
141     }
142
143 /**
144  * Adds plain text. Use this function
145  * when NOT sending html email
146  */
147
148     function add_text($text = '') {
149       $this->text = tep_convert_linefeeds(array("\r\n", "\n", "\r"), $this->lf, $text);
150     }
151
152 /**
153  * Adds a html part to the mail.
154  * Also replaces image names with
155  * content-id's.
156  */
157
158     function add_html($html, $text = NULL, $images_dir = NULL) {
159       $this->html = tep_convert_linefeeds(array("\r\n", "\n", "\r"), '<br>', $html);
160       $this->html_text = tep_convert_linefeeds(array("\r\n", "\n", "\r"), $this->lf, $text);
161
162       if (isset($images_dir)) $this->find_html_images($images_dir);
163     }
164
165 /**
166  * Adds an image to the list of embedded
167  * images.
168  */
169
170     function add_html_image($file, $name = '', $c_type='application/octet-stream') {
171       $this->html_images[] = array('body' => $file,
172                                    'name' => $name,
173                                    'c_type' => $c_type,
174                                    'cid' => md5(uniqid(time())));
175     }
176
177 /**
178  * Adds a file to the list of attachments.
179  */
180
181     function add_attachment($file, $name = '', $c_type='application/octet-stream', $encoding = 'base64') {
182       $this->attachments[] = array('body' => $file,
183                                    'name' => $name,
184                                    'c_type' => $c_type,
185                                    'encoding' => $encoding);
186     }
187
188 /**
189  * Adds a text subpart to a mime_part object
190  */
191
192 /* HPDL PHP3 */
193 //    function &add_text_part(&$obj, $text) {
194     function add_text_part(&$obj, $text) {
195       $params['content_type'] = 'text/plain';
196       $params['encoding'] = $this->build_params['text_encoding'];
197       $params['charset'] = $this->build_params['text_charset'];
198
199       if (is_object($obj)) {
200         return $obj->addSubpart($text, $params);
201       } else {
202         return new mime($text, $params);
203       }
204     }
205
206 /**
207  * Adds a html subpart to a mime_part object
208  */
209
210 /* HPDL PHP3 */
211 //    function &add_html_part(&$obj) {
212     function add_html_part(&$obj) {
213       $params['content_type'] = 'text/html';
214       $params['encoding'] = $this->build_params['html_encoding'];
215       $params['charset'] = $this->build_params['html_charset'];
216
217       if (is_object($obj)) {
218         return $obj->addSubpart($this->html, $params);
219       } else {
220         return new mime($this->html, $params);
221       }
222     }
223
224 /**
225  * Starts a message with a mixed part
226  */
227
228 /* HPDL PHP3 */
229 //    function &add_mixed_part() {
230     function add_mixed_part() {
231       $params['content_type'] = 'multipart/mixed';
232
233       return new mime('', $params);
234     }
235
236 /**
237  * Adds an alternative part to a mime_part object
238  */
239
240 /* HPDL PHP3 */
241 //    function &add_alternative_part(&$obj) {
242     function add_alternative_part(&$obj) {
243       $params['content_type'] = 'multipart/alternative';
244
245       if (is_object($obj)) {
246         return $obj->addSubpart('', $params);
247       } else {
248         return new mime('', $params);
249       }
250     }
251
252 /**
253  * Adds a html subpart to a mime_part object
254  */
255
256 /* HPDL PHP3 */
257 //    function &add_related_part(&$obj) {
258     function add_related_part(&$obj) {
259       $params['content_type'] = 'multipart/related';
260
261       if (is_object($obj)) {
262         return $obj->addSubpart('', $params);
263       } else {
264         return new mime('', $params);
265       }
266     }
267
268 /**
269  * Adds an html image subpart to a mime_part object
270  */
271
272 /* HPDL PHP3 */
273 //    function &add_html_image_part(&$obj, $value) {
274     function add_html_image_part(&$obj, $value) {
275       $params['content_type'] = $value['c_type'];
276       $params['encoding'] = 'base64';
277       $params['disposition'] = 'inline';
278       $params['dfilename'] = $value['name'];
279       $params['cid'] = $value['cid'];
280
281       $obj->addSubpart($value['body'], $params);
282     }
283
284 /**
285  * Adds an attachment subpart to a mime_part object
286  */
287
288 /* HPDL PHP3 */
289 //    function &add_attachment_part(&$obj, $value) {
290     function add_attachment_part(&$obj, $value) {
291       $params['content_type'] = $value['c_type'];
292       $params['encoding'] = $value['encoding'];
293       $params['disposition'] = 'attachment';
294       $params['dfilename'] = $value['name'];
295
296       $obj->addSubpart($value['body'], $params);
297     }
298
299 /**
300  * Builds the multipart message from the
301  * list ($this->_parts). $params is an
302  * array of parameters that shape the building
303  * of the message. Currently supported are:
304  *
305  * $params['html_encoding'] - The type of encoding to use on html. Valid options are
306  *                            "7bit", "quoted-printable" or "base64" (all without quotes).
307  *                            7bit is EXPRESSLY NOT RECOMMENDED. Default is quoted-printable
308  * $params['text_encoding'] - The type of encoding to use on plain text Valid options are
309  *                            "7bit", "quoted-printable" or "base64" (all without quotes).
310  *                            Default is 7bit
311  * $params['text_wrap']     - The character count at which to wrap 7bit encoded data.
312  *                            Default this is 998.
313  * $params['html_charset']  - The character set to use for a html section.
314  *                            Default is iso-8859-1
315  * $params['text_charset']  - The character set to use for a text section.
316  *                          - Default is iso-8859-1
317  */
318
319 /* HPDL PHP3 */
320 //    function build_message($params = array()) {
321     function build_message($params = '') {
322       if ($params == '') $params = array();
323
324       if (count($params) > 0) {
325         reset($params);
326         while(list($key, $value) = each($params)) {
327           $this->build_params[$key] = $value;
328         }
329       }
330
331       if (tep_not_null($this->html_images)) {
332         reset($this->html_images);
333         while (list(,$value) = each($this->html_images)) {
334           $this->html = str_replace($value['name'], 'cid:' . $value['cid'], $this->html);
335         }
336       }
337
338       $null = NULL;
339       $attachments = ((tep_not_null($this->attachments)) ? true : false);
340       $html_images = ((tep_not_null($this->html_images)) ? true : false);
341       $html = ((tep_not_null($this->html)) ? true : false);
342       $text = ((tep_not_null($this->text)) ? true : false);
343
344       switch (true) {
345         case (($text == true) && ($attachments == false)):
346 /* HPDL PHP3 */
347 //          $message =& $this->add_text_part($null, $this->text);
348           $message = $this->add_text_part($null, $this->text);
349           break;
350         case (($text == false) && ($attachments == true) && ($html == false)):
351 /* HPDL PHP3 */
352 //          $message =& $this->add_mixed_part();
353           $message = $this->add_mixed_part();
354
355           for ($i=0; $i<count($this->attachments); $i++) {
356             $this->add_attachment_part($message, $this->attachments[$i]);
357           }
358           break;
359         case (($text == true) && ($attachments == true)):
360 /* HPDL PHP3 */
361 //          $message =& $this->add_mixed_part();
362           $message = $this->add_mixed_part();
363           $this->add_text_part($message, $this->text);
364
365           for ($i=0; $i<count($this->attachments); $i++) {
366             $this->add_attachment_part($message, $this->attachments[$i]);
367           }
368           break;
369         case (($html == true) && ($attachments == false) && ($html_images == false)):
370           if (tep_not_null($this->html_text)) {
371 /* HPDL PHP3 */
372 //            $message =& $this->add_alternative_part($null);
373             $message = $this->add_alternative_part($null);
374             $this->add_text_part($message, $this->html_text);
375             $this->add_html_part($message);
376           } else {
377 /* HPDL PHP3 */
378 //            $message =& $this->add_html_part($null);
379             $message = $this->add_html_part($null);
380           }
381           break;
382         case (($html == true) && ($attachments == false) && ($html_images == true)):
383           if (tep_not_null($this->html_text)) {
384 /* HPDL PHP3 */
385 //            $message =& $this->add_alternative_part($null);
386             $message = $this->add_alternative_part($null);
387             $this->add_text_part($message, $this->html_text);
388 /* HPDL PHP3 */
389 //            $related =& $this->add_related_part($message);
390             $related = $this->add_related_part($message);
391           } else {
392 /* HPDL PHP3 */
393 //            $message =& $this->add_related_part($null);
394 //            $related =& $message;
395             $message = $this->add_related_part($null);
396             $related = $message;
397           }
398           $this->add_html_part($related);
399
400           for ($i=0; $i<count($this->html_images); $i++) {
401             $this->add_html_image_part($related, $this->html_images[$i]);
402           }
403           break;
404         case (($html == true) && ($attachments == true) && ($html_images == false)):
405 /* HPDL PHP3 */
406 //          $message =& $this->add_mixed_part();
407           $message = $this->add_mixed_part();
408           if (tep_not_null($this->html_text)) {
409 /* HPDL PHP3 */
410 //            $alt =& $this->add_alternative_part($message);
411             $alt = $this->add_alternative_part($message);
412             $this->add_text_part($alt, $this->html_text);
413             $this->add_html_part($alt);
414           } else {
415             $this->add_html_part($message);
416           }
417
418           for ($i=0; $i<count($this->attachments); $i++) {
419             $this->add_attachment_part($message, $this->attachments[$i]);
420           }
421           break;
422         case (($html == true) && ($attachments == true) && ($html_images == true)):
423 /* HPDL PHP3 */
424 //          $message =& $this->add_mixed_part();
425           $message = $this->add_mixed_part();
426
427           if (tep_not_null($this->html_text)) {
428 /* HPDL PHP3 */
429 //            $alt =& $this->add_alternative_part($message);
430             $alt = $this->add_alternative_part($message);
431             $this->add_text_part($alt, $this->html_text);
432 /* HPDL PHP3 */
433 //            $rel =& $this->add_related_part($alt);
434             $rel = $this->add_related_part($alt);
435           } else {
436 /* HPDL PHP3 */
437 //            $rel =& $this->add_related_part($message);
438             $rel = $this->add_related_part($message);
439           }
440           $this->add_html_part($rel);
441
442           for ($i=0; $i<count($this->html_images); $i++) {
443             $this->add_html_image_part($rel, $this->html_images[$i]);
444           }
445
446           for ($i=0; $i<count($this->attachments); $i++) {
447             $this->add_attachment_part($message, $this->attachments[$i]);
448           }
449           break;
450       }
451
452       if ( (isset($message)) && (is_object($message)) ) {
453         $output = $message->encode();
454         $this->output = $output['body'];
455
456         reset($output['headers']);
457         while (list($key, $value) = each($output['headers'])) {
458           $headers[] = $key . ': ' . $value;
459         }
460
461         $this->headers = array_merge($this->headers, $headers);
462
463         return true;
464       } else {
465         return false;
466       }
467     }
468
469 /**
470  * Sends the mail.
471  */
472
473     function send($to_name, $to_addr, $from_name, $from_addr, $subject = '', $headers = '') {
474       $to = (($to_name != '') ? '"' . $to_name . '" <' . $to_addr . '>' : $to_addr);
475       $from = (($from_name != '') ? '"' . $from_name . '" <' . $from_addr . '>' : $from_addr);
476
477       if (is_string($headers)) {
478         $headers = explode($this->lf, trim($headers));
479       }
480
481       for ($i=0; $i<count($headers); $i++) {
482         if (is_array($headers[$i])) {
483           for ($j=0; $j<count($headers[$i]); $j++) {
484             if ($headers[$i][$j] != '') {
485               $xtra_headers[] = $headers[$i][$j];
486             }
487           }
488         }
489
490         if ($headers[$i] != '') {
491           $xtra_headers[] = $headers[$i];
492         }
493       }
494
495       if (!isset($xtra_headers)) {
496         $xtra_headers = array();
497       }
498
499       if (EMAIL_TRANSPORT == 'smtp') {
500         return mail($to_addr, $subject, $this->output, 'From: ' . $from . $this->lf . 'To: ' . $to . $this->lf . implode($this->lf, $this->headers) . $this->lf . implode($this->lf, $xtra_headers));
501       } else {
502         return mail($to, $subject, $this->output, 'From: '.$from.$this->lf.implode($this->lf, $this->headers).$this->lf.implode($this->lf, $xtra_headers));
503       }
504     }
505
506 /**
507  * Use this method to return the email
508  * in message/rfc822 format. Useful for
509  * adding an email to another email as
510  * an attachment. there's a commented
511  * out example in example.php.
512  *
513  * string get_rfc822(string To name,
514  *       string To email,
515  *       string From name,
516  *       string From email,
517  *       [string Subject,
518  *        string Extra headers])
519  */
520
521     function get_rfc822($to_name, $to_addr, $from_name, $from_addr, $subject = '', $headers = '') {
522 // Make up the date header as according to RFC822
523       $date = 'Date: ' . date('D, d M y H:i:s');
524       $to = (($to_name != '') ? 'To: "' . $to_name . '" <' . $to_addr . '>' : 'To: ' . $to_addr);
525       $from = (($from_name != '') ? 'From: "' . $from_name . '" <' . $from_addr . '>' : 'From: ' . $from_addr);
526
527       if (is_string($subject)) {
528         $subject = 'Subject: ' . $subject;
529       }
530
531       if (is_string($headers)) {
532         $headers = explode($this->lf, trim($headers));
533       }
534
535       for ($i=0; $i<count($headers); $i++) {
536         if (is_array($headers[$i])) {
537           for ($j=0; $j<count($headers[$i]); $j++) {
538             if ($headers[$i][$j] != '') {
539               $xtra_headers[] = $headers[$i][$j];
540             }
541           }
542         }
543
544         if ($headers[$i] != '') {
545           $xtra_headers[] = $headers[$i];
546         }
547       }
548
549       if (!isset($xtra_headers)) {
550         $xtra_headers = array();
551       }
552
553       $headers = array_merge($this->headers, $xtra_headers);
554
555       return $date . $this->lf . $from . $this->lf . $to . $this->lf . $subject . $this->lf . implode($this->lf, $headers) . $this->lf . $this->lf . $this->output;
556     }
557   }
558 ?>