Quick Search:

Mode

Context

Displaying 3 lines of context. None | Less | More | Full

Other Diffs

Ignore

Blank Lines Whitespace:

Diff

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