码迷,mamicode.com
首页 > Web开发 > 详细

ThinkPHP发送邮件

时间:2016-10-13 19:10:32      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:

引入类文件:PHPMailer.class.php

技术分享
   1 <?php
   2 /*~ class.phpmailer.php
   3 .---------------------------------------------------------------------------.
   4 |  Software: PHPMailer - PHP email class                                    |
   5 |   Version: 5.0.2                                                          |
   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 |     Admin: Andy Prevost (project admininistrator)                         |
  11 |   Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
  12 |          : Marcus Bointon (coolbru) coolbru@users.sourceforge.net         |
  13 |   Founder: Brent R. Matzelle (original founder)                           |
  14 | Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved.               |
  15 | Copyright (c) 2001-2003, Brent R. Matzelle                                |
  16 | ------------------------------------------------------------------------- |
  17 |   License: Distributed under the Lesser General Public License (LGPL)     |
  18 |            http://www.gnu.org/copyleft/lesser.html                        |
  19 | This program is distributed in the hope that it will be useful - WITHOUT  |
  20 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or     |
  21 | FITNESS FOR A PARTICULAR PURPOSE.                                         |
  22 | ------------------------------------------------------------------------- |
  23 | We offer a number of paid services (www.codeworxtech.com):                |
  24 | - Web Hosting on highly optimized fast and secure servers                 |
  25 | - Technology Consulting                                                   |
  26 | - Oursourcing (highly qualified programmers and graphic designers)        |
  27 ‘---------------------------------------------------------------------------‘
  28 */
  29 
  30 /**
  31  * PHPMailer - PHP email transport class
  32  * NOTE: Requires PHP version 5 or later
  33  * @package PHPMailer
  34  * @author Andy Prevost
  35  * @author Marcus Bointon
  36  * @copyright 2004 - 2009 Andy Prevost
  37  * @version $Id: class.phpmailer.php 447 2009-05-25 01:36:38Z codeworxtech $
  38  * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
  39  */
  40 class PHPMailer {
  41 
  42   /////////////////////////////////////////////////
  43   // PROPERTIES, PUBLIC
  44   /////////////////////////////////////////////////
  45 
  46   /**
  47    * Email priority (1 = High, 3 = Normal, 5 = low).
  48    * @var int
  49    */
  50   public $Priority          = 3;
  51 
  52   /**
  53    * Sets the CharSet of the message.
  54    * @var string
  55    */
  56   public $CharSet           = ‘iso-8859-1‘;
  57 
  58   /**
  59    * Sets the Content-type of the message.
  60    * @var string
  61    */
  62   public $ContentType       = ‘text/plain‘;
  63 
  64   /**
  65    * Sets the Encoding of the message. Options for this are
  66    *  "8bit", "7bit", "binary", "base64", and "quoted-printable".
  67    * @var string
  68    */
  69   public $Encoding          = ‘8bit‘;
  70 
  71   /**
  72    * Holds the most recent mailer error message.
  73    * @var string
  74    */
  75   public $ErrorInfo         = ‘‘;
  76 
  77   /**
  78    * Sets the From email address for the message.
  79    * @var string
  80    */
  81   public $From              = ‘root@localhost‘;
  82 
  83   /**
  84    * Sets the From name of the message.
  85    * @var string
  86    */
  87   public $FromName          = ‘Root User‘;
  88 
  89   /**
  90    * Sets the Sender email (Return-Path) of the message.  If not empty,
  91    * will be sent via -f to sendmail or as ‘MAIL FROM‘ in smtp mode.
  92    * @var string
  93    */
  94   public $Sender            = ‘‘;
  95 
  96   /**
  97    * Sets the Subject of the message.
  98    * @var string
  99    */
 100   public $Subject           = ‘‘;
 101 
 102   /**
 103    * Sets the Body of the message.  This can be either an HTML or text body.
 104    * If HTML then run IsHTML(true).
 105    * @var string
 106    */
 107   public $Body              = ‘‘;
 108 
 109   /**
 110    * Sets the text-only body of the message.  This automatically sets the
 111    * email to multipart/alternative.  This body can be read by mail
 112    * clients that do not have HTML email capability such as mutt. Clients
 113    * that can read HTML will view the normal Body.
 114    * @var string
 115    */
 116   public $AltBody           = ‘‘;
 117 
 118   /**
 119    * Sets word wrapping on the body of the message to a given number of
 120    * characters.
 121    * @var int
 122    */
 123   public $WordWrap          = 0;
 124 
 125   /**
 126    * Method to send mail: ("mail", "sendmail", or "smtp").
 127    * @var string
 128    */
 129   public $Mailer            = ‘mail‘;
 130 
 131   /**
 132    * Sets the path of the sendmail program.
 133    * @var string
 134    */
 135   public $Sendmail          = ‘/usr/sbin/sendmail‘;
 136 
 137   /**
 138    * Path to PHPMailer plugins.  Useful if the SMTP class
 139    * is in a different directory than the PHP include path.
 140    * @var string
 141    */
 142   public $PluginDir         = ‘‘;
 143 
 144   /**
 145    * Sets the email address that a reading confirmation will be sent.
 146    * @var string
 147    */
 148   public $ConfirmReadingTo  = ‘‘;
 149 
 150   /**
 151    * Sets the hostname to use in Message-Id and Received headers
 152    * and as default HELO string. If empty, the value returned
 153    * by SERVER_NAME is used or ‘localhost.localdomain‘.
 154    * @var string
 155    */
 156   public $Hostname          = ‘‘;
 157 
 158   /**
 159    * Sets the message ID to be used in the Message-Id header.
 160    * If empty, a unique id will be generated.
 161    * @var string
 162    */
 163   public $MessageID         = ‘‘;
 164 
 165   /////////////////////////////////////////////////
 166   // PROPERTIES FOR SMTP
 167   /////////////////////////////////////////////////
 168 
 169   /**
 170    * Sets the SMTP hosts.  All hosts must be separated by a
 171    * semicolon.  You can also specify a different port
 172    * for each host by using this format: [hostname:port]
 173    * (e.g. "smtp1.example.com:25;smtp2.example.com").
 174    * Hosts will be tried in order.
 175    * @var string
 176    */
 177   public $Host          = ‘localhost‘;
 178 
 179   /**
 180    * Sets the default SMTP server port.
 181    * @var int
 182    */
 183   public $Port          = 25;
 184 
 185   /**
 186    * Sets the SMTP HELO of the message (Default is $Hostname).
 187    * @var string
 188    */
 189   public $Helo          = ‘‘;
 190 
 191   /**
 192    * Sets connection prefix.
 193    * Options are "", "ssl" or "tls"
 194    * @var string
 195    */
 196   public $SMTPSecure    = ‘‘;
 197 
 198   /**
 199    * Sets SMTP authentication. Utilizes the Username and Password variables.
 200    * @var bool
 201    */
 202   public $SMTPAuth      = false;
 203 
 204   /**
 205    * Sets SMTP username.
 206    * @var string
 207    */
 208   public $Username      = ‘‘;
 209 
 210   /**
 211    * Sets SMTP password.
 212    * @var string
 213    */
 214   public $Password      = ‘‘;
 215 
 216   /**
 217    * Sets the SMTP server timeout in seconds.
 218    * This function will not work with the win32 version.
 219    * @var int
 220    */
 221   public $Timeout       = 10;
 222 
 223   /**
 224    * Sets SMTP class debugging on or off.
 225    * @var bool
 226    */
 227   public $SMTPDebug     = false;
 228 
 229   /**
 230    * Prevents the SMTP connection from being closed after each mail
 231    * sending.  If this is set to true then to close the connection
 232    * requires an explicit call to SmtpClose().
 233    * @var bool
 234    */
 235   public $SMTPKeepAlive = false;
 236 
 237   /**
 238    * Provides the ability to have the TO field process individual
 239    * emails, instead of sending to entire TO addresses
 240    * @var bool
 241    */
 242   public $SingleTo      = false;
 243 
 244   /**
 245    * Provides the ability to change the line ending
 246    * @var string
 247    */
 248   public $LE              = "\n";
 249 
 250   /**
 251    * Sets the PHPMailer Version number
 252    * @var string
 253    */
 254   public $Version         = ‘5.0.2‘;
 255 
 256   /////////////////////////////////////////////////
 257   // PROPERTIES, PRIVATE AND PROTECTED
 258   /////////////////////////////////////////////////
 259 
 260   private   $smtp           = NULL;
 261   private   $to             = array();
 262   private   $cc             = array();
 263   private   $bcc            = array();
 264   private   $ReplyTo        = array();
 265   private   $all_recipients = array();
 266   private   $attachment     = array();
 267   private   $CustomHeader   = array();
 268   private   $message_type   = ‘‘;
 269   private   $boundary       = array();
 270   protected $language       = array();
 271   private   $error_count    = 0;
 272   private   $sign_cert_file = "";
 273   private   $sign_key_file  = "";
 274   private   $sign_key_pass  = "";
 275   private   $exceptions     = false;
 276 
 277   /////////////////////////////////////////////////
 278   // CONSTANTS
 279   /////////////////////////////////////////////////
 280 
 281   const STOP_MESSAGE = 0; // message only, continue processing
 282   const STOP_CONTINUE = 1; // message?, likely ok to continue processing
 283   const STOP_CRITICAL = 2; // message, plus full stop, critical error reached
 284 
 285   /////////////////////////////////////////////////
 286   // METHODS, VARIABLES
 287   /////////////////////////////////////////////////
 288 
 289   /**
 290    * Constructor
 291    * @param boolean $exceptions Should we throw external exceptions?
 292    */
 293   public function __construct($exceptions = false) {
 294     $this->exceptions = ($exceptions == true);
 295   }
 296 
 297   /**
 298    * Sets message type to HTML.
 299    * @param bool $ishtml
 300    * @return void
 301    */
 302   public function IsHTML($ishtml = true) {
 303     if ($ishtml) {
 304       $this->ContentType = ‘text/html‘;
 305     } else {
 306       $this->ContentType = ‘text/plain‘;
 307     }
 308   }
 309 
 310   /**
 311    * Sets Mailer to send message using SMTP.
 312    * @return void
 313    */
 314   public function IsSMTP() {
 315     $this->Mailer = ‘smtp‘;
 316   }
 317 
 318   /**
 319    * Sets Mailer to send message using PHP mail() function.
 320    * @return void
 321    */
 322   public function IsMail() {
 323     $this->Mailer = ‘mail‘;
 324   }
 325 
 326   /**
 327    * Sets Mailer to send message using the $Sendmail program.
 328    * @return void
 329    */
 330   public function IsSendmail() {
 331     if (!stristr(ini_get(‘sendmail_path‘), ‘sendmail‘)) {
 332       $this->Sendmail = ‘/var/qmail/bin/sendmail‘;
 333     }
 334     $this->Mailer = ‘sendmail‘;
 335   }
 336 
 337   /**
 338    * Sets Mailer to send message using the qmail MTA.
 339    * @return void
 340    */
 341   public function IsQmail() {
 342     if (stristr(ini_get(‘sendmail_path‘), ‘qmail‘)) {
 343       $this->Sendmail = ‘/var/qmail/bin/sendmail‘;
 344     }
 345     $this->Mailer = ‘sendmail‘;
 346   }
 347 
 348   /////////////////////////////////////////////////
 349   // METHODS, RECIPIENTS
 350   /////////////////////////////////////////////////
 351 
 352   /**
 353    * Adds a "To" address.
 354    * @param string $address
 355    * @param string $name
 356    * @return boolean true on success, false if address already used
 357    */
 358   public function AddAddress($address, $name = ‘‘) {
 359     return $this->AddAnAddress(‘to‘, $address, $name);
 360   }
 361 
 362   /**
 363    * Adds a "Cc" address.
 364    * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
 365    * @param string $address
 366    * @param string $name
 367    * @return boolean true on success, false if address already used
 368    */
 369   public function AddCC($address, $name = ‘‘) {
 370     return $this->AddAnAddress(‘cc‘, $address, $name);
 371   }
 372 
 373   /**
 374    * Adds a "Bcc" address.
 375    * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
 376    * @param string $address
 377    * @param string $name
 378    * @return boolean true on success, false if address already used
 379    */
 380   public function AddBCC($address, $name = ‘‘) {
 381     return $this->AddAnAddress(‘bcc‘, $address, $name);
 382   }
 383 
 384   /**
 385    * Adds a "Reply-to" address.
 386    * @param string $address
 387    * @param string $name
 388    * @return boolean
 389    */
 390   public function AddReplyTo($address, $name = ‘‘) {
 391     return $this->AddAnAddress(‘ReplyTo‘, $address, $name);
 392   }
 393 
 394   /**
 395    * Adds an address to one of the recipient arrays
 396    * Addresses that have been added already return false, but do not throw exceptions
 397    * @param string $kind One of ‘to‘, ‘cc‘, ‘bcc‘, ‘ReplyTo‘
 398    * @param string $address The email address to send to
 399    * @param string $name
 400    * @return boolean true on success, false if address already used or invalid in some way
 401    * @access private
 402    */
 403   private function AddAnAddress($kind, $address, $name = ‘‘) {
 404     if (!preg_match(‘/^(to|cc|bcc|ReplyTo)$/‘, $kind)) {
 405       echo ‘Invalid recipient array: ‘ . kind;
 406       return false;
 407     }
 408     $address = trim($address);
 409     $name = trim(preg_replace(‘/[\r\n]+/‘, ‘‘, $name)); //Strip breaks and trim
 410     if (!self::ValidateAddress($address)) {
 411       $this->SetError($this->Lang(‘invalid_address‘).‘: ‘. $address);
 412       if ($this->exceptions) {
 413         throw new phpmailerException($this->Lang(‘invalid_address‘).‘: ‘.$address);
 414       }
 415       echo $this->Lang(‘invalid_address‘).‘: ‘.$address;
 416       return false;
 417     }
 418   if ($kind != ‘ReplyTo‘) {
 419     if (!isset($this->all_recipients[strtolower($address)])) {
 420         array_push($this->$kind, array($address, $name));
 421         $this->all_recipients[strtolower($address)] = true;
 422     return true;
 423       }
 424   } else {
 425     if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
 426         $this->ReplyTo[strtolower($address)] = array($address, $name);
 427     return true;
 428     }
 429   }
 430     return false;
 431   }
 432 
 433 /**
 434  * Set the From and FromName properties
 435  * @param string $address
 436  * @param string $name
 437  * @return boolean
 438  */
 439   public function SetFrom($address, $name = ‘‘) {
 440     $address = trim($address);
 441     $name = trim(preg_replace(‘/[\r\n]+/‘, ‘‘, $name)); //Strip breaks and trim
 442     if (!self::ValidateAddress($address)) {
 443       $this->SetError($this->Lang(‘invalid_address‘).‘: ‘. $address);
 444       if ($this->exceptions) {
 445         throw new phpmailerException($this->Lang(‘invalid_address‘).‘: ‘.$address);
 446       }
 447       echo $this->Lang(‘invalid_address‘).‘: ‘.$address;
 448       return false;
 449     }
 450   $this->From = $address;
 451   $this->FromName = $name;
 452   return true;
 453   }
 454 
 455   /**
 456    * Check that a string looks roughly like an email address should
 457    * Static so it can be used without instantiation
 458    * Tries to use PHP built-in validator in the filter extension (from PHP 5.2), falls back to a reasonably competent regex validator
 459    * Conforms approximately to RFC2822
 460    * @link http://www.hexillion.com/samples/#Regex Original pattern found here
 461    * @param string $address The email address to check
 462    * @return boolean
 463    * @static
 464    * @access public
 465    */
 466   public static function ValidateAddress($address) {
 467     if (function_exists(‘filter_var‘)) { //Introduced in PHP 5.2
 468       if(filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) {
 469         return false;
 470       } else {
 471         return true;
 472       }
 473     } else {
 474       return preg_match(‘/^(?:[\w\!\#\$\%\&\‘\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\‘\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/‘, $address);
 475     }
 476   }
 477 
 478   /////////////////////////////////////////////////
 479   // METHODS, MAIL SENDING
 480   /////////////////////////////////////////////////
 481 
 482   /**
 483    * Creates message and assigns Mailer. If the message is
 484    * not sent successfully then it returns false.  Use the ErrorInfo
 485    * variable to view description of the error.
 486    * @return bool
 487    */
 488   public function Send() {
 489     try {
 490       if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
 491         throw new phpmailerException($this->Lang(‘provide_address‘), self::STOP_CRITICAL);
 492       }
 493 
 494       // Set whether the message is multipart/alternative
 495       if(!empty($this->AltBody)) {
 496         $this->ContentType = ‘multipart/alternative‘;
 497       }
 498 
 499       $this->error_count = 0; // reset errors
 500       $this->SetMessageType();
 501       $header = $this->CreateHeader();
 502       $body = $this->CreateBody();
 503 
 504       if (empty($this->Body)) {
 505         throw new phpmailerException($this->Lang(‘empty_message‘), self::STOP_CRITICAL);
 506       }
 507 
 508       // Choose the mailer and send through it
 509       switch($this->Mailer) {
 510         case ‘sendmail‘:
 511           return $this->SendmailSend($header, $body);
 512         case ‘smtp‘:
 513           return $this->SmtpSend($header, $body);
 514         case ‘mail‘:
 515         default:
 516           return $this->MailSend($header, $body);
 517       }
 518 
 519     } catch (phpmailerException $e) {
 520       $this->SetError($e->getMessage());
 521       if ($this->exceptions) {
 522         throw $e;
 523       }
 524       echo $e->getMessage()."\n";
 525       return false;
 526     }
 527   }
 528 
 529   /**
 530    * Sends mail using the $Sendmail program.
 531    * @param string $header The message headers
 532    * @param string $body The message body
 533    * @access protected
 534    * @return bool
 535    */
 536   protected function SendmailSend($header, $body) {
 537     if ($this->Sender != ‘‘) {
 538       $sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
 539     } else {
 540       $sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail));
 541     }
 542     if(!@$mail = popen($sendmail, ‘w‘)) {
 543       throw new phpmailerException($this->Lang(‘execute‘) . $this->Sendmail, self::STOP_CRITICAL);
 544     }
 545     fputs($mail, $header);
 546     fputs($mail, $body);
 547     $result = pclose($mail);
 548     if($result != 0) {
 549       throw new phpmailerException($this->Lang(‘execute‘) . $this->Sendmail, self::STOP_CRITICAL);
 550     }
 551     return true;
 552   }
 553 
 554   /**
 555    * Sends mail using the PHP mail() function.
 556    * @param string $header The message headers
 557    * @param string $body The message body
 558    * @access protected
 559    * @return bool
 560    */
 561   protected function MailSend($header, $body) {
 562     $toArr = array();
 563     foreach($this->to as $t) {
 564       $toArr[] = $this->AddrFormat($t);
 565     }
 566     $to = implode(‘, ‘, $toArr);
 567 
 568     $params = sprintf("-oi -f %s", $this->Sender);
 569     if ($this->Sender != ‘‘ && strlen(ini_get(‘safe_mode‘))< 1) {
 570       $old_from = ini_get(‘sendmail_from‘);
 571       ini_set(‘sendmail_from‘, $this->Sender);
 572       if ($this->SingleTo === true && count($toArr) > 1) {
 573         foreach ($toArr as $key => $val) {
 574           $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
 575         }
 576       } else {
 577         $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
 578       }
 579     } else {
 580       if ($this->SingleTo === true && count($toArr) > 1) {
 581         foreach ($toArr as $key => $val) {
 582           $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
 583         }
 584       } else {
 585         $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header);
 586       }
 587     }
 588     if (isset($old_from)) {
 589       ini_set(‘sendmail_from‘, $old_from);
 590     }
 591     if(!$rt) {
 592       throw new phpmailerException($this->Lang(‘instantiate‘), self::STOP_CRITICAL);
 593     }
 594     return true;
 595   }
 596 
 597   /**
 598    * Sends mail via SMTP using PhpSMTP
 599    * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
 600    * @param string $header The message headers
 601    * @param string $body The message body
 602    * @uses SMTP
 603    * @access protected
 604    * @return bool
 605    */
 606   protected function SmtpSend($header, $body) {
 607     require_once $this->PluginDir . ‘class.smtp.php‘;
 608     $bad_rcpt = array();
 609 
 610     if(!$this->SmtpConnect()) {
 611       throw new phpmailerException($this->Lang(‘smtp_connect_failed‘), self::STOP_CRITICAL);
 612     }
 613     $smtp_from = ($this->Sender == ‘‘) ? $this->From : $this->Sender;
 614     if(!$this->smtp->Mail($smtp_from)) {
 615       throw new phpmailerException($this->Lang(‘from_failed‘) . $smtp_from, self::STOP_CRITICAL);
 616     }
 617 
 618     // Attempt to send attach all recipients
 619     foreach($this->to as $to) {
 620       if (!$this->smtp->Recipient($to[0])) {
 621         $bad_rcpt[] = $to[0];
 622       }
 623     }
 624     foreach($this->cc as $cc) {
 625       if (!$this->smtp->Recipient($cc[0])) {
 626         $bad_rcpt[] = $cc[0];
 627       }
 628     }
 629     foreach($this->bcc as $bcc) {
 630       if (!$this->smtp->Recipient($bcc[0])) {
 631         $bad_rcpt[] = $bcc[0];
 632       }
 633     }
 634     if (count($bad_rcpt) > 0 ) { //Create error message for any bad addresses
 635       $badaddresses = implode(‘, ‘, $bad_rcpt);
 636       throw new phpmailerException($this->Lang(‘recipients_failed‘) . $badaddresses);
 637     }
 638     if(!$this->smtp->Data($header . $body)) {
 639       throw new phpmailerException($this->Lang(‘data_not_accepted‘), self::STOP_CRITICAL);
 640     }
 641     if($this->SMTPKeepAlive == true) {
 642       $this->smtp->Reset();
 643     }
 644     return true;
 645   }
 646 
 647   /**
 648    * Initiates a connection to an SMTP server.
 649    * Returns false if the operation failed.
 650    * @uses SMTP
 651    * @access public
 652    * @return bool
 653    */
 654   public function SmtpConnect() {
 655     if(is_null($this->smtp)) {
 656       $this->smtp = new SMTP();
 657     }
 658 
 659     $this->smtp->do_debug = $this->SMTPDebug;
 660     $hosts = explode(‘;‘, $this->Host);
 661     $index = 0;
 662     $connection = $this->smtp->Connected();
 663 
 664     // Retry while there is no connection
 665     try {
 666       while($index < count($hosts) && !$connection) {
 667         $hostinfo = array();
 668         if (preg_match(‘/^(.+):([0-9]+)$/‘, $hosts[$index], $hostinfo)) {
 669           $host = $hostinfo[1];
 670           $port = $hostinfo[2];
 671         } else {
 672           $host = $hosts[$index];
 673           $port = $this->Port;
 674         }
 675 
 676         $tls = ($this->SMTPSecure == ‘tls‘);
 677         $ssl = ($this->SMTPSecure == ‘ssl‘);
 678 
 679         if ($this->smtp->Connect(($ssl ? ‘ssl://‘:‘‘).$host, $port, $this->Timeout)) {
 680 
 681           $hello = ($this->Helo != ‘‘ ? $this->Helo : $this->ServerHostname());
 682           $this->smtp->Hello($hello);
 683 
 684           if ($tls) {
 685             if (!$this->smtp->StartTLS()) {
 686               throw new phpmailerException($this->Lang(‘tls‘));
 687             }
 688 
 689             //We must resend HELO after tls negotiation
 690             $this->smtp->Hello($hello);
 691           }
 692 
 693           $connection = true;
 694           if ($this->SMTPAuth) {
 695             if (!$this->smtp->Authenticate($this->Username, $this->Password)) {
 696               throw new phpmailerException($this->Lang(‘authenticate‘));
 697             }
 698           }
 699         }
 700         $index++;
 701         if (!$connection) {
 702           throw new phpmailerException($this->Lang(‘connect_host‘));
 703         }
 704       }
 705     } catch (phpmailerException $e) {
 706       $this->smtp->Reset();
 707       throw $e;
 708     }
 709     return true;
 710   }
 711 
 712   /**
 713    * Closes the active SMTP session if one exists.
 714    * @return void
 715    */
 716   public function SmtpClose() {
 717     if(!is_null($this->smtp)) {
 718       if($this->smtp->Connected()) {
 719         $this->smtp->Quit();
 720         $this->smtp->Close();
 721       }
 722     }
 723   }
 724 
 725   /**
 726   * Sets the language for all class error messages.
 727   * Returns false if it cannot load the language file.  The default language is English.
 728   * @param string $langcode ISO 639-1 2-character language code (e.g. Portuguese: "br")
 729   * @param string $lang_path Path to the language file directory
 730   * @access public
 731   */
 732   function SetLanguage($langcode = ‘en‘, $lang_path = ‘language/‘) {
 733     //Define full set of translatable strings
 734     $PHPMAILER_LANG = array(
 735       ‘provide_address‘ => ‘You must provide at least one recipient email address.‘,
 736       ‘mailer_not_supported‘ => ‘ mailer is not supported.‘,
 737       ‘execute‘ => ‘Could not execute: ‘,
 738       ‘instantiate‘ => ‘Could not instantiate mail function.‘,
 739       ‘authenticate‘ => ‘SMTP Error: Could not authenticate.‘,
 740       ‘from_failed‘ => ‘The following From address failed: ‘,
 741       ‘recipients_failed‘ => ‘SMTP Error: The following recipients failed: ‘,
 742       ‘data_not_accepted‘ => ‘SMTP Error: Data not accepted.‘,
 743       ‘connect_host‘ => ‘SMTP Error: Could not connect to SMTP host.‘,
 744       ‘file_access‘ => ‘Could not access file: ‘,
 745       ‘file_open‘ => ‘File Error: Could not open file: ‘,
 746       ‘encoding‘ => ‘Unknown encoding: ‘,
 747       ‘signing‘ => ‘Signing Error: ‘,
 748       ‘smtp_error‘ => ‘SMTP server error: ‘,
 749       ‘empty_message‘ => ‘Message body empty‘,
 750       ‘invalid_address‘ => ‘Invalid address‘,
 751       ‘variable_set‘ => ‘Cannot set or reset variable: ‘
 752     );
 753     //Overwrite language-specific strings. This way we‘ll never have missing translations - no more "language string failed to load"!
 754     $l = true;
 755     if ($langcode != ‘en‘) { //There is no English translation file
 756       $l = @include $lang_path.‘phpmailer.lang-‘.$langcode.‘.php‘;
 757     }
 758     $this->language = $PHPMAILER_LANG;
 759     return ($l == true); //Returns false if language not found
 760   }
 761 
 762   /**
 763   * Return the current array of language strings
 764   * @return array
 765   */
 766   public function GetTranslations() {
 767     return $this->language;
 768   }
 769 
 770   /////////////////////////////////////////////////
 771   // METHODS, MESSAGE CREATION
 772   /////////////////////////////////////////////////
 773 
 774   /**
 775    * Creates recipient headers.
 776    * @access public
 777    * @return string
 778    */
 779   public function AddrAppend($type, $addr) {
 780     $addr_str = $type . ‘: ‘;
 781     $addresses = array();
 782     foreach ($addr as $a) {
 783       $addresses[] = $this->AddrFormat($a);
 784     }
 785     $addr_str .= implode(‘, ‘, $addresses);
 786     $addr_str .= $this->LE;
 787 
 788     return $addr_str;
 789   }
 790 
 791   /**
 792    * Formats an address correctly.
 793    * @access public
 794    * @return string
 795    */
 796   public function AddrFormat($addr) {
 797     if (empty($addr[1])) {
 798       return $this->SecureHeader($addr[0]);
 799     } else {
 800       return $this->EncodeHeader($this->SecureHeader($addr[1]), ‘phrase‘) . " <" . $this->SecureHeader($addr[0]) . ">";
 801     }
 802   }
 803 
 804   /**
 805    * Wraps message for use with mailers that do not
 806    * automatically perform wrapping and for quoted-printable.
 807    * Original written by philippe.
 808    * @param string $message The message to wrap
 809    * @param integer $length The line length to wrap to
 810    * @param boolean $qp_mode Whether to run in Quoted-Printable mode
 811    * @access public
 812    * @return string
 813    */
 814   public function WrapText($message, $length, $qp_mode = false) {
 815     $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;
 816     // If utf-8 encoding is used, we will need to make sure we don‘t
 817     // split multibyte characters when we wrap
 818     $is_utf8 = (strtolower($this->CharSet) == "utf-8");
 819 
 820     $message = $this->FixEOL($message);
 821     if (substr($message, -1) == $this->LE) {
 822       $message = substr($message, 0, -1);
 823     }
 824 
 825     $line = explode($this->LE, $message);
 826     $message = ‘‘;
 827     for ($i=0 ;$i < count($line); $i++) {
 828       $line_part = explode(‘ ‘, $line[$i]);
 829       $buf = ‘‘;
 830       for ($e = 0; $e<count($line_part); $e++) {
 831         $word = $line_part[$e];
 832         if ($qp_mode and (strlen($word) > $length)) {
 833           $space_left = $length - strlen($buf) - 1;
 834           if ($e != 0) {
 835             if ($space_left > 20) {
 836               $len = $space_left;
 837               if ($is_utf8) {
 838                 $len = $this->UTF8CharBoundary($word, $len);
 839               } elseif (substr($word, $len - 1, 1) == "=") {
 840                 $len--;
 841               } elseif (substr($word, $len - 2, 1) == "=") {
 842                 $len -= 2;
 843               }
 844               $part = substr($word, 0, $len);
 845               $word = substr($word, $len);
 846               $buf .= ‘ ‘ . $part;
 847               $message .= $buf . sprintf("=%s", $this->LE);
 848             } else {
 849               $message .= $buf . $soft_break;
 850             }
 851             $buf = ‘‘;
 852           }
 853           while (strlen($word) > 0) {
 854             $len = $length;
 855             if ($is_utf8) {
 856               $len = $this->UTF8CharBoundary($word, $len);
 857             } elseif (substr($word, $len - 1, 1) == "=") {
 858               $len--;
 859             } elseif (substr($word, $len - 2, 1) == "=") {
 860               $len -= 2;
 861             }
 862             $part = substr($word, 0, $len);
 863             $word = substr($word, $len);
 864 
 865             if (strlen($word) > 0) {
 866               $message .= $part . sprintf("=%s", $this->LE);
 867             } else {
 868               $buf = $part;
 869             }
 870           }
 871         } else {
 872           $buf_o = $buf;
 873           $buf .= ($e == 0) ? $word : (‘ ‘ . $word);
 874 
 875           if (strlen($buf) > $length and $buf_o != ‘‘) {
 876             $message .= $buf_o . $soft_break;
 877             $buf = $word;
 878           }
 879         }
 880       }
 881       $message .= $buf . $this->LE;
 882     }
 883 
 884     return $message;
 885   }
 886 
 887   /**
 888    * Finds last character boundary prior to maxLength in a utf-8
 889    * quoted (printable) encoded string.
 890    * Original written by Colin Brown.
 891    * @access public
 892    * @param string $encodedText utf-8 QP text
 893    * @param int    $maxLength   find last character boundary prior to this length
 894    * @return int
 895    */
 896   public function UTF8CharBoundary($encodedText, $maxLength) {
 897     $foundSplitPos = false;
 898     $lookBack = 3;
 899     while (!$foundSplitPos) {
 900       $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
 901       $encodedCharPos = strpos($lastChunk, "=");
 902       if ($encodedCharPos !== false) {
 903         // Found start of encoded character byte within $lookBack block.
 904         // Check the encoded byte value (the 2 chars after the ‘=‘)
 905         $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
 906         $dec = hexdec($hex);
 907         if ($dec < 128) { // Single byte character.
 908           // If the encoded char was found at pos 0, it will fit
 909           // otherwise reduce maxLength to start of the encoded char
 910           $maxLength = ($encodedCharPos == 0) ? $maxLength :
 911           $maxLength - ($lookBack - $encodedCharPos);
 912           $foundSplitPos = true;
 913         } elseif ($dec >= 192) { // First byte of a multi byte character
 914           // Reduce maxLength to split at start of character
 915           $maxLength = $maxLength - ($lookBack - $encodedCharPos);
 916           $foundSplitPos = true;
 917         } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back
 918           $lookBack += 3;
 919         }
 920       } else {
 921         // No encoded character found
 922         $foundSplitPos = true;
 923       }
 924     }
 925     return $maxLength;
 926   }
 927 
 928 
 929   /**
 930    * Set the body wrapping.
 931    * @access public
 932    * @return void
 933    */
 934   public function SetWordWrap() {
 935     if($this->WordWrap < 1) {
 936       return;
 937     }
 938 
 939     switch($this->message_type) {
 940       case ‘alt‘:
 941       case ‘alt_attachments‘:
 942         $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);
 943         break;
 944       default:
 945         $this->Body = $this->WrapText($this->Body, $this->WordWrap);
 946         break;
 947     }
 948   }
 949 
 950   /**
 951    * Assembles message header.
 952    * @access public
 953    * @return string The assembled header
 954    */
 955   public function CreateHeader() {
 956     $result = ‘‘;
 957 
 958     // Set the boundaries
 959     $uniq_id = md5(uniqid(time()));
 960     $this->boundary[1] = ‘b1_‘ . $uniq_id;
 961     $this->boundary[2] = ‘b2_‘ . $uniq_id;
 962 
 963     $result .= $this->HeaderLine(‘Date‘, self::RFCDate());
 964     if($this->Sender == ‘‘) {
 965       $result .= $this->HeaderLine(‘Return-Path‘, trim($this->From));
 966     } else {
 967       $result .= $this->HeaderLine(‘Return-Path‘, trim($this->Sender));
 968     }
 969 
 970     // To be created automatically by mail()
 971     if($this->Mailer != ‘mail‘) {
 972       if(count($this->to) > 0) {
 973         $result .= $this->AddrAppend(‘To‘, $this->to);
 974       } elseif (count($this->cc) == 0) {
 975         $result .= $this->HeaderLine(‘To‘, ‘undisclosed-recipients:;‘);
 976       }
 977     }
 978 
 979     $from = array();
 980     $from[0][0] = trim($this->From);
 981     $from[0][1] = $this->FromName;
 982     $result .= $this->AddrAppend(‘From‘, $from);
 983 
 984     // sendmail and mail() extract Cc from the header before sending
 985     if(count($this->cc) > 0) {
 986       $result .= $this->AddrAppend(‘Cc‘, $this->cc);
 987     }
 988 
 989     // sendmail and mail() extract Bcc from the header before sending
 990     if((($this->Mailer == ‘sendmail‘) || ($this->Mailer == ‘mail‘)) && (count($this->bcc) > 0)) {
 991       $result .= $this->AddrAppend(‘Bcc‘, $this->bcc);
 992     }
 993 
 994     if(count($this->ReplyTo) > 0) {
 995       $result .= $this->AddrAppend(‘Reply-to‘, $this->ReplyTo);
 996     }
 997 
 998     // mail() sets the subject itself
 999     if($this->Mailer != ‘mail‘) {
1000       $result .= $this->HeaderLine(‘Subject‘, $this->EncodeHeader($this->SecureHeader($this->Subject)));
1001     }
1002 
1003     if($this->MessageID != ‘‘) {
1004       $result .= $this->HeaderLine(‘Message-ID‘,$this->MessageID);
1005     } else {
1006       $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE);
1007     }
1008     $result .= $this->HeaderLine(‘X-Priority‘, $this->Priority);
1009     $result .= $this->HeaderLine(‘X-Mailer‘, ‘PHPMailer ‘.$this->Version.‘ (phpmailer.codeworxtech.com)‘);
1010 
1011     if($this->ConfirmReadingTo != ‘‘) {
1012       $result .= $this->HeaderLine(‘Disposition-Notification-To‘, ‘<‘ . trim($this->ConfirmReadingTo) . ‘>‘);
1013     }
1014 
1015     // Add custom headers
1016     for($index = 0; $index < count($this->CustomHeader); $index++) {
1017       $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1])));
1018     }
1019     if (!$this->sign_key_file) {
1020       $result .= $this->HeaderLine(‘MIME-Version‘, ‘1.0‘);
1021       $result .= $this->GetMailMIME();
1022     }
1023 
1024     return $result;
1025   }
1026 
1027   /**
1028    * Returns the message MIME.
1029    * @access public
1030    * @return string
1031    */
1032   public function GetMailMIME() {
1033     $result = ‘‘;
1034     switch($this->message_type) {
1035       case ‘plain‘:
1036         $result .= $this->HeaderLine(‘Content-Transfer-Encoding‘, $this->Encoding);
1037         $result .= sprintf("Content-Type: %s; charset=\"%s\"", $this->ContentType, $this->CharSet);
1038         break;
1039       case ‘attachments‘:
1040       case ‘alt_attachments‘:
1041         if($this->InlineImageExists()){
1042           $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", ‘multipart/related‘, $this->LE, $this->LE, $this->boundary[1], $this->LE);
1043         } else {
1044           $result .= $this->HeaderLine(‘Content-Type‘, ‘multipart/mixed;‘);
1045           $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . ‘"‘);
1046         }
1047         break;
1048       case ‘alt‘:
1049         $result .= $this->HeaderLine(‘Content-Type‘, ‘multipart/alternative;‘);
1050         $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . ‘"‘);
1051         break;
1052     }
1053 
1054     if($this->Mailer != ‘mail‘) {
1055       $result .= $this->LE.$this->LE;
1056     }
1057 
1058     return $result;
1059   }
1060 
1061   /**
1062    * Assembles the message body.  Returns an empty string on failure.
1063    * @access public
1064    * @return string The assembled message body
1065    */
1066   public function CreateBody() {
1067     $body = ‘‘;
1068 
1069     if ($this->sign_key_file) {
1070       $body .= $this->GetMailMIME();
1071     }
1072 
1073     $this->SetWordWrap();
1074 
1075     switch($this->message_type) {
1076       case ‘alt‘:
1077         $body .= $this->GetBoundary($this->boundary[1], ‘‘, ‘text/plain‘, ‘‘);
1078         $body .= $this->EncodeString($this->AltBody, $this->Encoding);
1079         $body .= $this->LE.$this->LE;
1080         $body .= $this->GetBoundary($this->boundary[1], ‘‘, ‘text/html‘, ‘‘);
1081         $body .= $this->EncodeString($this->Body, $this->Encoding);
1082         $body .= $this->LE.$this->LE;
1083         $body .= $this->EndBoundary($this->boundary[1]);
1084         break;
1085       case ‘plain‘:
1086         $body .= $this->EncodeString($this->Body, $this->Encoding);
1087         break;
1088       case ‘attachments‘:
1089         $body .= $this->GetBoundary($this->boundary[1], ‘‘, ‘‘, ‘‘);
1090         $body .= $this->EncodeString($this->Body, $this->Encoding);
1091         $body .= $this->LE;
1092         $body .= $this->AttachAll();
1093         break;
1094       case ‘alt_attachments‘:
1095         $body .= sprintf("--%s%s", $this->boundary[1], $this->LE);
1096         $body .= sprintf("Content-Type: %s;%s" . "\tboundary=\"%s\"%s", ‘multipart/alternative‘, $this->LE, $this->boundary[2], $this->LE.$this->LE);
1097         $body .= $this->GetBoundary($this->boundary[2], ‘‘, ‘text/plain‘, ‘‘) . $this->LE; // Create text body
1098         $body .= $this->EncodeString($this->AltBody, $this->Encoding);
1099         $body .= $this->LE.$this->LE;
1100         $body .= $this->GetBoundary($this->boundary[2], ‘‘, ‘text/html‘, ‘‘) . $this->LE; // Create the HTML body
1101         $body .= $this->EncodeString($this->Body, $this->Encoding);
1102         $body .= $this->LE.$this->LE;
1103         $body .= $this->EndBoundary($this->boundary[2]);
1104         $body .= $this->AttachAll();
1105         break;
1106     }
1107 
1108     if ($this->IsError()) {
1109       $body = ‘‘;
1110     } elseif ($this->sign_key_file) {
1111       try {
1112         $file = tempnam(‘‘, ‘mail‘);
1113         file_put_contents($file, $body); //TODO check this worked
1114         $signed = tempnam("", "signed");
1115         if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_cert_file, array("file://".$this->sign_key_file, $this->sign_key_pass), NULL)) {
1116           @unlink($file);
1117           @unlink($signed);
1118           $body = file_get_contents($signed);
1119         } else {
1120           @unlink($file);
1121           @unlink($signed);
1122           throw new phpmailerException($this->Lang("signing").openssl_error_string());
1123         }
1124       } catch (phpmailerException $e) {
1125         $body = ‘‘;
1126         if ($this->exceptions) {
1127           throw $e;
1128         }
1129       }
1130     }
1131 
1132     return $body;
1133   }
1134 
1135   /**
1136    * Returns the start of a message boundary.
1137    * @access private
1138    */
1139   private function GetBoundary($boundary, $charSet, $contentType, $encoding) {
1140     $result = ‘‘;
1141     if($charSet == ‘‘) {
1142       $charSet = $this->CharSet;
1143     }
1144     if($contentType == ‘‘) {
1145       $contentType = $this->ContentType;
1146     }
1147     if($encoding == ‘‘) {
1148       $encoding = $this->Encoding;
1149     }
1150     $result .= $this->TextLine(‘--‘ . $boundary);
1151     $result .= sprintf("Content-Type: %s; charset = \"%s\"", $contentType, $charSet);
1152     $result .= $this->LE;
1153     $result .= $this->HeaderLine(‘Content-Transfer-Encoding‘, $encoding);
1154     $result .= $this->LE;
1155 
1156     return $result;
1157   }
1158 
1159   /**
1160    * Returns the end of a message boundary.
1161    * @access private
1162    */
1163   private function EndBoundary($boundary) {
1164     return $this->LE . ‘--‘ . $boundary . ‘--‘ . $this->LE;
1165   }
1166 
1167   /**
1168    * Sets the message type.
1169    * @access private
1170    * @return void
1171    */
1172   private function SetMessageType() {
1173     if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) {
1174       $this->message_type = ‘plain‘;
1175     } else {
1176       if(count($this->attachment) > 0) {
1177         $this->message_type = ‘attachments‘;
1178       }
1179       if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) {
1180         $this->message_type = ‘alt‘;
1181       }
1182       if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) {
1183         $this->message_type = ‘alt_attachments‘;
1184       }
1185     }
1186   }
1187 
1188   /**
1189    *  Returns a formatted header line.
1190    * @access public
1191    * @return string
1192    */
1193   public function HeaderLine($name, $value) {
1194     return $name . ‘: ‘ . $value . $this->LE;
1195   }
1196 
1197   /**
1198    * Returns a formatted mail line.
1199    * @access public
1200    * @return string
1201    */
1202   public function TextLine($value) {
1203     return $value . $this->LE;
1204   }
1205 
1206   /////////////////////////////////////////////////
1207   // CLASS METHODS, ATTACHMENTS
1208   /////////////////////////////////////////////////
1209 
1210   /**
1211    * Adds an attachment from a path on the filesystem.
1212    * Returns false if the file could not be found
1213    * or accessed.
1214    * @param string $path Path to the attachment.
1215    * @param string $name Overrides the attachment name.
1216    * @param string $encoding File encoding (see $Encoding).
1217    * @param string $type File extension (MIME) type.
1218    * @return bool
1219    */
1220   public function AddAttachment($path, $name = ‘‘, $encoding = ‘base64‘, $type = ‘application/octet-stream‘) {
1221     try {
1222       if ( !@is_file($path) ) {
1223         throw new phpmailerException($this->Lang(‘file_access‘) . $path, self::STOP_CONTINUE);
1224       }
1225       $filename = basename($path);
1226       if ( $name == ‘‘ ) {
1227         $name = $filename;
1228       }
1229 
1230       $this->attachment[] = array(
1231         0 => $path,
1232         1 => $filename,
1233         2 => $name,
1234         3 => $encoding,
1235         4 => $type,
1236         5 => false,  // isStringAttachment
1237         6 => ‘attachment‘,
1238         7 => 0
1239       );
1240 
1241     } catch (phpmailerException $e) {
1242       $this->SetError($e->getMessage());
1243       if ($this->exceptions) {
1244         throw $e;
1245       }
1246       echo $e->getMessage()."\n";
1247       if ( $e->getCode() == self::STOP_CRITICAL ) {
1248         return false;
1249       }
1250     }
1251     return true;
1252   }
1253 
1254   /**
1255   * Return the current array of attachments
1256   * @return array
1257   */
1258   public function GetAttachments() {
1259     return $this->attachment;
1260   }
1261 
1262   /**
1263    * Attaches all fs, string, and binary attachments to the message.
1264    * Returns an empty string on failure.
1265    * @access private
1266    * @return string
1267    */
1268   private function AttachAll() {
1269     // Return text of body
1270     $mime = array();
1271     $cidUniq = array();
1272     $incl = array();
1273 
1274     // Add all attachments
1275     foreach ($this->attachment as $attachment) {
1276       // Check for string attachment
1277       $bString = $attachment[5];
1278       if ($bString) {
1279         $string = $attachment[0];
1280       } else {
1281         $path = $attachment[0];
1282       }
1283 
1284       if (in_array($attachment[0], $incl)) { continue; }
1285       $filename    = $attachment[1];
1286       $name        = $attachment[2];
1287       $encoding    = $attachment[3];
1288       $type        = $attachment[4];
1289       $disposition = $attachment[6];
1290       $cid         = $attachment[7];
1291       $incl[]      = $attachment[0];
1292       if ( $disposition == ‘inline‘ && isset($cidUniq[$cid]) ) { continue; }
1293       $cidUniq[$cid] = true;
1294 
1295       $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE);
1296       $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $this->EncodeHeader($this->SecureHeader($name)), $this->LE);
1297       $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);
1298 
1299       if($disposition == ‘inline‘) {
1300         $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);
1301       }
1302 
1303       $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $this->EncodeHeader($this->SecureHeader($name)), $this->LE.$this->LE);
1304 
1305       // Encode as string attachment
1306       if($bString) {
1307         $mime[] = $this->EncodeString($string, $encoding);
1308         if($this->IsError()) {
1309           return ‘‘;
1310         }
1311         $mime[] = $this->LE.$this->LE;
1312       } else {
1313         $mime[] = $this->EncodeFile($path, $encoding);
1314         if($this->IsError()) {
1315           return ‘‘;
1316         }
1317         $mime[] = $this->LE.$this->LE;
1318       }
1319     }
1320 
1321     $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE);
1322 
1323     return join(‘‘, $mime);
1324   }
1325 
1326   /**
1327    * Encodes attachment in requested format.
1328    * Returns an empty string on failure.
1329    * @param string $path The full path to the file
1330    * @param string $encoding The encoding to use; one of ‘base64‘, ‘7bit‘, ‘8bit‘, ‘binary‘, ‘quoted-printable‘
1331    * @see EncodeFile()
1332    * @access private
1333    * @return string
1334    */
1335   private function EncodeFile($path, $encoding = ‘base64‘) {
1336     try {
1337       if (!is_readable($path)) {
1338         throw new phpmailerException($this->Lang(‘file_open‘) . $path, self::STOP_CONTINUE);
1339       }
1340       if (function_exists(‘get_magic_quotes‘)) {
1341         function get_magic_quotes() {
1342           return false;
1343         }
1344       }
1345       if (PHP_VERSION < 6) {
1346         $magic_quotes = get_magic_quotes_runtime();
1347         set_magic_quotes_runtime(0);
1348       }
1349       $file_buffer  = file_get_contents($path);
1350       $file_buffer  = $this->EncodeString($file_buffer, $encoding);
1351       if (PHP_VERSION < 6) { set_magic_quotes_runtime($magic_quotes); }
1352       return $file_buffer;
1353     } catch (Exception $e) {
1354       $this->SetError($e->getMessage());
1355       return ‘‘;
1356     }
1357   }
1358 
1359   /**
1360    * Encodes string to requested format.
1361    * Returns an empty string on failure.
1362    * @param string $str The text to encode
1363    * @param string $encoding The encoding to use; one of ‘base64‘, ‘7bit‘, ‘8bit‘, ‘binary‘, ‘quoted-printable‘
1364    * @access public
1365    * @return string
1366    */
1367   public function EncodeString ($str, $encoding = ‘base64‘) {
1368     $encoded = ‘‘;
1369     switch(strtolower($encoding)) {
1370       case ‘base64‘:
1371         $encoded = chunk_split(base64_encode($str), 76, $this->LE);
1372         break;
1373       case ‘7bit‘:
1374       case ‘8bit‘:
1375         $encoded = $this->FixEOL($str);
1376         //Make sure it ends with a line break
1377         if (substr($encoded, -(strlen($this->LE))) != $this->LE)
1378           $encoded .= $this->LE;
1379         break;
1380       case ‘binary‘:
1381         $encoded = $str;
1382         break;
1383       case ‘quoted-printable‘:
1384         $encoded = $this->EncodeQP($str);
1385         break;
1386       default:
1387         $this->SetError($this->Lang(‘encoding‘) . $encoding);
1388         break;
1389     }
1390     return $encoded;
1391   }
1392 
1393   /**
1394    * Encode a header string to best (shortest) of Q, B, quoted or none.
1395    * @access public
1396    * @return string
1397    */
1398   public function EncodeHeader($str, $position = ‘text‘) {
1399     $x = 0;
1400 
1401     switch (strtolower($position)) {
1402       case ‘phrase‘:
1403         if (!preg_match(‘/[\200-\377]/‘, $str)) {
1404           // Can‘t use addslashes as we don‘t know what value has magic_quotes_sybase
1405           $encoded = addcslashes($str, "\0..\37\177\\\"");
1406           if (($str == $encoded) && !preg_match(‘/[^A-Za-z0-9!#$%&\‘*+\/=?^_`{|}~ -]/‘, $str)) {
1407             return ($encoded);
1408           } else {
1409             return ("\"$encoded\"");
1410           }
1411         }
1412         $x = preg_match_all(‘/[^\040\041\043-\133\135-\176]/‘, $str, $matches);
1413         break;
1414       case ‘comment‘:
1415         $x = preg_match_all(‘/[()"]/‘, $str, $matches);
1416         // Fall-through
1417       case ‘text‘:
1418       default:
1419         $x += preg_match_all(‘/[\000-\010\013\014\016-\037\177-\377]/‘, $str, $matches);
1420         break;
1421     }
1422 
1423     if ($x == 0) {
1424       return ($str);
1425     }
1426 
1427     $maxlen = 75 - 7 - strlen($this->CharSet);
1428     // Try to select the encoding which should produce the shortest output
1429     if (strlen($str)/3 < $x) {
1430       $encoding = ‘B‘;
1431       if (function_exists(‘mb_strlen‘) && $this->HasMultiBytes($str)) {
1432         // Use a custom function which correctly encodes and wraps long
1433         // multibyte strings without breaking lines within a character
1434         $encoded = $this->Base64EncodeWrapMB($str);
1435       } else {
1436         $encoded = base64_encode($str);
1437         $maxlen -= $maxlen % 4;
1438         $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
1439       }
1440     } else {
1441       $encoding = ‘Q‘;
1442       $encoded = $this->EncodeQ($str, $position);
1443       $encoded = $this->WrapText($encoded, $maxlen, true);
1444       $encoded = str_replace(‘=‘.$this->LE, "\n", trim($encoded));
1445     }
1446 
1447     $encoded = preg_replace(‘/^(.*)$/m‘, " =?".$this->CharSet."?$encoding?\\1?=", $encoded);
1448     $encoded = trim(str_replace("\n", $this->LE, $encoded));
1449 
1450     return $encoded;
1451   }
1452 
1453   /**
1454    * Checks if a string contains multibyte characters.
1455    * @access public
1456    * @param string $str multi-byte text to wrap encode
1457    * @return bool
1458    */
1459   public function HasMultiBytes($str) {
1460     if (function_exists(‘mb_strlen‘)) {
1461       return (strlen($str) > mb_strlen($str, $this->CharSet));
1462     } else { // Assume no multibytes (we can‘t handle without mbstring functions anyway)
1463       return false;
1464     }
1465   }
1466 
1467   /**
1468    * Correctly encodes and wraps long multibyte strings for mail headers
1469    * without breaking lines within a character.
1470    * Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php
1471    * @access public
1472    * @param string $str multi-byte text to wrap encode
1473    * @return string
1474    */
1475   public function Base64EncodeWrapMB($str) {
1476     $start = "=?".$this->CharSet."?B?";
1477     $end = "?=";
1478     $encoded = "";
1479 
1480     $mb_length = mb_strlen($str, $this->CharSet);
1481     // Each line must have length <= 75, including $start and $end
1482     $length = 75 - strlen($start) - strlen($end);
1483     // Average multi-byte ratio
1484     $ratio = $mb_length / strlen($str);
1485     // Base64 has a 4:3 ratio
1486     $offset = $avgLength = floor($length * $ratio * .75);
1487 
1488     for ($i = 0; $i < $mb_length; $i += $offset) {
1489       $lookBack = 0;
1490 
1491       do {
1492         $offset = $avgLength - $lookBack;
1493         $chunk = mb_substr($str, $i, $offset, $this->CharSet);
1494         $chunk = base64_encode($chunk);
1495         $lookBack++;
1496       }
1497       while (strlen($chunk) > $length);
1498 
1499       $encoded .= $chunk . $this->LE;
1500     }
1501 
1502     // Chomp the last linefeed
1503     $encoded = substr($encoded, 0, -strlen($this->LE));
1504     return $encoded;
1505   }
1506 
1507   /**
1508   * Encode string to quoted-printable.
1509   * Only uses standard PHP, slow, but will always work
1510   * @access public
1511   * @param string $string the text to encode
1512   * @param integer $line_max Number of chars allowed on a line before wrapping
1513   * @return string
1514   */
1515   public function EncodeQPphp( $input = ‘‘, $line_max = 76, $space_conv = false) {
1516     $hex = array(‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘);
1517     $lines = preg_split(‘/(?:\r\n|\r|\n)/‘, $input);
1518     $eol = "\r\n";
1519     $escape = ‘=‘;
1520     $output = ‘‘;
1521     while( list(, $line) = each($lines) ) {
1522       $linlen = strlen($line);
1523       $newline = ‘‘;
1524       for($i = 0; $i < $linlen; $i++) {
1525         $c = substr( $line, $i, 1 );
1526         $dec = ord( $c );
1527         if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E
1528           $c = ‘=2E‘;
1529         }
1530         if ( $dec == 32 ) {
1531           if ( $i == ( $linlen - 1 ) ) { // convert space at eol only
1532             $c = ‘=20‘;
1533           } else if ( $space_conv ) {
1534             $c = ‘=20‘;
1535           }
1536         } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required
1537           $h2 = floor($dec/16);
1538           $h1 = floor($dec%16);
1539           $c = $escape.$hex[$h2].$hex[$h1];
1540         }
1541         if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted
1542           $output .= $newline.$escape.$eol; //  soft line break; " =\r\n" is okay
1543           $newline = ‘‘;
1544           // check if newline first character will be point or not
1545           if ( $dec == 46 ) {
1546             $c = ‘=2E‘;
1547           }
1548         }
1549         $newline .= $c;
1550       } // end of for
1551       $output .= $newline.$eol;
1552     } // end of while
1553     return $output;
1554   }
1555 
1556   /**
1557   * Encode string to RFC2045 (6.7) quoted-printable format
1558   * Uses a PHP5 stream filter to do the encoding about 64x faster than the old version
1559   * Also results in same content as you started with after decoding
1560   * @see EncodeQPphp()
1561   * @access public
1562   * @param string $string the text to encode
1563   * @param integer $line_max Number of chars allowed on a line before wrapping
1564   * @param boolean $space_conv Dummy param for compatibility with existing EncodeQP function
1565   * @return string
1566   * @author Marcus Bointon
1567   */
1568   public function EncodeQP($string, $line_max = 76, $space_conv = false) {
1569     if (function_exists(‘quoted_printable_encode‘)) { //Use native function if it‘s available (>= PHP5.3)
1570       return quoted_printable_encode($string);
1571     }
1572     $filters = stream_get_filters();
1573     if (!in_array(‘convert.*‘, $filters)) { //Got convert stream filter?
1574       return $this->EncodeQPphp($string, $line_max, $space_conv); //Fall back to old implementation
1575     }
1576     $fp = fopen(‘php://temp/‘, ‘r+‘);
1577     $string = preg_replace(‘/\r\n?/‘, $this->LE, $string); //Normalise line breaks
1578     $params = array(‘line-length‘ => $line_max, ‘line-break-chars‘ => $this->LE);
1579     $s = stream_filter_append($fp, ‘convert.quoted-printable-encode‘, STREAM_FILTER_READ, $params);
1580     fputs($fp, $string);
1581     rewind($fp);
1582     $out = stream_get_contents($fp);
1583     stream_filter_remove($s);
1584     $out = preg_replace(‘/^\./m‘, ‘=2E‘, $out); //Encode . if it is first char on a line, workaround for bug in Exchange
1585     fclose($fp);
1586     return $out;
1587   }
1588 
1589   /**
1590    * Encode string to q encoding.
1591    * @link http://tools.ietf.org/html/rfc2047
1592    * @param string $str the text to encode
1593    * @param string $position Where the text is going to be used, see the RFC for what that means
1594    * @access public
1595    * @return string
1596    */
1597   public function EncodeQ ($str, $position = ‘text‘) {
1598     // There should not be any EOL in the string
1599     $encoded = preg_replace(‘/[\r\n]*/‘, ‘‘, $str);
1600 
1601     switch (strtolower($position)) {
1602       case ‘phrase‘:
1603         $encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "‘=‘.sprintf(‘%02X‘, ord(‘\\1‘))", $encoded);
1604         break;
1605       case ‘comment‘:
1606         $encoded = preg_replace("/([\(\)\"])/e", "‘=‘.sprintf(‘%02X‘, ord(‘\\1‘))", $encoded);
1607       case ‘text‘:
1608       default:
1609         // Replace every high ascii, control =, ? and _ characters
1610         //TODO using /e (equivalent to eval()) is probably not a good idea
1611         $encoded = preg_replace(‘/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e‘,
1612               "‘=‘.sprintf(‘%02X‘, ord(‘\\1‘))", $encoded);
1613         break;
1614     }
1615 
1616     // Replace every spaces to _ (more readable than =20)
1617     $encoded = str_replace(‘ ‘, ‘_‘, $encoded);
1618 
1619     return $encoded;
1620   }
1621 
1622   /**
1623    * Adds a string or binary attachment (non-filesystem) to the list.
1624    * This method can be used to attach ascii or binary data,
1625    * such as a BLOB record from a database.
1626    * @param string $string String attachment data.
1627    * @param string $filename Name of the attachment.
1628    * @param string $encoding File encoding (see $Encoding).
1629    * @param string $type File extension (MIME) type.
1630    * @return void
1631    */
1632   public function AddStringAttachment($string, $filename, $encoding = ‘base64‘, $type = ‘application/octet-stream‘) {
1633     // Append to $attachment array
1634     $this->attachment[] = array(
1635       0 => $string,
1636       1 => $filename,
1637       2 => $filename,
1638       3 => $encoding,
1639       4 => $type,
1640       5 => true,  // isStringAttachment
1641       6 => ‘attachment‘,
1642       7 => 0
1643     );
1644   }
1645 
1646   /**
1647    * Adds an embedded attachment.  This can include images, sounds, and
1648    * just about any other document.  Make sure to set the $type to an
1649    * image type.  For JPEG images use "image/jpeg" and for GIF images
1650    * use "image/gif".
1651    * @param string $path Path to the attachment.
1652    * @param string $cid Content ID of the attachment.  Use this to identify
1653    *        the Id for accessing the image in an HTML form.
1654    * @param string $name Overrides the attachment name.
1655    * @param string $encoding File encoding (see $Encoding).
1656    * @param string $type File extension (MIME) type.
1657    * @return bool
1658    */
1659   public function AddEmbeddedImage($path, $cid, $name = ‘‘, $encoding = ‘base64‘, $type = ‘application/octet-stream‘) {
1660 
1661     if ( !@is_file($path) ) {
1662       $this->SetError($this->Lang(‘file_access‘) . $path);
1663       return false;
1664     }
1665 
1666     $filename = basename($path);
1667     if ( $name == ‘‘ ) {
1668       $name = $filename;
1669     }
1670 
1671     // Append to $attachment array
1672     $this->attachment[] = array(
1673       0 => $path,
1674       1 => $filename,
1675       2 => $name,
1676       3 => $encoding,
1677       4 => $type,
1678       5 => false,  // isStringAttachment
1679       6 => ‘inline‘,
1680       7 => $cid
1681     );
1682 
1683     return true;
1684   }
1685 
1686   /**
1687    * Returns true if an inline attachment is present.
1688    * @access public
1689    * @return bool
1690    */
1691   public function InlineImageExists() {
1692     foreach($this->attachment as $attachment) {
1693       if ($attachment[6] == ‘inline‘) {
1694         return true;
1695       }
1696     }
1697     return false;
1698   }
1699 
1700   /////////////////////////////////////////////////
1701   // CLASS METHODS, MESSAGE RESET
1702   /////////////////////////////////////////////////
1703 
1704   /**
1705    * Clears all recipients assigned in the TO array.  Returns void.
1706    * @return void
1707    */
1708   public function ClearAddresses() {
1709     foreach($this->to as $to) {
1710       unset($this->all_recipients[strtolower($to[0])]);
1711     }
1712     $this->to = array();
1713   }
1714 
1715   /**
1716    * Clears all recipients assigned in the CC array.  Returns void.
1717    * @return void
1718    */
1719   public function ClearCCs() {
1720     foreach($this->cc as $cc) {
1721       unset($this->all_recipients[strtolower($cc[0])]);
1722     }
1723     $this->cc = array();
1724   }
1725 
1726   /**
1727    * Clears all recipients assigned in the BCC array.  Returns void.
1728    * @return void
1729    */
1730   public function ClearBCCs() {
1731     foreach($this->bcc as $bcc) {
1732       unset($this->all_recipients[strtolower($bcc[0])]);
1733     }
1734     $this->bcc = array();
1735   }
1736 
1737   /**
1738    * Clears all recipients assigned in the ReplyTo array.  Returns void.
1739    * @return void
1740    */
1741   public function ClearReplyTos() {
1742     $this->ReplyTo = array();
1743   }
1744 
1745   /**
1746    * Clears all recipients assigned in the TO, CC and BCC
1747    * array.  Returns void.
1748    * @return void
1749    */
1750   public function ClearAllRecipients() {
1751     $this->to = array();
1752     $this->cc = array();
1753     $this->bcc = array();
1754     $this->all_recipients = array();
1755   }
1756 
1757   /**
1758    * Clears all previously set filesystem, string, and binary
1759    * attachments.  Returns void.
1760    * @return void
1761    */
1762   public function ClearAttachments() {
1763     $this->attachment = array();
1764   }
1765 
1766   /**
1767    * Clears all custom headers.  Returns void.
1768    * @return void
1769    */
1770   public function ClearCustomHeaders() {
1771     $this->CustomHeader = array();
1772   }
1773 
1774   /////////////////////////////////////////////////
1775   // CLASS METHODS, MISCELLANEOUS
1776   /////////////////////////////////////////////////
1777 
1778   /**
1779    * Adds the error message to the error container.
1780    * @access protected
1781    * @return void
1782    */
1783   protected function SetError($msg) {
1784     $this->error_count++;
1785     if ($this->Mailer == ‘smtp‘ and !is_null($this->smtp)) {
1786       $lasterror = $this->smtp->getError();
1787       if (!empty($lasterror) and array_key_exists(‘smtp_msg‘, $lasterror)) {
1788         $msg .= ‘<p>‘ . $this->Lang(‘smtp_error‘) . $lasterror[‘smtp_msg‘] . "</p>\n";
1789       }
1790     }
1791     $this->ErrorInfo = $msg;
1792   }
1793 
1794   /**
1795    * Returns the proper RFC 822 formatted date.
1796    * @access public
1797    * @return string
1798    * @static
1799    */
1800   public static function RFCDate() {
1801     $tz = date(‘Z‘);
1802     $tzs = ($tz < 0) ? ‘-‘ : ‘+‘;
1803     $tz = abs($tz);
1804     $tz = (int)($tz/3600)*100 + ($tz%3600)/60;
1805     $result = sprintf("%s %s%04d", date(‘D, j M Y H:i:s‘), $tzs, $tz);
1806 
1807     return $result;
1808   }
1809 
1810   /**
1811    * Returns the server hostname or ‘localhost.localdomain‘ if unknown.
1812    * @access private
1813    * @return string
1814    */
1815   private function ServerHostname() {
1816     if (!empty($this->Hostname)) {
1817       $result = $this->Hostname;
1818     } elseif (isset($_SERVER[‘SERVER_NAME‘])) {
1819       $result = $_SERVER[‘SERVER_NAME‘];
1820     } else {
1821       $result = ‘localhost.localdomain‘;
1822     }
1823 
1824     return $result;
1825   }
1826 
1827   /**
1828    * Returns a message in the appropriate language.
1829    * @access private
1830    * @return string
1831    */
1832   private function Lang($key) {
1833     if(count($this->language) < 1) {
1834       $this->SetLanguage(‘en‘); // set the default language
1835     }
1836 
1837     if(isset($this->language[$key])) {
1838       return $this->language[$key];
1839     } else {
1840       return ‘Language string failed to load: ‘ . $key;
1841     }
1842   }
1843 
1844   /**
1845    * Returns true if an error occurred.
1846    * @access public
1847    * @return bool
1848    */
1849   public function IsError() {
1850     return ($this->error_count > 0);
1851   }
1852 
1853   /**
1854    * Changes every end of line from CR or LF to CRLF.
1855    * @access private
1856    * @return string
1857    */
1858   private function FixEOL($str) {
1859     $str = str_replace("\r\n", "\n", $str);
1860     $str = str_replace("\r", "\n", $str);
1861     $str = str_replace("\n", $this->LE, $str);
1862     return $str;
1863   }
1864 
1865   /**
1866    * Adds a custom header.
1867    * @access public
1868    * @return void
1869    */
1870   public function AddCustomHeader($custom_header) {
1871     $this->CustomHeader[] = explode(‘:‘, $custom_header, 2);
1872   }
1873 
1874   /**
1875    * Evaluates the message and returns modifications for inline images and backgrounds
1876    * @access public
1877    * @return $message
1878    */
1879   public function MsgHTML($message, $basedir = ‘‘) {
1880     preg_match_all("/(src|background)=\"(.*)\"/Ui", $message, $images);
1881     if(isset($images[2])) {
1882       foreach($images[2] as $i => $url) {
1883         // do not change urls for absolute images (thanks to corvuscorax)
1884         if (!preg_match(‘#^[A-z]+://#‘,$url)) {
1885           $filename = basename($url);
1886           $directory = dirname($url);
1887           ($directory == ‘.‘)?$directory=‘‘:‘‘;
1888           $cid = ‘cid:‘ . md5($filename);
1889           $ext = pathinfo($filename, PATHINFO_EXTENSION);
1890           $mimeType  = self::_mime_types($ext);
1891           if ( strlen($basedir) > 1 && substr($basedir,-1) != ‘/‘) { $basedir .= ‘/‘; }
1892           if ( strlen($directory) > 1 && substr($directory,-1) != ‘/‘) { $directory .= ‘/‘; }
1893           if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, ‘base64‘,$mimeType) ) {
1894             $message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, ‘/‘)."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message);
1895           }
1896         }
1897       }
1898     }
1899     $this->IsHTML(true);
1900     $this->Body = $message;
1901     $textMsg = trim(strip_tags(preg_replace(‘/<(head|title|style|script)[^>]*>.*?<\/\\1>/s‘,‘‘,$message)));
1902     if (!empty($textMsg) && empty($this->AltBody)) {
1903       $this->AltBody = html_entity_decode($textMsg);
1904     }
1905     if (empty($this->AltBody)) {
1906       $this->AltBody = ‘To view this email message, open it in a program that understands HTML!‘ . "\n\n";
1907     }
1908   }
1909 
1910   /**
1911    * Gets the MIME type of the embedded or inline image
1912    * @param string File extension
1913    * @access public
1914    * @return string MIME type of ext
1915    * @static
1916    */
1917   public static function _mime_types($ext = ‘‘) {
1918     $mimes = array(
1919       ‘hqx‘   =>  ‘application/mac-binhex40‘,
1920       ‘cpt‘   =>  ‘application/mac-compactpro‘,
1921       ‘doc‘   =>  ‘application/msword‘,
1922       ‘bin‘   =>  ‘application/macbinary‘,
1923       ‘dms‘   =>  ‘application/octet-stream‘,
1924       ‘lha‘   =>  ‘application/octet-stream‘,
1925       ‘lzh‘   =>  ‘application/octet-stream‘,
1926       ‘exe‘   =>  ‘application/octet-stream‘,
1927       ‘class‘ =>  ‘application/octet-stream‘,
1928       ‘psd‘   =>  ‘application/octet-stream‘,
1929       ‘so‘    =>  ‘application/octet-stream‘,
1930       ‘sea‘   =>  ‘application/octet-stream‘,
1931       ‘dll‘   =>  ‘application/octet-stream‘,
1932       ‘oda‘   =>  ‘application/oda‘,
1933       ‘pdf‘   =>  ‘application/pdf‘,
1934       ‘ai‘    =>  ‘application/postscript‘,
1935       ‘eps‘   =>  ‘application/postscript‘,
1936       ‘ps‘    =>  ‘application/postscript‘,
1937       ‘smi‘   =>  ‘application/smil‘,
1938       ‘smil‘  =>  ‘application/smil‘,
1939       ‘mif‘   =>  ‘application/vnd.mif‘,
1940       ‘xls‘   =>  ‘application/vnd.ms-excel‘,
1941       ‘ppt‘   =>  ‘application/vnd.ms-powerpoint‘,
1942       ‘wbxml‘ =>  ‘application/vnd.wap.wbxml‘,
1943       ‘wmlc‘  =>  ‘application/vnd.wap.wmlc‘,
1944       ‘dcr‘   =>  ‘application/x-director‘,
1945       ‘dir‘   =>  ‘application/x-director‘,
1946       ‘dxr‘   =>  ‘application/x-director‘,
1947       ‘dvi‘   =>  ‘application/x-dvi‘,
1948       ‘gtar‘  =>  ‘application/x-gtar‘,
1949       ‘php‘   =>  ‘application/x-httpd-php‘,
1950       ‘php4‘  =>  ‘application/x-httpd-php‘,
1951       ‘php3‘  =>  ‘application/x-httpd-php‘,
1952       ‘phtml‘ =>  ‘application/x-httpd-php‘,
1953       ‘phps‘  =>  ‘application/x-httpd-php-source‘,
1954       ‘js‘    =>  ‘application/x-javascript‘,
1955       ‘swf‘   =>  ‘application/x-shockwave-flash‘,
1956       ‘sit‘   =>  ‘application/x-stuffit‘,
1957       ‘tar‘   =>  ‘application/x-tar‘,
1958       ‘tgz‘   =>  ‘application/x-tar‘,
1959       ‘xhtml‘ =>  ‘application/xhtml+xml‘,
1960       ‘xht‘   =>  ‘application/xhtml+xml‘,
1961       ‘zip‘   =>  ‘application/zip‘,
1962       ‘mid‘   =>  ‘audio/midi‘,
1963       ‘midi‘  =>  ‘audio/midi‘,
1964       ‘mpga‘  =>  ‘audio/mpeg‘,
1965       ‘mp2‘   =>  ‘audio/mpeg‘,
1966       ‘mp3‘   =>  ‘audio/mpeg‘,
1967       ‘aif‘   =>  ‘audio/x-aiff‘,
1968       ‘aiff‘  =>  ‘audio/x-aiff‘,
1969       ‘aifc‘  =>  ‘audio/x-aiff‘,
1970       ‘ram‘   =>  ‘audio/x-pn-realaudio‘,
1971       ‘rm‘    =>  ‘audio/x-pn-realaudio‘,
1972       ‘rpm‘   =>  ‘audio/x-pn-realaudio-plugin‘,
1973       ‘ra‘    =>  ‘audio/x-realaudio‘,
1974       ‘rv‘    =>  ‘video/vnd.rn-realvideo‘,
1975       ‘wav‘   =>  ‘audio/x-wav‘,
1976       ‘bmp‘   =>  ‘image/bmp‘,
1977       ‘gif‘   =>  ‘image/gif‘,
1978       ‘jpeg‘  =>  ‘image/jpeg‘,
1979       ‘jpg‘   =>  ‘image/jpeg‘,
1980       ‘jpe‘   =>  ‘image/jpeg‘,
1981       ‘png‘   =>  ‘image/png‘,
1982       ‘tiff‘  =>  ‘image/tiff‘,
1983       ‘tif‘   =>  ‘image/tiff‘,
1984       ‘css‘   =>  ‘text/css‘,
1985       ‘html‘  =>  ‘text/html‘,
1986       ‘htm‘   =>  ‘text/html‘,
1987       ‘shtml‘ =>  ‘text/html‘,
1988       ‘txt‘   =>  ‘text/plain‘,
1989       ‘text‘  =>  ‘text/plain‘,
1990       ‘log‘   =>  ‘text/plain‘,
1991       ‘rtx‘   =>  ‘text/richtext‘,
1992       ‘rtf‘   =>  ‘text/rtf‘,
1993       ‘xml‘   =>  ‘text/xml‘,
1994       ‘xsl‘   =>  ‘text/xml‘,
1995       ‘mpeg‘  =>  ‘video/mpeg‘,
1996       ‘mpg‘   =>  ‘video/mpeg‘,
1997       ‘mpe‘   =>  ‘video/mpeg‘,
1998       ‘qt‘    =>  ‘video/quicktime‘,
1999       ‘mov‘   =>  ‘video/quicktime‘,
2000       ‘avi‘   =>  ‘video/x-msvideo‘,
2001       ‘movie‘ =>  ‘video/x-sgi-movie‘,
2002       ‘doc‘   =>  ‘application/msword‘,
2003       ‘word‘  =>  ‘application/msword‘,
2004       ‘xl‘    =>  ‘application/excel‘,
2005       ‘eml‘   =>  ‘message/rfc822‘
2006     );
2007     return (!isset($mimes[strtolower($ext)])) ? ‘application/octet-stream‘ : $mimes[strtolower($ext)];
2008   }
2009 
2010   /**
2011   * Set (or reset) Class Objects (variables)
2012   *
2013   * Usage Example:
2014   * $page->set(‘X-Priority‘, ‘3‘);
2015   *
2016   * @access public
2017   * @param string $name Parameter Name
2018   * @param mixed $value Parameter Value
2019   * NOTE: will not work with arrays, there are no arrays to set/reset
2020   * @todo Should this not be using __set() magic function?
2021   */
2022   public function set($name, $value = ‘‘) {
2023     try {
2024       if (isset($this->$name) ) {
2025         $this->$name = $value;
2026       } else {
2027         throw new phpmailerException($this->Lang(‘variable_set‘) . $name, self::STOP_CRITICAL);
2028       }
2029     } catch (Exception $e) {
2030       $this->SetError($e->getMessage());
2031       if ($e->getCode() == self::STOP_CRITICAL) {
2032         return false;
2033       }
2034     }
2035     return true;
2036   }
2037 
2038   /**
2039    * Strips newlines to prevent header injection.
2040    * @access public
2041    * @param string $str String
2042    * @return string
2043    */
2044   public function SecureHeader($str) {
2045     $str = str_replace("\r", ‘‘, $str);
2046     $str = str_replace("\n", ‘‘, $str);
2047     return trim($str);
2048   }
2049 
2050   /**
2051    * Set the private key file and password to sign the message.
2052    *
2053    * @access public
2054    * @param string $key_filename Parameter File Name
2055    * @param string $key_pass Password for private key
2056    */
2057   public function Sign($cert_filename, $key_filename, $key_pass) {
2058     $this->sign_cert_file = $cert_filename;
2059     $this->sign_key_file = $key_filename;
2060     $this->sign_key_pass = $key_pass;
2061   }
2062 }
2063 
2064 
2065 class phpmailerException extends Exception {
2066   public function errorMessage() {
2067     $errorMsg = ‘<strong>‘ . $this->getMessage() . "</strong><br />\n";
2068     return $errorMsg;
2069   }
2070 }
2071 ?>
View Code

在控制器之中写调用方法:

 1 function SendEmail($email,$title,$content)
 2 {
 3   import(‘Com.PHPMailer‘);
 4   $mail = new \PHPMailer();
 5   $title = "密码找回";
 6   $content = "亲爱的用户 ".$username.":您好!
 7       <br>
 8       <br>
 9         您收到这封这封电子邮件是因为您 (也可能是某人冒充您的名义) 申请了一个新的密码。假如这不是您本人所申请, 请不用理会这封电子邮件, 但是如果您持续收到这类的信件骚扰, 请您尽快联络管理员。
10       <br>";
11   $mail->IsSMTP();                           // tell the class to use SMTP
12   $mail->SMTPAuth   = true;                  // enable SMTP authentication
13   $mail->Port       = 25;                    // set the SMTP server port
14   $mail->Host       = "***.163.com"; // SMTP server
15   $mail->Username   = "***@163.com";     // SMTP server username
16   $mail->Password   = "tbamiabtpcgyurqo";            // SMTP server password
17   //$mail->IsSendmail();  // tell the class to use Sendmail
18   $mail->AddReplyTo("***@163.com","test网");
19   $mail->From       = "***@163.com";
20   $mail->FromName   = "test";
21   $mail->Subject  = $title;
22   $mail->AltBody    = $title; // optional, comment out and test
23   $mail->WordWrap   = 80; // set word wrap
24   $mail->MsgHTML($content);
25   $mail->IsHTML(true); // send as HTML
26   $mail->AddAddress($email);
27   if($mail->Send()){
28     return true;
29   }else{
30     return false;
31   }
32 }

 

ThinkPHP发送邮件

标签:

原文地址:http://www.cnblogs.com/haveadream435/p/5957385.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!