phpmailer.phpmailer.php
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:51k
源码类别:

网络

开发平台:

Unix_Linux

  1. <?php
  2. /*~ class.phpmailer.php
  3. .---------------------------------------------------------------------------.
  4. |  Software: PHPMailer - PHP email class                                    |
  5. |   Version: 2.0.0 rc3                                                      |
  6. |   Contact: via sourceforge.net support pages (also www.codeworxtech.com)  |
  7. |      Info: http://phpmailer.sourceforge.net                               |
  8. |   Support: http://sourceforge.net/projects/phpmailer/                     |
  9. | ------------------------------------------------------------------------- |
  10. |    Author: Andy Prevost (project admininistrator)                         |
  11. |    Author: Brent R. Matzelle (original founder)                           |
  12. | Copyright (c) 2004-2007, Andy Prevost. All Rights Reserved.               |
  13. | Copyright (c) 2001-2003, Brent R. Matzelle                                |
  14. | ------------------------------------------------------------------------- |
  15. |   License: Distributed under the Lesser General Public License (LGPL)     |
  16. |            http://www.gnu.org/copyleft/lesser.html                        |
  17. | This program is distributed in the hope that it will be useful - WITHOUT  |
  18. | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or     |
  19. | FITNESS FOR A PARTICULAR PURPOSE.                                         |
  20. | ------------------------------------------------------------------------- |
  21. | We offer a number of paid services (www.codeworxtech.com):                |
  22. | - Web Hosting on highly optimized fast and secure servers                 |
  23. | - Technology Consulting                                                   |
  24. | - Oursourcing (highly qualified programmers and graphic designers)        |
  25. '---------------------------------------------------------------------------'
  26. // Changes for CB: search for //BB.
  27. */
  28. /**
  29.  * PHPMailer - PHP email transport class
  30.  * @package PHPMailer
  31.  * @author Andy Prevost
  32.  * @copyright 2004 - 2007 Andy Prevost
  33.  * @license LGPL v2 at time of publishing.
  34.  */
  35. class CBPHPMailer { //BB: Line changed for CB library structure.
  36.   /////////////////////////////////////////////////
  37.   // PROPERTIES, PUBLIC
  38.   /////////////////////////////////////////////////
  39.   /**
  40.    * Email priority (1 = High, 3 = Normal, 5 = low).
  41.    * @var int
  42.    */
  43.   var $Priority          = 3;
  44.   /**
  45.    * Sets the CharSet of the message.
  46.    * @var string
  47.    */
  48.   var $CharSet           = 'iso-8859-1';
  49.   /**
  50.    * Sets the Content-type of the message.
  51.    * @var string
  52.    */
  53.   var $ContentType        = 'text/plain';
  54.   /**
  55.    * Sets the Encoding of the message. Options for this are "8bit",
  56.    * "7bit", "binary", "base64", and "quoted-printable".
  57.    * @var string
  58.    */
  59.   var $Encoding          = '8bit';
  60.   /**
  61.    * Holds the most recent mailer error message.
  62.    * @var string
  63.    */
  64.   var $ErrorInfo         = '';
  65.   /**
  66.    * Sets the From email address for the message.
  67.    * @var string
  68.    */
  69.   var $From              = 'root@localhost';
  70.   /**
  71.    * Sets the From name of the message.
  72.    * @var string
  73.    */
  74.   var $FromName          = 'Root User';
  75.   /**
  76.    * Sets the Sender email (Return-Path) of the message.  If not empty,
  77.    * will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
  78.    * @var string
  79.    */
  80.   var $Sender            = '';
  81.   /**
  82.    * Sets the Subject of the message.
  83.    * @var string
  84.    */
  85.   var $Subject           = '';
  86.   /**
  87.    * Sets the Body of the message.  This can be either an HTML or text body.
  88.    * If HTML then run IsHTML(true).
  89.    * @var string
  90.    */
  91.   var $Body              = '';
  92.   /**
  93.    * Sets the text-only body of the message.  This automatically sets the
  94.    * email to multipart/alternative.  This body can be read by mail
  95.    * clients that do not have HTML email capability such as mutt. Clients
  96.    * that can read HTML will view the normal Body.
  97.    * @var string
  98.    */
  99.   var $AltBody           = '';
  100.   /**
  101.    * Sets word wrapping on the body of the message to a given number of
  102.    * characters.
  103.    * @var int
  104.    */
  105.   var $WordWrap          = 0;
  106.   /**
  107.    * Method to send mail: ("mail", "sendmail", or "smtp").
  108.    * @var string
  109.    */
  110.   var $Mailer            = 'mail';
  111.   /**
  112.    * Sets the path of the sendmail program.
  113.    * @var string
  114.    */
  115.   var $Sendmail          = '/usr/sbin/sendmail';
  116.   /**
  117.    * Path to PHPMailer plugins.  This is now only useful if the SMTP class
  118.    * is in a different directory than the PHP include path.
  119.    * @var string
  120.    */
  121.   var $PluginDir         = '';
  122.   /**
  123.    * Holds PHPMailer version.
  124.    * @var string
  125.    */
  126.   var $Version           = "2.0.0 rc3";
  127.   /**
  128.    * Sets the email address that a reading confirmation will be sent.
  129.    * @var string
  130.    */
  131.   var $ConfirmReadingTo  = '';
  132.   /**
  133.    * Sets the hostname to use in Message-Id and Received headers
  134.    * and as default HELO string. If empty, the value returned
  135.    * by SERVER_NAME is used or 'localhost.localdomain'.
  136.    * @var string
  137.    */
  138.   var $Hostname          = '';
  139.   /////////////////////////////////////////////////
  140.   // PROPERTIES FOR SMTP
  141.   /////////////////////////////////////////////////
  142.   /**
  143.    * Sets the SMTP hosts.  All hosts must be separated by a
  144.    * semicolon.  You can also specify a different port
  145.    * for each host by using this format: [hostname:port]
  146.    * (e.g. "smtp1.example.com:25;smtp2.example.com").
  147.    * Hosts will be tried in order.
  148.    * @var string
  149.    */
  150.   var $Host        = 'localhost';
  151.   /**
  152.    * Sets the default SMTP server port.
  153.    * @var int
  154.    */
  155.   var $Port        = 25;
  156.   /**
  157.    * Sets the SMTP HELO of the message (Default is $Hostname).
  158.    * @var string
  159.    */
  160.   var $Helo        = '';
  161.   /**
  162.    * Sets connection prefix.
  163.    * Options are "", "ssl" or "tls"
  164.    * @var string
  165.    */
  166.   var $SMTPSecure = "";
  167.   /**
  168.    * Sets SMTP authentication. Utilizes the Username and Password variables.
  169.    * @var bool
  170.    */
  171.   var $SMTPAuth     = false;
  172.   /**
  173.    * Sets SMTP username.
  174.    * @var string
  175.    */
  176.   var $Username     = '';
  177.   /**
  178.    * Sets SMTP password.
  179.    * @var string
  180.    */
  181.   var $Password     = '';
  182.   /**
  183.    * Sets the SMTP server timeout in seconds. This function will not
  184.    * work with the win32 version.
  185.    * @var int
  186.    */
  187.   var $Timeout      = 10;
  188.   /**
  189.    * Sets SMTP class debugging on or off.
  190.    * @var bool
  191.    */
  192.   var $SMTPDebug    = false;
  193.   /**
  194.    * Prevents the SMTP connection from being closed after each mail
  195.    * sending.  If this is set to true then to close the connection
  196.    * requires an explicit call to SmtpClose().
  197.    * @var bool
  198.    */
  199.   var $SMTPKeepAlive = false;
  200.   /**
  201.    * Provides the ability to have the TO field process individual
  202.    * emails, instead of sending to entire TO addresses
  203.    * @var bool
  204.    */
  205.   var $SingleTo = false;
  206.   /////////////////////////////////////////////////
  207.   // PROPERTIES, PRIVATE
  208.   /////////////////////////////////////////////////
  209.   /**
  210.    * smtp object
  211.    * @var CBSMTP
  212.    */
  213.   var $smtp            = NULL;
  214.   var $to              = array();
  215.   var $cc              = array();
  216.   var $bcc             = array();
  217.   var $ReplyTo         = array();
  218.   var $attachment      = array();
  219.   var $CustomHeader    = array();
  220.   var $message_type    = '';
  221.   var $boundary        = array();
  222.   var $language        = array();
  223.   var $error_count     = 0;
  224.   var $LE              = "n";
  225.   /////////////////////////////////////////////////
  226.   // METHODS, VARIABLES
  227.   /////////////////////////////////////////////////
  228.   /**
  229.    * Sets message type to HTML.
  230.    * @param bool $bool
  231.    * @return void
  232.    */
  233.   function IsHTML($bool) {
  234.     if($bool == true) {
  235.       $this->ContentType = 'text/html';
  236.     } else {
  237.       $this->ContentType = 'text/plain';
  238.     }
  239.   }
  240.   /**
  241.    * Sets Mailer to send message using SMTP.
  242.    * @return void
  243.    */
  244.   function IsSMTP() {
  245.     $this->Mailer = 'smtp';
  246.   }
  247.   /**
  248.    * Sets Mailer to send message using PHP mail() function.
  249.    * @return void
  250.    */
  251.   function IsMail() {
  252.     $this->Mailer = 'mail';
  253.   }
  254.   /**
  255.    * Sets Mailer to send message using the $Sendmail program.
  256.    * @return void
  257.    */
  258.   function IsSendmail() {
  259.     $this->Mailer = 'sendmail';
  260.   }
  261.   /**
  262.    * Sets Mailer to send message using the qmail MTA.
  263.    * @return void
  264.    */
  265.   function IsQmail() {
  266.     $this->Sendmail = '/var/qmail/bin/sendmail';
  267.     $this->Mailer = 'sendmail';
  268.   }
  269.   /////////////////////////////////////////////////
  270.   // METHODS, RECIPIENTS
  271.   /////////////////////////////////////////////////
  272.   /**
  273.    * Adds a "To" address.
  274.    * @param string $address
  275.    * @param string $name
  276.    * @return void
  277.    */
  278.   function AddAddress($address, $name = '') {
  279.     $cur = count($this->to);
  280.     $this->to[$cur][0] = trim($address);
  281.     $this->to[$cur][1] = $name;
  282.   }
  283.   /**
  284.    * Adds a "Cc" address. Note: this function works
  285.    * with the SMTP mailer on win32, not with the "mail"
  286.    * mailer.
  287.    * @param string $address
  288.    * @param string $name
  289.    * @return void
  290.    */
  291.   function AddCC($address, $name = '') {
  292.     $cur = count($this->cc);
  293.     $this->cc[$cur][0] = trim($address);
  294.     $this->cc[$cur][1] = $name;
  295.   }
  296.   /**
  297.    * Adds a "Bcc" address. Note: this function works
  298.    * with the SMTP mailer on win32, not with the "mail"
  299.    * mailer.
  300.    * @param string $address
  301.    * @param string $name
  302.    * @return void
  303.    */
  304.   function AddBCC($address, $name = '') {
  305.     $cur = count($this->bcc);
  306.     $this->bcc[$cur][0] = trim($address);
  307.     $this->bcc[$cur][1] = $name;
  308.   }
  309.   /**
  310.    * Adds a "Reply-To" address.
  311.    * @param string $address
  312.    * @param string $name
  313.    * @return void
  314.    */
  315.   function AddReplyTo($address, $name = '') {
  316.     $cur = count($this->ReplyTo);
  317.     $this->ReplyTo[$cur][0] = trim($address);
  318.     $this->ReplyTo[$cur][1] = $name;
  319.   }
  320.   /////////////////////////////////////////////////
  321.   // METHODS, MAIL SENDING
  322.   /////////////////////////////////////////////////
  323.   /**
  324.    * Creates message and assigns Mailer. If the message is
  325.    * not sent successfully then it returns false.  Use the ErrorInfo
  326.    * variable to view description of the error.
  327.    * @return bool
  328.    */
  329.   function Send() {
  330.     $header = '';
  331.     $body = '';
  332.     $result = true;
  333.     if((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
  334.       $this->SetError($this->Lang('provide_address'));
  335.       return false;
  336.     }
  337.     /* Set whether the message is multipart/alternative */
  338.     if(!empty($this->AltBody)) {
  339.       $this->ContentType = 'multipart/alternative';
  340.     }
  341.     $this->error_count = 0; // reset errors
  342.     $this->SetMessageType();
  343.     $header .= $this->CreateHeader();
  344.     $body = $this->CreateBody();
  345.     if($body == '') {
  346.       return false;
  347.     }
  348.     /* Choose the mailer */
  349.     switch($this->Mailer) {
  350.       case 'sendmail':
  351.         $result = $this->SendmailSend($header, $body);
  352.         break;
  353.       case 'smtp':
  354.         $result = $this->SmtpSend($header, $body);
  355.         break;
  356.       case 'mail':
  357.         $result = $this->MailSend($header, $body);
  358.         break;
  359.       default:
  360.         $result = $this->MailSend($header, $body);
  361.         break;
  362.         //$this->SetError($this->Mailer . $this->Lang('mailer_not_supported'));
  363.         //$result = false;
  364.         //break;
  365.     }
  366.     return $result;
  367.   }
  368.   /**
  369.    * Sends mail using the $Sendmail program.
  370.    * @access private
  371.    * @return bool
  372.    */
  373.   function SendmailSend($header, $body) {
  374.     if ($this->Sender != '') {
  375.       $sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
  376.     } else {
  377.       $sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail));
  378.     }
  379.     if(!@$mail = popen($sendmail, 'w')) {
  380.       $this->SetError($this->Lang('execute') . $this->Sendmail);
  381.       return false;
  382.     }
  383.     fputs($mail, $header);
  384.     fputs($mail, $body);
  385.     $result = pclose($mail) >> 8 & 0xFF;
  386.     if($result != 0) {
  387.       $this->SetError($this->Lang('execute') . $this->Sendmail);
  388.       return false;
  389.     }
  390.     return true;
  391.   }
  392.   /**
  393.    * Sends mail using the PHP mail() function.
  394.    * @access private
  395.    * @return bool
  396.    */
  397.   function MailSend($header, $body) {
  398.     $to = '';
  399.     for($i = 0; $i < count($this->to); $i++) {
  400.       if($i != 0) { $to .= ', '; }
  401.       $to .= $this->AddrFormat($this->to[$i]);
  402.     }
  403.     $toArr = split(',', $to);
  404.     if ($this->Sender != '' && strlen(ini_get('safe_mode'))< 1) {
  405.       $old_from = ini_get('sendmail_from');
  406.       ini_set('sendmail_from', $this->Sender);
  407.       $params = sprintf("-oi -f %s", $this->Sender);
  408.       if ($this->SingleTo === true && count($toArr) > 1) {
  409.         foreach ($toArr as $key => $val) {
  410.           $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
  411.         }
  412.       } else {
  413.         $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
  414.       }
  415.     } else {
  416.       if ($this->SingleTo === true && count($toArr) > 1) {
  417.         foreach ($toArr as $key => $val) {
  418.           $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
  419.         }
  420.       } else {
  421.         $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header);
  422.       }
  423.     }
  424.     if (isset($old_from)) {
  425.       ini_set('sendmail_from', $old_from);
  426.     }
  427.     if(!$rt) {
  428.       $this->SetError($this->Lang('instantiate'));
  429.       return false;
  430.     }
  431.     return true;
  432.   }
  433.   /**
  434.    * Sends mail via SMTP using PhpSMTP (Author:
  435.    * Chris Ryan).  Returns bool.  Returns false if there is a
  436.    * bad MAIL FROM, RCPT, or DATA input.
  437.    * @access private
  438.    * @return bool
  439.    */
  440.   function SmtpSend($header, $body) {
  441.     include_once($this->PluginDir . 'phpmailer.smtp.php'); //BB: Line changed for CB library structure.
  442.     $error = '';
  443.     $bad_rcpt = array();
  444.     if(!$this->SmtpConnect()) {
  445.       return false;
  446.     }
  447.     $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;
  448.     if(!$this->smtp->Mail($smtp_from)) {
  449.       $error = $this->Lang('from_failed') . $smtp_from;
  450.       $this->SetError($error);
  451.       $this->smtp->Reset();
  452.       return false;
  453.     }
  454.     /* Attempt to send attach all recipients */
  455.     for($i = 0; $i < count($this->to); $i++) {
  456.       if(!$this->smtp->Recipient($this->to[$i][0])) {
  457.         $bad_rcpt[] = $this->to[$i][0];
  458.       }
  459.     }
  460.     for($i = 0; $i < count($this->cc); $i++) {
  461.       if(!$this->smtp->Recipient($this->cc[$i][0])) {
  462.         $bad_rcpt[] = $this->cc[$i][0];
  463.       }
  464.     }
  465.     for($i = 0; $i < count($this->bcc); $i++) {
  466.       if(!$this->smtp->Recipient($this->bcc[$i][0])) {
  467.         $bad_rcpt[] = $this->bcc[$i][0];
  468.       }
  469.     }
  470.     if(count($bad_rcpt) > 0) { // Create error message
  471.       for($i = 0; $i < count($bad_rcpt); $i++) {
  472.         if($i != 0) {
  473.           $error .= ', ';
  474.         }
  475.         $error .= $bad_rcpt[$i];
  476.       }
  477.       $error = $this->Lang('recipients_failed') . $error;
  478.       $this->SetError($error);
  479.       $this->smtp->Reset();
  480.       return false;
  481.     }
  482.     if(!$this->smtp->Data($header . $body)) {
  483.       $this->SetError($this->Lang('data_not_accepted'));
  484.       $this->smtp->Reset();
  485.       return false;
  486.     }
  487.     if($this->SMTPKeepAlive == true) {
  488.       $this->smtp->Reset();
  489.     } else {
  490.       $this->SmtpClose();
  491.     }
  492.     return true;
  493.   }
  494.   /**
  495.    * Initiates a connection to an SMTP server.  Returns false if the
  496.    * operation failed.
  497.    * @access private
  498.    * @return bool
  499.    */
  500.   function SmtpConnect() {
  501.     if($this->smtp == NULL) {
  502.       $this->smtp = new CBSMTP();
  503.     }
  504.     $this->smtp->do_debug = $this->SMTPDebug;
  505.     $hosts = explode(';', $this->Host);
  506.     $index = 0;
  507.     $connection = ($this->smtp->Connected());
  508.     /* Retry while there is no connection */
  509.     while($index < count($hosts) && $connection == false) {
  510.       $hostinfo = array();
  511.       if(preg_match('/^(.+):([0-9]+)$/', $hosts[$index], $hostinfo)) { //BB changed to preg
  512.         $host = $hostinfo[1];
  513.         $port = $hostinfo[2];
  514.       } else {
  515.         $host = $hosts[$index];
  516.         $port = $this->Port;
  517.       }
  518.       if($this->smtp->Connect(((!empty($this->SMTPSecure))?$this->SMTPSecure.'://':'').$host, $port, $this->Timeout)) {
  519.         if ($this->Helo != '') {
  520.           $this->smtp->Hello($this->Helo);
  521.         } else {
  522.           $this->smtp->Hello($this->ServerHostname());
  523.         }
  524.         $connection = true;
  525.         if($this->SMTPAuth) {
  526.           if(!$this->smtp->Authenticate($this->Username, $this->Password)) {
  527.             $this->SetError($this->Lang('authenticate'));
  528.             $this->smtp->Reset();
  529.             $connection = false;
  530.           }
  531.         }
  532.       }
  533.       $index++;
  534.     }
  535.     if(!$connection) {
  536.       $this->SetError($this->Lang('connect_host'));
  537.     }
  538.     return $connection;
  539.   }
  540.   /**
  541.    * Closes the active SMTP session if one exists.
  542.    * @return void
  543.    */
  544.   function SmtpClose() {
  545.     if($this->smtp != NULL) {
  546.       if($this->smtp->Connected()) {
  547.         $this->smtp->Quit();
  548.         $this->smtp->Close();
  549.       }
  550.     }
  551.   }
  552.   /**
  553.    * Sets the language for all class error messages.  Returns false
  554.    * if it cannot load the language file.  The default language type
  555.    * is English.
  556.    * @param string $lang_type Type of language (e.g. Portuguese: "br")
  557.    * @param string $lang_path Path to the language file directory
  558.    * @access public
  559.    * @return bool
  560.    */
  561.   function SetLanguage($lang_type, $lang_path = 'language/') {
  562.     if(file_exists($lang_path.'phpmailer.lang-'.$lang_type.'.php')) {
  563.       include($lang_path.'phpmailer.lang-'.$lang_type.'.php');
  564.     } elseif (file_exists($lang_path.'phpmailer.lang-en.php')) {
  565.       include($lang_path.'phpmailer.lang-en.php');
  566.     } else {
  567.       $this->SetError('Could not load language file');
  568.       return false;
  569.     }
  570.     $this->language = $PHPMAILER_LANG;
  571.     return true;
  572.   }
  573.   /////////////////////////////////////////////////
  574.   // METHODS, MESSAGE CREATION
  575.   /////////////////////////////////////////////////
  576.   /**
  577.    * Creates recipient headers.
  578.    * @access private
  579.    * @return string
  580.    */
  581.   function AddrAppend($type, $addr) {
  582.     $addr_str = $type . ': ';
  583.     $addr_str .= $this->AddrFormat($addr[0]);
  584.     if(count($addr) > 1) {
  585.       for($i = 1; $i < count($addr); $i++) {
  586.         $addr_str .= ', ' . $this->AddrFormat($addr[$i]);
  587.       }
  588.     }
  589.     $addr_str .= $this->LE;
  590.     return $addr_str;
  591.   }
  592.   /**
  593.    * Formats an address correctly.
  594.    * @access private
  595.    * @return string
  596.    */
  597.   function AddrFormat($addr) {
  598.     if(empty($addr[1])) {
  599.       $formatted = $this->SecureHeader($addr[0]);
  600.     } else {
  601.       $formatted = $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">";
  602.     }
  603.     return $formatted;
  604.   }
  605.   /**
  606.    * Wraps message for use with mailers that do not
  607.    * automatically perform wrapping and for quoted-printable.
  608.    * Original written by philippe.
  609.    * @access private
  610.    * @return string
  611.    */
  612.   function WrapText($message, $length, $qp_mode = false) {
  613.     $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;
  614.     $message = $this->FixEOL($message);
  615.     if (substr($message, -1) == $this->LE) {
  616.       $message = substr($message, 0, -1);
  617.     }
  618.     $line = explode($this->LE, $message);
  619.     $message = '';
  620.     for ($i=0 ;$i < count($line); $i++) {
  621.       $line_part = explode(' ', $line[$i]);
  622.       $buf = '';
  623.       for ($e = 0; $e<count($line_part); $e++) {
  624.         $word = $line_part[$e];
  625.         if ($qp_mode and (strlen($word) > $length)) {
  626.           $space_left = $length - strlen($buf) - 1;
  627.           if ($e != 0) {
  628.             if ($space_left > 20) {
  629.               $len = $space_left;
  630.               if (substr($word, $len - 1, 1) == '=') {
  631.                 $len--;
  632.               } elseif (substr($word, $len - 2, 1) == '=') {
  633.                 $len -= 2;
  634.               }
  635.               $part = substr($word, 0, $len);
  636.               $word = substr($word, $len);
  637.               $buf .= ' ' . $part;
  638.               $message .= $buf . sprintf("=%s", $this->LE);
  639.             } else {
  640.               $message .= $buf . $soft_break;
  641.             }
  642.             $buf = '';
  643.           }
  644.           while (strlen($word) > 0) {
  645.             $len = $length;
  646.             if (substr($word, $len - 1, 1) == '=') {
  647.               $len--;
  648.             } elseif (substr($word, $len - 2, 1) == '=') {
  649.               $len -= 2;
  650.             }
  651.             $part = substr($word, 0, $len);
  652.             $word = substr($word, $len);
  653.             if (strlen($word) > 0) {
  654.               $message .= $part . sprintf("=%s", $this->LE);
  655.             } else {
  656.               $buf = $part;
  657.             }
  658.           }
  659.         } else {
  660.           $buf_o = $buf;
  661.           $buf .= ($e == 0) ? $word : (' ' . $word);
  662.           if (strlen($buf) > $length and $buf_o != '') {
  663.             $message .= $buf_o . $soft_break;
  664.             $buf = $word;
  665.           }
  666.         }
  667.       }
  668.       $message .= $buf . $this->LE;
  669.     }
  670.     return $message;
  671.   }
  672.   /**
  673.    * Set the body wrapping.
  674.    * @access private
  675.    * @return void
  676.    */
  677.   function SetWordWrap() {
  678.     if($this->WordWrap < 1) {
  679.       return;
  680.     }
  681.     switch($this->message_type) {
  682.       case 'alt':
  683.         /* fall through */
  684.       case 'alt_attachments':
  685.         $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);
  686.         break;
  687.       default:
  688.         $this->Body = $this->WrapText($this->Body, $this->WordWrap);
  689.         break;
  690.     }
  691.   }
  692.   /**
  693.    * Assembles message header.
  694.    * @access private
  695.    * @return string
  696.    */
  697.   function CreateHeader() {
  698.     $result = '';
  699.     /* Set the boundaries */
  700.     $uniq_id = md5(uniqid(time()));
  701.     $this->boundary[1] = 'b1_' . $uniq_id;
  702.     $this->boundary[2] = 'b2_' . $uniq_id;
  703.     $result .= $this->HeaderLine('Date', $this->RFCDate());
  704.     if($this->Sender == '') {
  705.       $result .= $this->HeaderLine('Return-Path', trim($this->From));
  706.     } else {
  707.       $result .= $this->HeaderLine('Return-Path', trim($this->Sender));
  708.     }
  709.     /* To be created automatically by mail() */
  710.     if($this->Mailer != 'mail') {
  711.       if(count($this->to) > 0) {
  712.         $result .= $this->AddrAppend('To', $this->to);
  713.       } elseif (count($this->cc) == 0) {
  714.         $result .= $this->HeaderLine('To', 'undisclosed-recipients:;');
  715.       }
  716.       if(count($this->cc) > 0) {
  717.         $result .= $this->AddrAppend('Cc', $this->cc);
  718.       }
  719.     }
  720.     $from = array();
  721.     $from[0][0] = trim($this->From);
  722.     $from[0][1] = $this->FromName;
  723.     $result .= $this->AddrAppend('From', $from);
  724.     /* sendmail and mail() extract Cc from the header before sending */
  725.     if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->cc) > 0)) {
  726.       $result .= $this->AddrAppend('Cc', $this->cc);
  727.     }
  728.     /* sendmail and mail() extract Bcc from the header before sending */
  729.     if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) {
  730.       $result .= $this->AddrAppend('Bcc', $this->bcc);
  731.     }
  732.     if(count($this->ReplyTo) > 0) {
  733.       $result .= $this->AddrAppend('Reply-To', $this->ReplyTo);
  734.     }
  735.     /* mail() sets the subject itself */
  736.     if($this->Mailer != 'mail') {
  737.       $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject)));
  738.     }
  739.     $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE);
  740.     $result .= $this->HeaderLine('X-Priority', $this->Priority);
  741.     $result .= $this->HeaderLine('X-Mailer', 'PHPMailer (phpmailer.sourceforge.net) [version ' . $this->Version . ']');
  742.     if($this->ConfirmReadingTo != '') {
  743.       $result .= $this->HeaderLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');
  744.     }
  745.     // Add custom headers
  746.     for($index = 0; $index < count($this->CustomHeader); $index++) {
  747.       $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1])));
  748.     }
  749.     $result .= $this->HeaderLine('MIME-Version', '1.0');
  750.     switch($this->message_type) {
  751.       case 'plain':
  752.         $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);
  753.         $result .= sprintf("Content-Type: %s; charset="%s"", $this->ContentType, $this->CharSet);
  754.         break;
  755.       case 'attachments':
  756.         /* fall through */
  757.       case 'alt_attachments':
  758.         if($this->InlineImageExists()){
  759.           $result .= sprintf("Content-Type: %s;%sttype="text/html";%stboundary="%s"%s", 'multipart/related', $this->LE, $this->LE, $this->boundary[1], $this->LE);
  760.         } else {
  761.           $result .= $this->HeaderLine('Content-Type', 'multipart/mixed;');
  762.           $result .= $this->TextLine("tboundary="" . $this->boundary[1] . '"');
  763.         }
  764.         break;
  765.       case 'alt':
  766.         $result .= $this->HeaderLine('Content-Type', 'multipart/alternative;');
  767.         $result .= $this->TextLine("tboundary="" . $this->boundary[1] . '"');
  768.         break;
  769.     }
  770.     if($this->Mailer != 'mail') {
  771.       $result .= $this->LE.$this->LE;
  772.     }
  773.     return $result;
  774.   }
  775.   /**
  776.    * Assembles the message body.  Returns an empty string on failure.
  777.    * @access private
  778.    * @return string
  779.    */
  780.   function CreateBody() {
  781.     $result = '';
  782.     $this->SetWordWrap();
  783.     switch($this->message_type) {
  784.       case 'alt':
  785.         $result .= $this->GetBoundary($this->boundary[1], '', 'text/plain', '');
  786.         $result .= $this->EncodeString($this->AltBody, $this->Encoding);
  787.         $result .= $this->LE.$this->LE;
  788.         $result .= $this->GetBoundary($this->boundary[1], '', 'text/html', '');
  789.         $result .= $this->EncodeString($this->Body, $this->Encoding);
  790.         $result .= $this->LE.$this->LE;
  791.         $result .= $this->EndBoundary($this->boundary[1]);
  792.         break;
  793.       case 'plain':
  794.         $result .= $this->EncodeString($this->Body, $this->Encoding);
  795.         break;
  796.       case 'attachments':
  797.         $result .= $this->GetBoundary($this->boundary[1], '', '', '');
  798.         $result .= $this->EncodeString($this->Body, $this->Encoding);
  799.         $result .= $this->LE;
  800.         $result .= $this->AttachAll();
  801.         break;
  802.       case 'alt_attachments':
  803.         $result .= sprintf("--%s%s", $this->boundary[1], $this->LE);
  804.         $result .= sprintf("Content-Type: %s;%s" . "tboundary="%s"%s", 'multipart/alternative', $this->LE, $this->boundary[2], $this->LE.$this->LE);
  805.         $result .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '') . $this->LE; // Create text body
  806.         $result .= $this->EncodeString($this->AltBody, $this->Encoding);
  807.         $result .= $this->LE.$this->LE;
  808.         $result .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body
  809.         $result .= $this->EncodeString($this->Body, $this->Encoding);
  810.         $result .= $this->LE.$this->LE;
  811.         $result .= $this->EndBoundary($this->boundary[2]);
  812.         $result .= $this->AttachAll();
  813.         break;
  814.     }
  815.     if($this->IsError()) {
  816.       $result = '';
  817.     }
  818.     return $result;
  819.   }
  820.   /**
  821.    * Returns the start of a message boundary.
  822.    * @access private
  823.    */
  824.   function GetBoundary($boundary, $charSet, $contentType, $encoding) {
  825.     $result = '';
  826.     if($charSet == '') {
  827.       $charSet = $this->CharSet;
  828.     }
  829.     if($contentType == '') {
  830.       $contentType = $this->ContentType;
  831.     }
  832.     if($encoding == '') {
  833.       $encoding = $this->Encoding;
  834.     }
  835.     $result .= $this->TextLine('--' . $boundary);
  836.     $result .= sprintf("Content-Type: %s; charset = "%s"", $contentType, $charSet);
  837.     $result .= $this->LE;
  838.     $result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding);
  839.     $result .= $this->LE;
  840.     return $result;
  841.   }
  842.   /**
  843.    * Returns the end of a message boundary.
  844.    * @access private
  845.    */
  846.   function EndBoundary($boundary) {
  847.     return $this->LE . '--' . $boundary . '--' . $this->LE;
  848.   }
  849.   /**
  850.    * Sets the message type.
  851.    * @access private
  852.    * @return void
  853.    */
  854.   function SetMessageType() {
  855.     if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) {
  856.       $this->message_type = 'plain';
  857.     } else {
  858.       if(count($this->attachment) > 0) {
  859.         $this->message_type = 'attachments';
  860.       }
  861.       if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) {
  862.         $this->message_type = 'alt';
  863.       }
  864.       if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) {
  865.         $this->message_type = 'alt_attachments';
  866.       }
  867.     }
  868.   }
  869.   /* Returns a formatted header line.
  870.    * @access private
  871.    * @return string
  872.    */
  873.   function HeaderLine($name, $value) {
  874.     return $name . ': ' . $value . $this->LE;
  875.   }
  876.   /**
  877.    * Returns a formatted mail line.
  878.    * @access private
  879.    * @return string
  880.    */
  881.   function TextLine($value) {
  882.     return $value . $this->LE;
  883.   }
  884.   /////////////////////////////////////////////////
  885.   // CLASS METHODS, ATTACHMENTS
  886.   /////////////////////////////////////////////////
  887.   /**
  888.    * Adds an attachment from a path on the filesystem.
  889.    * Returns false if the file could not be found
  890.    * or accessed.
  891.    * @param string $path Path to the attachment.
  892.    * @param string $name Overrides the attachment name.
  893.    * @param string $encoding File encoding (see $Encoding).
  894.    * @param string $type File extension (MIME) type.
  895.    * @return bool
  896.    */
  897.   function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
  898.     if(!@is_file($path)) {
  899.       $this->SetError($this->Lang('file_access') . $path);
  900.       return false;
  901.     }
  902.     $filename = basename($path);
  903.     if($name == '') {
  904.       $name = $filename;
  905.     }
  906.     $cur = count($this->attachment);
  907.     $this->attachment[$cur][0] = $path;
  908.     $this->attachment[$cur][1] = $filename;
  909.     $this->attachment[$cur][2] = $name;
  910.     $this->attachment[$cur][3] = $encoding;
  911.     $this->attachment[$cur][4] = $type;
  912.     $this->attachment[$cur][5] = false; // isStringAttachment
  913.     $this->attachment[$cur][6] = 'attachment';
  914.     $this->attachment[$cur][7] = 0;
  915.     return true;
  916.   }
  917.   /**
  918.    * Attaches all fs, string, and binary attachments to the message.
  919.    * Returns an empty string on failure.
  920.    * @access private
  921.    * @return string
  922.    */
  923.   function AttachAll() {
  924.     /* Return text of body */
  925.     $mime = array();
  926.     /* Add all attachments */
  927.     for($i = 0; $i < count($this->attachment); $i++) {
  928.       /* Check for string attachment */
  929.       $bString = $this->attachment[$i][5];
  930.       if ($bString) {
  931.         $string = $this->attachment[$i][0];
  932.       } else {
  933.         $path = $this->attachment[$i][0];
  934.       }
  935.       $filename    = $this->attachment[$i][1];
  936.       $name        = $this->attachment[$i][2];
  937.       $encoding    = $this->attachment[$i][3];
  938.       $type        = $this->attachment[$i][4];
  939.       $disposition = $this->attachment[$i][6];
  940.       $cid         = $this->attachment[$i][7];
  941.       $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE);
  942.       $mime[] = sprintf("Content-Type: %s; name="%s"%s", $type, $name, $this->LE);
  943.       $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);
  944.       if($disposition == 'inline') {
  945.         $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);
  946.       }
  947.       $mime[] = sprintf("Content-Disposition: %s; filename="%s"%s", $disposition, $name, $this->LE.$this->LE);
  948.       /* Encode as string attachment */
  949.       if($bString) {
  950.         $mime[] = $this->EncodeString($string, $encoding);
  951.         if($this->IsError()) {
  952.           return '';
  953.         }
  954.         $mime[] = $this->LE.$this->LE;
  955.       } else {
  956.         $mime[] = $this->EncodeFile($path, $encoding);
  957.         if($this->IsError()) {
  958.           return '';
  959.         }
  960.         $mime[] = $this->LE.$this->LE;
  961.       }
  962.     }
  963.     $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE);
  964.     return join('', $mime);
  965.   }
  966.   /**
  967.    * Encodes attachment in requested format.  Returns an
  968.    * empty string on failure.
  969.    * @access private
  970.    * @return string
  971.    */
  972.   function EncodeFile ($path, $encoding = 'base64') {
  973.     if(!@$fd = fopen($path, 'rb')) {
  974.       $this->SetError($this->Lang('file_open') . $path);
  975.       return '';
  976.     }
  977.     $magic_quotes = get_magic_quotes_runtime();
  978.     set_magic_quotes_runtime(0);
  979.     $file_buffer = fread($fd, filesize($path));
  980.     $file_buffer = $this->EncodeString($file_buffer, $encoding);
  981.     fclose($fd);
  982.     set_magic_quotes_runtime($magic_quotes);
  983.     return $file_buffer;
  984.   }
  985.   /**
  986.    * Encodes string to requested format. Returns an
  987.    * empty string on failure.
  988.    * @access private
  989.    * @return string
  990.    */
  991.   function EncodeString ($str, $encoding = 'base64') {
  992.     $encoded = '';
  993.     switch(strtolower($encoding)) {
  994.       case 'base64':
  995.         /* chunk_split is found in PHP >= 3.0.6 */
  996.         $encoded = chunk_split(base64_encode($str), 76, $this->LE);
  997.         break;
  998.       case '7bit':
  999.       case '8bit':
  1000.         $encoded = $this->FixEOL($str);
  1001.         if (substr($encoded, -(strlen($this->LE))) != $this->LE)
  1002.           $encoded .= $this->LE;
  1003.         break;
  1004.       case 'binary':
  1005.         $encoded = $str;
  1006.         break;
  1007.       case 'quoted-printable':
  1008.         $encoded = $this->EncodeQP($str);
  1009.         break;
  1010.       default:
  1011.         $this->SetError($this->Lang('encoding') . $encoding);
  1012.         break;
  1013.     }
  1014.     return $encoded;
  1015.   }
  1016.   /**
  1017.    * Encode a header string to best of Q, B, quoted or none.
  1018.    * @access private
  1019.    * @return string
  1020.    */
  1021.   function EncodeHeader ($str, $position = 'text') {
  1022.     $x = 0;
  1023.     switch (strtolower($position)) {
  1024.       case 'phrase':
  1025.         if (!preg_match('/[200-377]/', $str)) {
  1026.           /* Can't use addslashes as we don't know what value has magic_quotes_sybase. */
  1027.           $encoded = addcslashes($str, "..37177\"");
  1028.           if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&'*+/=?^_`{|}~ -]/', $str)) {
  1029.             return ($encoded);
  1030.           } else {
  1031.             return (""$encoded"");
  1032.           }
  1033.         }
  1034.         $x = preg_match_all('/[^404143-133135-176]/', $str, $matches);
  1035.         break;
  1036.       case 'comment':
  1037.         $x = preg_match_all('/[()"]/', $str, $matches);
  1038.         /* Fall-through */
  1039.       case 'text':
  1040.       default:
  1041.         $x += preg_match_all('/[00-10131416-37177-377]/', $str, $matches);
  1042.         break;
  1043.     }
  1044.     if ($x == 0) {
  1045.       return ($str);
  1046.     }
  1047.     $maxlen = 75 - 7 - strlen($this->CharSet);
  1048.     /* Try to select the encoding which should produce the shortest output */
  1049.     if (strlen($str)/3 < $x) {
  1050.       $encoding = 'B';
  1051.       $encoded = base64_encode($str);
  1052.       $maxlen -= $maxlen % 4;
  1053.       $encoded = trim(chunk_split($encoded, $maxlen, "n"));
  1054.     } else {
  1055.       $encoding = 'Q';
  1056.       $encoded = $this->EncodeQ($str, $position);
  1057.       $encoded = $this->WrapText($encoded, $maxlen, true);
  1058.       $encoded = str_replace('='.$this->LE, "n", trim($encoded));
  1059.     }
  1060.     $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\1?=", $encoded);
  1061.     $encoded = trim(str_replace("n", $this->LE, $encoded));
  1062.     return $encoded;
  1063.   }
  1064.   /**
  1065.    * Encode string to quoted-printable.
  1066.    * @access private
  1067.    * @return string
  1068.    */
  1069.   function EncodeQP( $input = '', $line_max = 76, $space_conv = false ) {
  1070.     $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
  1071.     $lines = preg_split('/(?:rn|r|n)/', $input);
  1072.     $eol = "rn";
  1073.     $escape = '=';
  1074.     $output = '';
  1075.     while( list(, $line) = each($lines) ) {
  1076.       $linlen = strlen($line);
  1077.       $newline = '';
  1078.       for($i = 0; $i < $linlen; $i++) {
  1079.         $c = substr( $line, $i, 1 );
  1080.         $dec = ord( $c );
  1081.         if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E
  1082.           $c = '=2E';
  1083.         }
  1084.         if ( $dec == 32 ) {
  1085.           if ( $i == ( $linlen - 1 ) ) { // convert space at eol only
  1086.             $c = '=20';
  1087.           } else if ( $space_conv ) {
  1088.             $c = '=20';
  1089.           }
  1090.         } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "t", which is *not* required
  1091.           $h2 = floor($dec/16);
  1092.           $h1 = floor($dec%16);
  1093.           $c = $escape.$hex[$h2].$hex[$h1];
  1094.         }
  1095.         if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted
  1096.           $output .= $newline.$escape.$eol; //  soft line break; " =rn" is okay
  1097.           $newline = '';
  1098.           // check if newline first character will be point or not
  1099.           if ( $dec == 46 ) {
  1100.             $c = '=2E';
  1101.           }
  1102.         }
  1103.         $newline .= $c;
  1104.       } // end of for
  1105.       $output .= $newline.$eol;
  1106.     } // end of while
  1107.     return trim($output);
  1108.   }
  1109.   /**
  1110.    * Encode string to q encoding.
  1111.    * @access private
  1112.    * @return string
  1113.    */
  1114.   function EncodeQ ($str, $position = 'text') {
  1115.     /* There should not be any EOL in the string */
  1116.     $encoded = preg_replace("[rn]", '', $str);
  1117.     switch (strtolower($position)) {
  1118.       case 'phrase':
  1119.         $encoded = preg_replace("/([^A-Za-z0-9!*+/ -])/e", "'='.sprintf('%02X', ord('\1'))", $encoded);
  1120.         break;
  1121.       case 'comment':
  1122.         $encoded = preg_replace("/([()"])/e", "'='.sprintf('%02X', ord('\1'))", $encoded);
  1123.       case 'text':
  1124.       default:
  1125.         /* Replace every high ascii, control =, ? and _ characters */
  1126.         $encoded = preg_replace('/([00-11131416-377577137177-377])/e',
  1127.               "'='.sprintf('%02X', ord('\1'))", $encoded);
  1128.         break;
  1129.     }
  1130.     /* Replace every spaces to _ (more readable than =20) */
  1131.     $encoded = str_replace(' ', '_', $encoded);
  1132.     return $encoded;
  1133.   }
  1134.   /**
  1135.    * Adds a string or binary attachment (non-filesystem) to the list.
  1136.    * This method can be used to attach ascii or binary data,
  1137.    * such as a BLOB record from a database.
  1138.    * @param string $string String attachment data.
  1139.    * @param string $filename Name of the attachment.
  1140.    * @param string $encoding File encoding (see $Encoding).
  1141.    * @param string $type File extension (MIME) type.
  1142.    * @return void
  1143.    */
  1144.   function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') {
  1145.     /* Append to $attachment array */
  1146.     $cur = count($this->attachment);
  1147.     $this->attachment[$cur][0] = $string;
  1148.     $this->attachment[$cur][1] = $filename;
  1149.     $this->attachment[$cur][2] = $filename;
  1150.     $this->attachment[$cur][3] = $encoding;
  1151.     $this->attachment[$cur][4] = $type;
  1152.     $this->attachment[$cur][5] = true; // isString
  1153.     $this->attachment[$cur][6] = 'attachment';
  1154.     $this->attachment[$cur][7] = 0;
  1155.   }
  1156.   /**
  1157.    * Adds an embedded attachment.  This can include images, sounds, and
  1158.    * just about any other document.  Make sure to set the $type to an
  1159.    * image type.  For JPEG images use "image/jpeg" and for GIF images
  1160.    * use "image/gif".
  1161.    * @param string $path Path to the attachment.
  1162.    * @param string $cid Content ID of the attachment.  Use this to identify
  1163.    *        the Id for accessing the image in an HTML form.
  1164.    * @param string $name Overrides the attachment name.
  1165.    * @param string $encoding File encoding (see $Encoding).
  1166.    * @param string $type File extension (MIME) type.
  1167.    * @return bool
  1168.    */
  1169.   function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
  1170.     if(!@is_file($path)) {
  1171.       $this->SetError($this->Lang('file_access') . $path);
  1172.       return false;
  1173.     }
  1174.     $filename = basename($path);
  1175.     if($name == '') {
  1176.       $name = $filename;
  1177.     }
  1178.     /* Append to $attachment array */
  1179.     $cur = count($this->attachment);
  1180.     $this->attachment[$cur][0] = $path;
  1181.     $this->attachment[$cur][1] = $filename;
  1182.     $this->attachment[$cur][2] = $name;
  1183.     $this->attachment[$cur][3] = $encoding;
  1184.     $this->attachment[$cur][4] = $type;
  1185.     $this->attachment[$cur][5] = false;
  1186.     $this->attachment[$cur][6] = 'inline';
  1187.     $this->attachment[$cur][7] = $cid;
  1188.     return true;
  1189.   }
  1190.   /**
  1191.    * Returns true if an inline attachment is present.
  1192.    * @access private
  1193.    * @return bool
  1194.    */
  1195.   function InlineImageExists() {
  1196.     $result = false;
  1197.     for($i = 0; $i < count($this->attachment); $i++) {
  1198.       if($this->attachment[$i][6] == 'inline') {
  1199.         $result = true;
  1200.         break;
  1201.       }
  1202.     }
  1203.     return $result;
  1204.   }
  1205.   /////////////////////////////////////////////////
  1206.   // CLASS METHODS, MESSAGE RESET
  1207.   /////////////////////////////////////////////////
  1208.   /**
  1209.    * Clears all recipients assigned in the TO array.  Returns void.
  1210.    * @return void
  1211.    */
  1212.   function ClearAddresses() {
  1213.     $this->to = array();
  1214.   }
  1215.   /**
  1216.    * Clears all recipients assigned in the CC array.  Returns void.
  1217.    * @return void
  1218.    */
  1219.   function ClearCCs() {
  1220.     $this->cc = array();
  1221.   }
  1222.   /**
  1223.    * Clears all recipients assigned in the BCC array.  Returns void.
  1224.    * @return void
  1225.    */
  1226.   function ClearBCCs() {
  1227.     $this->bcc = array();
  1228.   }
  1229.   /**
  1230.    * Clears all recipients assigned in the ReplyTo array.  Returns void.
  1231.    * @return void
  1232.    */
  1233.   function ClearReplyTos() {
  1234.     $this->ReplyTo = array();
  1235.   }
  1236.   /**
  1237.    * Clears all recipients assigned in the TO, CC and BCC
  1238.    * array.  Returns void.
  1239.    * @return void
  1240.    */
  1241.   function ClearAllRecipients() {
  1242.     $this->to = array();
  1243.     $this->cc = array();
  1244.     $this->bcc = array();
  1245.   }
  1246.   /**
  1247.    * Clears all previously set filesystem, string, and binary
  1248.    * attachments.  Returns void.
  1249.    * @return void
  1250.    */
  1251.   function ClearAttachments() {
  1252.     $this->attachment = array();
  1253.   }
  1254.   /**
  1255.    * Clears all custom headers.  Returns void.
  1256.    * @return void
  1257.    */
  1258.   function ClearCustomHeaders() {
  1259.     $this->CustomHeader = array();
  1260.   }
  1261.   /////////////////////////////////////////////////
  1262.   // CLASS METHODS, MISCELLANEOUS
  1263.   /////////////////////////////////////////////////
  1264.   /**
  1265.    * Adds the error message to the error container.
  1266.    * Returns void.
  1267.    * @access private
  1268.    * @return void
  1269.    */
  1270.   function SetError($msg) {
  1271.     $this->error_count++;
  1272.     $this->ErrorInfo = $msg;
  1273.   }
  1274.   /**
  1275.    * Returns the proper RFC 822 formatted date.
  1276.    * @access private
  1277.    * @return string
  1278.    */
  1279.   function RFCDate() {
  1280.     $tz = date('Z');
  1281.     $tzs = ($tz < 0) ? '-' : '+';
  1282.     $tz = abs($tz);
  1283.     $tz = (int)($tz/3600)*100 + ($tz%3600)/60;
  1284.     $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz);
  1285.     return $result;
  1286.   }
  1287.   /**
  1288.    * Returns the appropriate server variable.  Should work with both
  1289.    * PHP 4.1.0+ as well as older versions.  Returns an empty string
  1290.    * if nothing is found.
  1291.    * @access private
  1292.    * @return mixed
  1293.    */
  1294.   function ServerVar($varName) {
  1295.     global $HTTP_SERVER_VARS;
  1296.     global $HTTP_ENV_VARS;
  1297.     if(!isset($_SERVER)) {
  1298.       $_SERVER = $HTTP_SERVER_VARS;
  1299.       if(!isset($_SERVER['REMOTE_ADDR'])) {
  1300.         $_SERVER = $HTTP_ENV_VARS; // must be Apache
  1301.       }
  1302.     }
  1303.     if(isset($_SERVER[$varName])) {
  1304.       return $_SERVER[$varName];
  1305.     } else {
  1306.       return '';
  1307.     }
  1308.   }
  1309.   /**
  1310.    * Returns the server hostname or 'localhost.localdomain' if unknown.
  1311.    * @access private
  1312.    * @return string
  1313.    */
  1314.   function ServerHostname() {
  1315.     if ($this->Hostname != '') {
  1316.       $result = $this->Hostname;
  1317.     } elseif ($this->ServerVar('SERVER_NAME') != '') {
  1318.       $result = $this->ServerVar('SERVER_NAME');
  1319.     } else {
  1320.       $result = 'localhost.localdomain';
  1321.     }
  1322.     return $result;
  1323.   }
  1324.   /**
  1325.    * Returns a message in the appropriate language.
  1326.    * @access private
  1327.    * @return string
  1328.    */
  1329.   function Lang($key) {
  1330.     if(count($this->language) < 1) {
  1331.       $this->SetLanguage('en'); // set the default language
  1332.     }
  1333.     if(isset($this->language[$key])) {
  1334.       return $this->language[$key];
  1335.     } else {
  1336.       return 'Language string failed to load: ' . $key;
  1337.     }
  1338.   }
  1339.   /**
  1340.    * Returns true if an error occurred.
  1341.    * @return bool
  1342.    */
  1343.   function IsError() {
  1344.     return ($this->error_count > 0);
  1345.   }
  1346.   /**
  1347.    * Changes every end of line from CR or LF to CRLF.
  1348.    * @access private
  1349.    * @return string
  1350.    */
  1351.   function FixEOL($str) {
  1352.     $str = str_replace("rn", "n", $str);
  1353.     $str = str_replace("r", "n", $str);
  1354.     $str = str_replace("n", $this->LE, $str);
  1355.     return $str;
  1356.   }
  1357.   /**
  1358.    * Adds a custom header.
  1359.    * @return void
  1360.    */
  1361.   function AddCustomHeader($custom_header) {
  1362.     $this->CustomHeader[] = explode(':', $custom_header, 2);
  1363.   }
  1364.   /**
  1365.    * Evaluates the message and returns modifications for inline images and backgrounds
  1366.    * @access public
  1367.    * @return $message
  1368.    */
  1369.   function MsgHTML($message) {
  1370.     preg_match_all("/(src|background)="(.*)"/Ui", $message, $images);
  1371.     if(isset($images[2])) {
  1372.       foreach($images[2] as $i => $url) {
  1373.         $filename  = basename($url);
  1374.         $directory = dirname($url);
  1375.         $cid       = 'cid:' . md5($filename);
  1376.         $fileParts = split(".", $filename);
  1377.         $ext       = $fileParts[1];
  1378.         $mimeType  = $this->_mime_types($ext);
  1379.         $message = preg_replace("/".$images[1][$i]."="".preg_quote($url, '/').""/Ui", $images[1][$i]."="".$cid.""", $message);
  1380.         $this->AddEmbeddedImage($url, md5($filename), $filename, 'base64', $mimeType);
  1381.       }
  1382.     }
  1383.     $this->IsHTML(true);
  1384.     $this->Body = $message;
  1385.     $textMsg = trim(strip_tags($message));
  1386.     if ( !empty($textMsg) && empty($this->AltBody) ) {
  1387.       $this->AltBody = $textMsg;
  1388.     }
  1389.     if ( empty($this->AltBody) ) {
  1390.       $this->AltBody = 'To view this email message, open the email in with HTML compatibility!' . "nn";
  1391.     }
  1392.   }
  1393.   /**
  1394.    * Gets the mime type of the embedded or inline image
  1395.    * @access private
  1396.    * @return mime type of ext
  1397.    */
  1398.   function _mime_types($ext = '') {
  1399.     $mimes = array(
  1400.       'hqx'  =>  'application/mac-binhex40',
  1401.       'cpt'   =>  'application/mac-compactpro',
  1402.       'doc'   =>  'application/msword',
  1403.       'bin'   =>  'application/macbinary',
  1404.       'dms'   =>  'application/octet-stream',
  1405.       'lha'   =>  'application/octet-stream',
  1406.       'lzh'   =>  'application/octet-stream',
  1407.       'exe'   =>  'application/octet-stream',
  1408.       'class' =>  'application/octet-stream',
  1409.       'psd'   =>  'application/octet-stream',
  1410.       'so'    =>  'application/octet-stream',
  1411.       'sea'   =>  'application/octet-stream',
  1412.       'dll'   =>  'application/octet-stream',
  1413.       'oda'   =>  'application/oda',
  1414.       'pdf'   =>  'application/pdf',
  1415.       'ai'    =>  'application/postscript',
  1416.       'eps'   =>  'application/postscript',
  1417.       'ps'    =>  'application/postscript',
  1418.       'smi'   =>  'application/smil',
  1419.       'smil'  =>  'application/smil',
  1420.       'mif'   =>  'application/vnd.mif',
  1421.       'xls'   =>  'application/vnd.ms-excel',
  1422.       'ppt'   =>  'application/vnd.ms-powerpoint',
  1423.       'wbxml' =>  'application/vnd.wap.wbxml',
  1424.       'wmlc'  =>  'application/vnd.wap.wmlc',
  1425.       'dcr'   =>  'application/x-director',
  1426.       'dir'   =>  'application/x-director',
  1427.       'dxr'   =>  'application/x-director',
  1428.       'dvi'   =>  'application/x-dvi',
  1429.       'gtar'  =>  'application/x-gtar',
  1430.       'php'   =>  'application/x-httpd-php',
  1431.       'php4'  =>  'application/x-httpd-php',
  1432.       'php3'  =>  'application/x-httpd-php',
  1433.       'phtml' =>  'application/x-httpd-php',
  1434.       'phps'  =>  'application/x-httpd-php-source',
  1435.       'js'    =>  'application/x-javascript',
  1436.       'swf'   =>  'application/x-shockwave-flash',
  1437.       'sit'   =>  'application/x-stuffit',
  1438.       'tar'   =>  'application/x-tar',
  1439.       'tgz'   =>  'application/x-tar',
  1440.       'xhtml' =>  'application/xhtml+xml',
  1441.       'xht'   =>  'application/xhtml+xml',
  1442.       'zip'   =>  'application/zip',
  1443.       'mid'   =>  'audio/midi',
  1444.       'midi'  =>  'audio/midi',
  1445.       'mpga'  =>  'audio/mpeg',
  1446.       'mp2'   =>  'audio/mpeg',
  1447.       'mp3'   =>  'audio/mpeg',
  1448.       'aif'   =>  'audio/x-aiff',
  1449.       'aiff'  =>  'audio/x-aiff',
  1450.       'aifc'  =>  'audio/x-aiff',
  1451.       'ram'   =>  'audio/x-pn-realaudio',
  1452.       'rm'    =>  'audio/x-pn-realaudio',
  1453.       'rpm'   =>  'audio/x-pn-realaudio-plugin',
  1454.       'ra'    =>  'audio/x-realaudio',
  1455.       'rv'    =>  'video/vnd.rn-realvideo',
  1456.       'wav'   =>  'audio/x-wav',
  1457.       'bmp'   =>  'image/bmp',
  1458.       'gif'   =>  'image/gif',
  1459.       'jpeg'  =>  'image/jpeg',
  1460.       'jpg'   =>  'image/jpeg',
  1461.       'jpe'   =>  'image/jpeg',
  1462.       'png'   =>  'image/png',
  1463.       'tiff'  =>  'image/tiff',
  1464.       'tif'   =>  'image/tiff',
  1465.       'css'   =>  'text/css',
  1466.       'html'  =>  'text/html',
  1467.       'htm'   =>  'text/html',
  1468.       'shtml' =>  'text/html',
  1469.       'txt'   =>  'text/plain',
  1470.       'text'  =>  'text/plain',
  1471.       'log'   =>  'text/plain',
  1472.       'rtx'   =>  'text/richtext',
  1473.       'rtf'   =>  'text/rtf',
  1474.       'xml'   =>  'text/xml',
  1475.       'xsl'   =>  'text/xml',
  1476.       'mpeg'  =>  'video/mpeg',
  1477.       'mpg'   =>  'video/mpeg',
  1478.       'mpe'   =>  'video/mpeg',
  1479.       'qt'    =>  'video/quicktime',
  1480.       'mov'   =>  'video/quicktime',
  1481.       'avi'   =>  'video/x-msvideo',
  1482.       'movie' =>  'video/x-sgi-movie',
  1483.       'doc'   =>  'application/msword',
  1484.       'word'  =>  'application/msword',
  1485.       'xl'    =>  'application/excel',
  1486.       'eml'   =>  'message/rfc822'
  1487.     );
  1488.     return ( ! isset($mimes[strtolower($ext)])) ? 'application/x-unknown-content-type' : $mimes[strtolower($ext)];
  1489.   }
  1490.   /**
  1491.    * Set (or reset) Class Objects (variables)
  1492.    *
  1493.    * Usage Example:
  1494.    * $page->set('X-Priority', '3');
  1495.    *
  1496.    * @access public
  1497.    * @param string $name Parameter Name
  1498.    * @param mixed $value Parameter Value
  1499.    * NOTE: will not work with arrays, there are no arrays to set/reset
  1500.    */
  1501.   function set ( $name, $value = '' ) {
  1502.     if ( isset($this->$name) ) {
  1503.       $this->$name = $value;
  1504.     } else {
  1505.       $this->SetError('Cannot set or reset variable ' . $name);
  1506.       return false;
  1507.     }
  1508.   }
  1509.   /**
  1510.    * Read a file from a supplied filename and return it.
  1511.    *
  1512.    * @access public
  1513.    * @param string $filename Parameter File Name
  1514.    */
  1515.   function getFile($filename) {
  1516.     $return = '';
  1517.     if ($fp = fopen($filename, 'rb')) {
  1518.       while (!feof($fp)) {
  1519.         $return .= fread($fp, 1024);
  1520.       }
  1521.       fclose($fp);
  1522.       return $return;
  1523.     } else {
  1524.       return false;
  1525.     }
  1526.   }
  1527.   /**
  1528.    * Strips newlines to prevent header injection.
  1529.    * @access private
  1530.    * @param string $str String
  1531.    * @return string
  1532.    */
  1533.   function SecureHeader($str) {
  1534.     $str = trim($str);
  1535.     $str = str_replace("r", "", $str);
  1536.     $str = str_replace("n", "", $str);
  1537.     return $str;
  1538.   }
  1539. }
  1540. ?>