| [ Index ] | osCommerce
Docs :: PHP Cross Reference For osCommerce 2.2 MS2 Provided By OSCdox.com |
1 <?php 2 /* 3 $Id: email.php,v 1.8 2003/06/11 22:24:34 dgw_ Exp $ 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 ?>
title
Description
Body
title
Description
Body
| Generated: Tue Nov 4 23:53:39 2003 | Hosted By :: AABox.com |
Cross-referenced by PHPXref 0.4 |