Php mail function with images

Hi all,

When i try to send mail with html tagged images , images are not displayed.

my code

<?php
$to = "sample@sample.com";
$subject = "HTML email";

$message = "
<html>
<head>
<title>HTML email</title>
</head>
<body>
<p>This email contains HTML Tags!</p>
<table background='sample1.jpg'>
<tr>
<th>Firstname</th>
<th>Lastname</th>
</tr>
<tr>
<td>John</td>
<td>Doe</td>
</tr>
</table>
</body>
</html>
";

// Always set content-type when sending HTML email
$headers = "MIME-Version: 1.0" . "\\r\
";
$headers .= "Content-type:text/html;charset=iso-8859-1" . "\\r\
";

// More headers
$headers .= 'From: <webmaster@example.com>' . "\\r\
";
$headers .= 'Cc: myboss@example.com' . "\\r\
";

mail($to,$subject,$message,$headers);
?>

Some one suggest…

in your code i can see that you want to display background images.

as far as i know background images are not displayed in html emails.

vineet

Thanks for reply…
I have changed the headers like ,

$headers  = 'MIME-Version: 1.0' . "\\r\
";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\\r\
";

and changed img tag to

<table background='http://www.sample/demo/sample1.jpg'>

html format is working except image. What is the error…
If the method is wrong , Please suggest how do i send mails with images …

Thanks in advance

As Vineet wrote, backgrounds are often not displayed in e-mails.

Wouldn’t you need to reference the image using an absolute URL? Although, this still wouldn’t help with a background image…

<edit>Sorry I didn’t notice that you had already spotted that</edit>

Cheers,

Jon

If you comfortable using PHPMailer then I have a short article with example here:
http://www.devraju.com/2010/01/how-to-embed-images-with-php-mailer-class/

Hope you can get some information from there. This will embed images in your email.

Thanks for all…

 I am not much about Mailer function. Actually i want to send mail which contain text with images (Multiple) in the body.

There is nothing to do yourself. You just prepare the HTML to send and use the given script to send the email. If you look for the solution with your own PHP script it will take much time than you do it with PHPMailer class. But if you are about to learn how to send the HTML email then search an article here within sitepoint article section.

http://www.devraju.com/2010/01/how-t…-mailer-class/

If i use this code i have to program manually. But my concept is dynamic one.
Actually i am trying to send a news letter from admin to all users. So I have added some plugins and i have changed text area to wysiwyg editor.

Let us consider , I have added some text with 1 images. In the form submit page , Im using this code

$body = htmlspecialchars($_POST['des']);

output is here

<span style=\“font-style: italic; text-decoration: underline; color: rgb(255, 0, 0);\”>This is sample msg</span><br style=\“font-style: italic; color: rgb(255, 0, 0);\”><font style=\“font-style: italic; color: rgb(255, 0, 0);\” size=\“5\”>Sample picture is here</font><br><br><div><img src=\“http:\\www.sample.com\sample.jpg” alt=\“\” alignment=\“\” border=\“\” vspace=\“\” hspace=\“\”></div><br style=\“font-style: italic;\”>

I want to embed this sample.jpg below the text dynamically,…
Now anyone suggest me what to do?

If you are not sure about the number of images or you want to send the HTML that is seen in an editor, just do not use embeded method. Just send an HTML enabled email with PHPMailer.


require_once('classes/phpmailer.class.php');

// prepare your HTML or get it from your editor. But be sure that your editor prepares valid HTML.
$body = '<tag>this your text</tag><img src="www.yoursite.com/samplejpg" border="0" width="100", height="100" />';

$objMail = new Mail;
$objMail->IsHTML(true); // note this should be true
$objMail->setSender($sender_email, $sender_name);
$objMail->setSubject($subject);
$objMail->setReciever($email, $fullname);
$objMail->setBody($body);
$objMail->Send();

While i try to use this code i am getting this error…

Fatal error: Class ‘Mail’ not found in D:\webserver\sample.in\www\demo\admin\send_mails.php on line 11

My code is

<?php

require_once(‘includes/class.phpmailer.php’);
$body = htmlspecialchars($_POST[‘des’]);
$subject=‘hai’;
$email="sample@sample.com";
$fullname=“Sample”;
$sender_email=“admin@sample.in”;

$objMail = new Mail; // Error here
$objMail->IsHTML(true); // note this should be true
$objMail->setSender($sender_email, $sender_name);
$objMail->setSubject($subject);
$objMail->setReciever($email, $fullname);
$objMail->setBody($body);
$objMail->Send();
?>

I have attached class.phpmailer.php file

Did you download the PHPMailer class first from:
http://phpmailer.worxware.com/index.php?pg=sf&p=dl
??

If not first download the class and required files from the given link and include the Mailer class. In my example the class file is inside the includes folder.

Im using the same file only .

I have attached here with …

class.phpmailer.php

&lt;?php

if (version_compare(PHP_VERSION, '5.0.0', '&lt;') ) exit("Sorry, this version of PHPMailer will only run on PHP version 5 or greater!\
");

class PHPMailer {

  public $Priority          = 3;

  public $CharSet           = 'iso-8859-1';

  public $ContentType       = 'text/plain';

  public $Encoding          = '8bit';

  public $ErrorInfo         = '';

  public $From              = 'root@localhost';

  public $FromName          = 'Root User';

  public $Sender            = '';

  public $Subject           = '';

  public $Body              = '';

  public $AltBody           = '';

  public $WordWrap          = 0;

  public $Mailer            = 'mail';

  public $Sendmail          = '/usr/sbin/sendmail';

  public $PluginDir         = '';

  public $ConfirmReadingTo  = '';
  public $Hostname          = '';

  public $MessageID         = '';

  public $Host          = 'localhost';

  public $Port          = 25;

  public $Helo          = '';

  public $SMTPSecure    = '';

  public $SMTPAuth      = false;
  public $Username      = '';

  public $Password      = '';

  public $Timeout       = 10;

  public $SMTPDebug     = false;

  public $SMTPKeepAlive = false;
  public $SingleTo      = false;
  public $SingleToArray = array();
  public $LE              = "\
";

  public $DKIM_selector   = 'phpmailer';

  public $DKIM_identity   = '';

  public $DKIM_domain     = '';

  public $DKIM_private    = '';
  public $action_function = ''; //'callbackAction';

  public $Version         = '5.1';

  private   $smtp           = NULL;
  private   $to             = array();
  private   $cc             = array();
  private   $bcc            = array();
  private   $ReplyTo        = array();
  private   $all_recipients = array();
  private   $attachment     = array();
  private   $CustomHeader   = array();
  private   $message_type   = '';
  private   $boundary       = array();
  protected $language       = array();
  private   $error_count    = 0;
  private   $sign_cert_file = "";
  private   $sign_key_file  = "";
  private   $sign_key_pass  = "";
  private   $exceptions     = false;


  const STOP_MESSAGE  = 0; // message only, continue processing
  const STOP_CONTINUE = 1; // message?, likely ok to continue processing
  const STOP_CRITICAL = 2; // message, plus full stop, critical error reached

  public function __construct($exceptions = false) {
    $this-&gt;exceptions = ($exceptions == true);
  }
  public function IsHTML($ishtml = true) {
    if ($ishtml) {
      $this-&gt;ContentType = 'text/html';
    } else {
      $this-&gt;ContentType = 'text/plain';
    }
  }

  public function IsSMTP() {
    $this-&gt;Mailer = 'smtp';
  }
  public function IsMail() {
    $this-&gt;Mailer = 'mail';
  }
  public function IsSendmail() {
    if (!stristr(ini_get('sendmail_path'), 'sendmail')) {
      $this-&gt;Sendmail = '/var/qmail/bin/sendmail';
    }
    $this-&gt;Mailer = 'sendmail';
  }
  public function IsQmail() {
    if (stristr(ini_get('sendmail_path'), 'qmail')) {
      $this-&gt;Sendmail = '/var/qmail/bin/sendmail';
    }
    $this-&gt;Mailer = 'sendmail';
  }

  public function AddAddress($address, $name = '') {
    return $this-&gt;AddAnAddress('to', $address, $name);
  }

  public function AddCC($address, $name = '') {
    return $this-&gt;AddAnAddress('cc', $address, $name);
  }

  public function AddBCC($address, $name = '') {
    return $this-&gt;AddAnAddress('bcc', $address, $name);
  }
  public function AddReplyTo($address, $name = '') {
    return $this-&gt;AddAnAddress('ReplyTo', $address, $name);
  }

  private function AddAnAddress($kind, $address, $name = '') {
    if (!preg_match('/^(to|cc|bcc|ReplyTo)$/', $kind)) {
      echo 'Invalid recipient array: ' . kind;
      return false;
    }
    $address = trim($address);
    $name = trim(preg_replace('/[\\r\
]+/', '', $name)); //Strip breaks and trim
    if (!self::ValidateAddress($address)) {
      $this-&gt;SetError($this-&gt;Lang('invalid_address').': '. $address);
      if ($this-&gt;exceptions) {
        throw new phpmailerException($this-&gt;Lang('invalid_address').': '.$address);
      }
      echo $this-&gt;Lang('invalid_address').': '.$address;
      return false;
    }
    if ($kind != 'ReplyTo') {
      if (!isset($this-&gt;all_recipients[strtolower($address)])) {
        array_push($this-&gt;$kind, array($address, $name));
        $this-&gt;all_recipients[strtolower($address)] = true;
        return true;
      }
    } else {
      if (!array_key_exists(strtolower($address), $this-&gt;ReplyTo)) {
        $this-&gt;ReplyTo[strtolower($address)] = array($address, $name);
      return true;
    }
  }
  return false;
}
  public function SetFrom($address, $name = '',$auto=1) {
    $address = trim($address);
    $name = trim(preg_replace('/[\\r\
]+/', '', $name)); //Strip breaks and trim
    if (!self::ValidateAddress($address)) {
      $this-&gt;SetError($this-&gt;Lang('invalid_address').': '. $address);
      if ($this-&gt;exceptions) {
        throw new phpmailerException($this-&gt;Lang('invalid_address').': '.$address);
      }
      echo $this-&gt;Lang('invalid_address').': '.$address;
      return false;
    }
    $this-&gt;From = $address;
    $this-&gt;FromName = $name;
    if ($auto) {
      if (empty($this-&gt;ReplyTo)) {
        $this-&gt;AddAnAddress('ReplyTo', $address, $name);
      }
      if (empty($this-&gt;Sender)) {
        $this-&gt;Sender = $address;
      }
    }
    return true;
  }
  public static function ValidateAddress($address) {
    if (function_exists('filter_var')) { //Introduced in PHP 5.2
      if(filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) {
        return false;
      } else {
        return true;
      }
    } else {
      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);
    }
  }

  public function Send() {
    try {
      if ((count($this-&gt;to) + count($this-&gt;cc) + count($this-&gt;bcc)) &lt; 1) {
        throw new phpmailerException($this-&gt;Lang('provide_address'), self::STOP_CRITICAL);
      }

      // Set whether the message is multipart/alternative
      if(!empty($this-&gt;AltBody)) {
        $this-&gt;ContentType = 'multipart/alternative';
      }

      $this-&gt;error_count = 0; // reset errors
      $this-&gt;SetMessageType();
      $header = $this-&gt;CreateHeader();
      $body = $this-&gt;CreateBody();

      if (empty($this-&gt;Body)) {
        throw new phpmailerException($this-&gt;Lang('empty_message'), self::STOP_CRITICAL);
      }

      // digitally sign with DKIM if enabled
      if ($this-&gt;DKIM_domain && $this-&gt;DKIM_private) {
        $header_dkim = $this-&gt;DKIM_Add($header,$this-&gt;Subject,$body);
        $header = str_replace("\\r\
","\
",$header_dkim) . $header;
      }

      // Choose the mailer and send through it
      switch($this-&gt;Mailer) {
        case 'sendmail':
          return $this-&gt;SendmailSend($header, $body);
        case 'smtp':
          return $this-&gt;SmtpSend($header, $body);
        default:
          return $this-&gt;MailSend($header, $body);
      }

    } catch (phpmailerException $e) {
      $this-&gt;SetError($e-&gt;getMessage());
      if ($this-&gt;exceptions) {
        throw $e;
      }
      echo $e-&gt;getMessage()."\
";
      return false;
    }
  }

  protected function SendmailSend($header, $body) {
    if ($this-&gt;Sender != '') {
      $sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this-&gt;Sendmail), escapeshellarg($this-&gt;Sender));
    } else {
      $sendmail = sprintf("%s -oi -t", escapeshellcmd($this-&gt;Sendmail));
    }
    if ($this-&gt;SingleTo === true) {
      foreach ($this-&gt;SingleToArray as $key =&gt; $val) {
        if(!@$mail = popen($sendmail, 'w')) {
          throw new phpmailerException($this-&gt;Lang('execute') . $this-&gt;Sendmail, self::STOP_CRITICAL);
        }
        fputs($mail, "To: " . $val . "\
");
        fputs($mail, $header);
        fputs($mail, $body);
        $result = pclose($mail);
        // implement call back function if it exists
        $isSent = ($result == 0) ? 1 : 0;
        $this-&gt;doCallback($isSent,$val,$this-&gt;cc,$this-&gt;bcc,$this-&gt;Subject,$body);
        if($result != 0) {
          throw new phpmailerException($this-&gt;Lang('execute') . $this-&gt;Sendmail, self::STOP_CRITICAL);
        }
      }
    } else {
      if(!@$mail = popen($sendmail, 'w')) {
        throw new phpmailerException($this-&gt;Lang('execute') . $this-&gt;Sendmail, self::STOP_CRITICAL);
      }
      fputs($mail, $header);
      fputs($mail, $body);
      $result = pclose($mail);
      // implement call back function if it exists
      $isSent = ($result == 0) ? 1 : 0;
      $this-&gt;doCallback($isSent,$this-&gt;to,$this-&gt;cc,$this-&gt;bcc,$this-&gt;Subject,$body);
      if($result != 0) {
        throw new phpmailerException($this-&gt;Lang('execute') . $this-&gt;Sendmail, self::STOP_CRITICAL);
      }
    }
    return true;
  }

  protected function MailSend($header, $body) {
    $toArr = array();
    foreach($this-&gt;to as $t) {
      $toArr[] = $this-&gt;AddrFormat($t);
    }
    $to = implode(', ', $toArr);

    $params = sprintf("-oi -f %s", $this-&gt;Sender);
    if ($this-&gt;Sender != '' && strlen(ini_get('safe_mode'))&lt; 1) {
      $old_from = ini_get('sendmail_from');
      ini_set('sendmail_from', $this-&gt;Sender);
      if ($this-&gt;SingleTo === true && count($toArr) &gt; 1) {
        foreach ($toArr as $key =&gt; $val) {
          $rt = @mail($val, $this-&gt;EncodeHeader($this-&gt;SecureHeader($this-&gt;Subject)), $body, $header, $params);
          // implement call back function if it exists
          $isSent = ($rt == 1) ? 1 : 0;
          $this-&gt;doCallback($isSent,$val,$this-&gt;cc,$this-&gt;bcc,$this-&gt;Subject,$body);
        }
      } else {
        $rt = @mail($to, $this-&gt;EncodeHeader($this-&gt;SecureHeader($this-&gt;Subject)), $body, $header, $params);
        // implement call back function if it exists
        $isSent = ($rt == 1) ? 1 : 0;
        $this-&gt;doCallback($isSent,$to,$this-&gt;cc,$this-&gt;bcc,$this-&gt;Subject,$body);
      }
    } else {
      if ($this-&gt;SingleTo === true && count($toArr) &gt; 1) {
        foreach ($toArr as $key =&gt; $val) {
          $rt = @mail($val, $this-&gt;EncodeHeader($this-&gt;SecureHeader($this-&gt;Subject)), $body, $header, $params);
          // implement call back function if it exists
          $isSent = ($rt == 1) ? 1 : 0;
          $this-&gt;doCallback($isSent,$val,$this-&gt;cc,$this-&gt;bcc,$this-&gt;Subject,$body);
        }
      } else {
        $rt = @mail($to, $this-&gt;EncodeHeader($this-&gt;SecureHeader($this-&gt;Subject)), $body, $header);
        // implement call back function if it exists
        $isSent = ($rt == 1) ? 1 : 0;
        $this-&gt;doCallback($isSent,$to,$this-&gt;cc,$this-&gt;bcc,$this-&gt;Subject,$body);
      }
    }
    if (isset($old_from)) {
      ini_set('sendmail_from', $old_from);
    }
    if(!$rt) {
      throw new phpmailerException($this-&gt;Lang('instantiate'), self::STOP_CRITICAL);
    }
    return true;
  }
  protected function SmtpSend($header, $body) {
    require_once $this-&gt;PluginDir . 'class.smtp.php';
    $bad_rcpt = array();

    if(!$this-&gt;SmtpConnect()) {
      throw new phpmailerException($this-&gt;Lang('smtp_connect_failed'), self::STOP_CRITICAL);
    }
    $smtp_from = ($this-&gt;Sender == '') ? $this-&gt;From : $this-&gt;Sender;
    if(!$this-&gt;smtp-&gt;Mail($smtp_from)) {
      throw new phpmailerException($this-&gt;Lang('from_failed') . $smtp_from, self::STOP_CRITICAL);
    }

    // Attempt to send attach all recipients
    foreach($this-&gt;to as $to) {
      if (!$this-&gt;smtp-&gt;Recipient($to[0])) {
        $bad_rcpt[] = $to[0];
        // implement call back function if it exists
        $isSent = 0;
        $this-&gt;doCallback($isSent,$to[0],'','',$this-&gt;Subject,$body);
      } else {
        // implement call back function if it exists
        $isSent = 1;
        $this-&gt;doCallback($isSent,$to[0],'','',$this-&gt;Subject,$body);
      }
    }
    foreach($this-&gt;cc as $cc) {
      if (!$this-&gt;smtp-&gt;Recipient($cc[0])) {
        $bad_rcpt[] = $cc[0];
        // implement call back function if it exists
        $isSent = 0;
        $this-&gt;doCallback($isSent,'',$cc[0],'',$this-&gt;Subject,$body);
      } else {
        // implement call back function if it exists
        $isSent = 1;
        $this-&gt;doCallback($isSent,'',$cc[0],'',$this-&gt;Subject,$body);
      }
    }
    foreach($this-&gt;bcc as $bcc) {
      if (!$this-&gt;smtp-&gt;Recipient($bcc[0])) {
        $bad_rcpt[] = $bcc[0];
        // implement call back function if it exists
        $isSent = 0;
        $this-&gt;doCallback($isSent,'','',$bcc[0],$this-&gt;Subject,$body);
      } else {
        // implement call back function if it exists
        $isSent = 1;
        $this-&gt;doCallback($isSent,'','',$bcc[0],$this-&gt;Subject,$body);
      }
    }


    if (count($bad_rcpt) &gt; 0 ) { //Create error message for any bad addresses
      $badaddresses = implode(', ', $bad_rcpt);
      throw new phpmailerException($this-&gt;Lang('recipients_failed') . $badaddresses);
    }
    if(!$this-&gt;smtp-&gt;Data($header . $body)) {
      throw new phpmailerException($this-&gt;Lang('data_not_accepted'), self::STOP_CRITICAL);
    }
    if($this-&gt;SMTPKeepAlive == true) {
      $this-&gt;smtp-&gt;Reset();
    }
    return true;
  }
  public function SmtpConnect() {
    if(is_null($this-&gt;smtp)) {
      $this-&gt;smtp = new SMTP();
    }

    $this-&gt;smtp-&gt;do_debug = $this-&gt;SMTPDebug;
    $hosts = explode(';', $this-&gt;Host);
    $index = 0;
    $connection = $this-&gt;smtp-&gt;Connected();

    // Retry while there is no connection
    try {
      while($index &lt; count($hosts) && !$connection) {
        $hostinfo = array();
        if (preg_match('/^(.+):([0-9]+)$/', $hosts[$index], $hostinfo)) {
          $host = $hostinfo[1];
          $port = $hostinfo[2];
        } else {
          $host = $hosts[$index];
          $port = $this-&gt;Port;
        }

        $tls = ($this-&gt;SMTPSecure == 'tls');
        $ssl = ($this-&gt;SMTPSecure == 'ssl');

        if ($this-&gt;smtp-&gt;Connect(($ssl ? 'ssl://':'').$host, $port, $this-&gt;Timeout)) {

          $hello = ($this-&gt;Helo != '' ? $this-&gt;Helo : $this-&gt;ServerHostname());
          $this-&gt;smtp-&gt;Hello($hello);

          if ($tls) {
            if (!$this-&gt;smtp-&gt;StartTLS()) {
              throw new phpmailerException($this-&gt;Lang('tls'));
            }

            //We must resend HELO after tls negotiation
            $this-&gt;smtp-&gt;Hello($hello);
          }

          $connection = true;
          if ($this-&gt;SMTPAuth) {
            if (!$this-&gt;smtp-&gt;Authenticate($this-&gt;Username, $this-&gt;Password)) {
              throw new phpmailerException($this-&gt;Lang('authenticate'));
            }
          }
        }
        $index++;
        if (!$connection) {
          throw new phpmailerException($this-&gt;Lang('connect_host'));
        }
      }
    } catch (phpmailerException $e) {
      $this-&gt;smtp-&gt;Reset();
      throw $e;
    }
    return true;
  }

  /**
   * Closes the active SMTP session if one exists.
   * @return void
   */
  public function SmtpClose() {
    if(!is_null($this-&gt;smtp)) {
      if($this-&gt;smtp-&gt;Connected()) {
        $this-&gt;smtp-&gt;Quit();
        $this-&gt;smtp-&gt;Close();
      }
    }
  }

  function SetLanguage($langcode = 'en', $lang_path = 'language/') {
    //Define full set of translatable strings
    $PHPMAILER_LANG = array(
      'provide_address' =&gt; 'You must provide at least one recipient email address.',
      'mailer_not_supported' =&gt; ' mailer is not supported.',
      'execute' =&gt; 'Could not execute: ',
      'instantiate' =&gt; 'Could not instantiate mail function.',
      'authenticate' =&gt; 'SMTP Error: Could not authenticate.',
      'from_failed' =&gt; 'The following From address failed: ',
      'recipients_failed' =&gt; 'SMTP Error: The following recipients failed: ',
      'data_not_accepted' =&gt; 'SMTP Error: Data not accepted.',
      'connect_host' =&gt; 'SMTP Error: Could not connect to SMTP host.',
      'file_access' =&gt; 'Could not access file: ',
      'file_open' =&gt; 'File Error: Could not open file: ',
      'encoding' =&gt; 'Unknown encoding: ',
      'signing' =&gt; 'Signing Error: ',
      'smtp_error' =&gt; 'SMTP server error: ',
      'empty_message' =&gt; 'Message body empty',
      'invalid_address' =&gt; 'Invalid address',
      'variable_set' =&gt; 'Cannot set or reset variable: '
    );
    $l = true;
    if ($langcode != 'en') { //There is no English translation file
      $l = @include $lang_path.'phpmailer.lang-'.$langcode.'.php';
    }
    $this-&gt;language = $PHPMAILER_LANG;
    return ($l == true); //Returns false if language not found
  }

  public function GetTranslations() {
    return $this-&gt;language;
  }

  public function AddrAppend($type, $addr) {
    $addr_str = $type . ': ';
    $addresses = array();
    foreach ($addr as $a) {
      $addresses[] = $this-&gt;AddrFormat($a);
    }
    $addr_str .= implode(', ', $addresses);
    $addr_str .= $this-&gt;LE;

    return $addr_str;
  }
  public function AddrFormat($addr) {
    if (empty($addr[1])) {
      return $this-&gt;SecureHeader($addr[0]);
    } else {
      return $this-&gt;EncodeHeader($this-&gt;SecureHeader($addr[1]), 'phrase') . " &lt;" . $this-&gt;SecureHeader($addr[0]) . "&gt;";
    }
  }
  public function WrapText($message, $length, $qp_mode = false) {
    $soft_break = ($qp_mode) ? sprintf(" =%s", $this-&gt;LE) : $this-&gt;LE;
    // If utf-8 encoding is used, we will need to make sure we don't
    // split multibyte characters when we wrap
    $is_utf8 = (strtolower($this-&gt;CharSet) == "utf-8");

    $message = $this-&gt;FixEOL($message);
    if (substr($message, -1) == $this-&gt;LE) {
      $message = substr($message, 0, -1);
    }

    $line = explode($this-&gt;LE, $message);
    $message = '';
    for ($i=0 ;$i &lt; count($line); $i++) {
      $line_part = explode(' ', $line[$i]);
      $buf = '';
      for ($e = 0; $e&lt;count($line_part); $e++) {
        $word = $line_part[$e];
        if ($qp_mode and (strlen($word) &gt; $length)) {
          $space_left = $length - strlen($buf) - 1;
          if ($e != 0) {
            if ($space_left &gt; 20) {
              $len = $space_left;
              if ($is_utf8) {
                $len = $this-&gt;UTF8CharBoundary($word, $len);
              } elseif (substr($word, $len - 1, 1) == "=") {
                $len--;
              } elseif (substr($word, $len - 2, 1) == "=") {
                $len -= 2;
              }
              $part = substr($word, 0, $len);
              $word = substr($word, $len);
              $buf .= ' ' . $part;
              $message .= $buf . sprintf("=%s", $this-&gt;LE);
            } else {
              $message .= $buf . $soft_break;
            }
            $buf = '';
          }
          while (strlen($word) &gt; 0) {
            $len = $length;
            if ($is_utf8) {
              $len = $this-&gt;UTF8CharBoundary($word, $len);
            } elseif (substr($word, $len - 1, 1) == "=") {
              $len--;
            } elseif (substr($word, $len - 2, 1) == "=") {
              $len -= 2;
            }
            $part = substr($word, 0, $len);
            $word = substr($word, $len);

            if (strlen($word) &gt; 0) {
              $message .= $part . sprintf("=%s", $this-&gt;LE);
            } else {
              $buf = $part;
            }
          }
        } else {
          $buf_o = $buf;
          $buf .= ($e == 0) ? $word : (' ' . $word);

          if (strlen($buf) &gt; $length and $buf_o != '') {
            $message .= $buf_o . $soft_break;
            $buf = $word;
          }
        }
      }
      $message .= $buf . $this-&gt;LE;
    }

    return $message;
  }

  public function UTF8CharBoundary($encodedText, $maxLength) {
    $foundSplitPos = false;
    $lookBack = 3;
    while (!$foundSplitPos) {
      $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
      $encodedCharPos = strpos($lastChunk, "=");
      if ($encodedCharPos !== false) {
        // Found start of encoded character byte within $lookBack block.
        // Check the encoded byte value (the 2 chars after the '=')
        $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
        $dec = hexdec($hex);
        if ($dec &lt; 128) { // Single byte character.
          // If the encoded char was found at pos 0, it will fit
          // otherwise reduce maxLength to start of the encoded char
          $maxLength = ($encodedCharPos == 0) ? $maxLength :
          $maxLength - ($lookBack - $encodedCharPos);
          $foundSplitPos = true;
        } elseif ($dec &gt;= 192) { // First byte of a multi byte character
          // Reduce maxLength to split at start of character
          $maxLength = $maxLength - ($lookBack - $encodedCharPos);
          $foundSplitPos = true;
        } elseif ($dec &lt; 192) { // Middle byte of a multi byte character, look further back
          $lookBack += 3;
        }
      } else {
        // No encoded character found
        $foundSplitPos = true;
      }
    }
    return $maxLength;
  }

  public function SetWordWrap() {
    if($this-&gt;WordWrap &lt; 1) {
      return;
    }

    switch($this-&gt;message_type) {
      case 'alt':
      case 'alt_attachments':
        $this-&gt;AltBody = $this-&gt;WrapText($this-&gt;AltBody, $this-&gt;WordWrap);
        break;
      default:
        $this-&gt;Body = $this-&gt;WrapText($this-&gt;Body, $this-&gt;WordWrap);
        break;
    }
  }
  public function CreateHeader() {
    $result = '';

    // Set the boundaries
    $uniq_id = md5(uniqid(time()));
    $this-&gt;boundary[1] = 'b1_' . $uniq_id;
    $this-&gt;boundary[2] = 'b2_' . $uniq_id;

    $result .= $this-&gt;HeaderLine('Date', self::RFCDate());
    if($this-&gt;Sender == '') {
      $result .= $this-&gt;HeaderLine('Return-Path', trim($this-&gt;From));
    } else {
      $result .= $this-&gt;HeaderLine('Return-Path', trim($this-&gt;Sender));
    }

    if($this-&gt;Mailer != 'mail') {
      if ($this-&gt;SingleTo === true) {
        foreach($this-&gt;to as $t) {
          $this-&gt;SingleToArray[] = $this-&gt;AddrFormat($t);
        }
      } else {
        if(count($this-&gt;to) &gt; 0) {
          $result .= $this-&gt;AddrAppend('To', $this-&gt;to);
        } elseif (count($this-&gt;cc) == 0) {
          $result .= $this-&gt;HeaderLine('To', 'undisclosed-recipients:;');
        }
      }
    }

    $from = array();
    $from[0][0] = trim($this-&gt;From);
    $from[0][1] = $this-&gt;FromName;
    $result .= $this-&gt;AddrAppend('From', $from);

    // sendmail and mail() extract Cc from the header before sending
    if(count($this-&gt;cc) &gt; 0) {
      $result .= $this-&gt;AddrAppend('Cc', $this-&gt;cc);
    }

    // sendmail and mail() extract Bcc from the header before sending
    if((($this-&gt;Mailer == 'sendmail') || ($this-&gt;Mailer == 'mail')) && (count($this-&gt;bcc) &gt; 0)) {
      $result .= $this-&gt;AddrAppend('Bcc', $this-&gt;bcc);
    }

    if(count($this-&gt;ReplyTo) &gt; 0) {
      $result .= $this-&gt;AddrAppend('Reply-to', $this-&gt;ReplyTo);
    }

    // mail() sets the subject itself
    if($this-&gt;Mailer != 'mail') {
      $result .= $this-&gt;HeaderLine('Subject', $this-&gt;EncodeHeader($this-&gt;SecureHeader($this-&gt;Subject)));
    }

    if($this-&gt;MessageID != '') {
      $result .= $this-&gt;HeaderLine('Message-ID',$this-&gt;MessageID);
    } else {
      $result .= sprintf("Message-ID: &lt;%s@%s&gt;%s", $uniq_id, $this-&gt;ServerHostname(), $this-&gt;LE);
    }
    $result .= $this-&gt;HeaderLine('X-Priority', $this-&gt;Priority);
    $result .= $this-&gt;HeaderLine('X-Mailer', 'PHPMailer '.$this-&gt;Version.' (phpmailer.sourceforge.net)');

    if($this-&gt;ConfirmReadingTo != '') {
      $result .= $this-&gt;HeaderLine('Disposition-Notification-To', '&lt;' . trim($this-&gt;ConfirmReadingTo) . '&gt;');
    }

    // Add custom headers
    for($index = 0; $index &lt; count($this-&gt;CustomHeader); $index++) {
      $result .= $this-&gt;HeaderLine(trim($this-&gt;CustomHeader[$index][0]), $this-&gt;EncodeHeader(trim($this-&gt;CustomHeader[$index][1])));
    }
    if (!$this-&gt;sign_key_file) {
      $result .= $this-&gt;HeaderLine('MIME-Version', '1.0');
      $result .= $this-&gt;GetMailMIME();
    }

    return $result;
  }
  public function GetMailMIME() {
    $result = '';
    switch($this-&gt;message_type) {
      case 'plain':
        $result .= $this-&gt;HeaderLine('Content-Transfer-Encoding', $this-&gt;Encoding);
        $result .= sprintf("Content-Type: %s; charset=\\"%s\\"", $this-&gt;ContentType, $this-&gt;CharSet);
        break;
      case 'attachments':
      case 'alt_attachments':
        if($this-&gt;InlineImageExists()){
          $result .= sprintf("Content-Type: %s;%s\	type=\\"text/html\\";%s\	boundary=\\"%s\\"%s", 'multipart/related', $this-&gt;LE, $this-&gt;LE, $this-&gt;boundary[1], $this-&gt;LE);
        } else {
          $result .= $this-&gt;HeaderLine('Content-Type', 'multipart/mixed;');
          $result .= $this-&gt;TextLine("\	boundary=\\"" . $this-&gt;boundary[1] . '"');
        }
        break;
      case 'alt':
        $result .= $this-&gt;HeaderLine('Content-Type', 'multipart/alternative;');
        $result .= $this-&gt;TextLine("\	boundary=\\"" . $this-&gt;boundary[1] . '"');
        break;
    }

    if($this-&gt;Mailer != 'mail') {
      $result .= $this-&gt;LE.$this-&gt;LE;
    }

    return $result;
  }

  public function CreateBody() {
    $body = '';

    if ($this-&gt;sign_key_file) {
      $body .= $this-&gt;GetMailMIME();
    }

    $this-&gt;SetWordWrap();

    switch($this-&gt;message_type) {
      case 'alt':
        $body .= $this-&gt;GetBoundary($this-&gt;boundary[1], '', 'text/plain', '');
        $body .= $this-&gt;EncodeString($this-&gt;AltBody, $this-&gt;Encoding);
        $body .= $this-&gt;LE.$this-&gt;LE;
        $body .= $this-&gt;GetBoundary($this-&gt;boundary[1], '', 'text/html', '');
        $body .= $this-&gt;EncodeString($this-&gt;Body, $this-&gt;Encoding);
        $body .= $this-&gt;LE.$this-&gt;LE;
        $body .= $this-&gt;EndBoundary($this-&gt;boundary[1]);
        break;
      case 'plain':
        $body .= $this-&gt;EncodeString($this-&gt;Body, $this-&gt;Encoding);
        break;
      case 'attachments':
        $body .= $this-&gt;GetBoundary($this-&gt;boundary[1], '', '', '');
        $body .= $this-&gt;EncodeString($this-&gt;Body, $this-&gt;Encoding);
        $body .= $this-&gt;LE;
        $body .= $this-&gt;AttachAll();
        break;
      case 'alt_attachments':
        $body .= sprintf("--%s%s", $this-&gt;boundary[1], $this-&gt;LE);
        $body .= sprintf("Content-Type: %s;%s" . "\	boundary=\\"%s\\"%s", 'multipart/alternative', $this-&gt;LE, $this-&gt;boundary[2], $this-&gt;LE.$this-&gt;LE);
        $body .= $this-&gt;GetBoundary($this-&gt;boundary[2], '', 'text/plain', '') . $this-&gt;LE; // Create text body
        $body .= $this-&gt;EncodeString($this-&gt;AltBody, $this-&gt;Encoding);
        $body .= $this-&gt;LE.$this-&gt;LE;
        $body .= $this-&gt;GetBoundary($this-&gt;boundary[2], '', 'text/html', '') . $this-&gt;LE; // Create the HTML body
        $body .= $this-&gt;EncodeString($this-&gt;Body, $this-&gt;Encoding);
        $body .= $this-&gt;LE.$this-&gt;LE;
        $body .= $this-&gt;EndBoundary($this-&gt;boundary[2]);
        $body .= $this-&gt;AttachAll();
        break;
    }

    if ($this-&gt;IsError()) {
      $body = '';
    } elseif ($this-&gt;sign_key_file) {
      try {
        $file = tempnam('', 'mail');
        file_put_contents($file, $body); //TODO check this worked
        $signed = tempnam("", "signed");
        if (@openssl_pkcs7_sign($file, $signed, "file://".$this-&gt;sign_cert_file, array("file://".$this-&gt;sign_key_file, $this-&gt;sign_key_pass), NULL)) {
          @unlink($file);
          @unlink($signed);
          $body = file_get_contents($signed);
        } else {
          @unlink($file);
          @unlink($signed);
          throw new phpmailerException($this-&gt;Lang("signing").openssl_error_string());
        }
      } catch (phpmailerException $e) {
        $body = '';
        if ($this-&gt;exceptions) {
          throw $e;
        }
      }
    }

    return $body;
  }

  /**
   * Returns the start of a message boundary.
   * @access private
   */
  private function GetBoundary($boundary, $charSet, $contentType, $encoding) {
    $result = '';
    if($charSet == '') {
      $charSet = $this-&gt;CharSet;
    }
    if($contentType == '') {
      $contentType = $this-&gt;ContentType;
    }
    if($encoding == '') {
      $encoding = $this-&gt;Encoding;
    }
    $result .= $this-&gt;TextLine('--' . $boundary);
    $result .= sprintf("Content-Type: %s; charset = \\"%s\\"", $contentType, $charSet);
    $result .= $this-&gt;LE;
    $result .= $this-&gt;HeaderLine('Content-Transfer-Encoding', $encoding);
    $result .= $this-&gt;LE;

    return $result;
  }

  /**
   * Returns the end of a message boundary.
   * @access private
   */
  private function EndBoundary($boundary) {
    return $this-&gt;LE . '--' . $boundary . '--' . $this-&gt;LE;
  }

  /**
   * Sets the message type.
   * @access private
   * @return void
   */
  private function SetMessageType() {
    if(count($this-&gt;attachment) &lt; 1 && strlen($this-&gt;AltBody) &lt; 1) {
      $this-&gt;message_type = 'plain';
    } else {
      if(count($this-&gt;attachment) &gt; 0) {
        $this-&gt;message_type = 'attachments';
      }
      if(strlen($this-&gt;AltBody) &gt; 0 && count($this-&gt;attachment) &lt; 1) {
        $this-&gt;message_type = 'alt';
      }
      if(strlen($this-&gt;AltBody) &gt; 0 && count($this-&gt;attachment) &gt; 0) {
        $this-&gt;message_type = 'alt_attachments';
      }
    }
  }

  /**
   *  Returns a formatted header line.
   * @access public
   * @return string
   */
  public function HeaderLine($name, $value) {
    return $name . ': ' . $value . $this-&gt;LE;
  }

  /**
   * Returns a formatted mail line.
   * @access public
   * @return string
   */
  public function TextLine($value) {
    return $value . $this-&gt;LE;
  }

  public function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
    try {
      if ( !@is_file($path) ) {
        throw new phpmailerException($this-&gt;Lang('file_access') . $path, self::STOP_CONTINUE);
      }
      $filename = basename($path);
      if ( $name == '' ) {
        $name = $filename;
      }

      $this-&gt;attachment[] = array(
        0 =&gt; $path,
        1 =&gt; $filename,
        2 =&gt; $name,
        3 =&gt; $encoding,
        4 =&gt; $type,
        5 =&gt; false,  // isStringAttachment
        6 =&gt; 'attachment',
        7 =&gt; 0
      );

    } catch (phpmailerException $e) {
      $this-&gt;SetError($e-&gt;getMessage());
      if ($this-&gt;exceptions) {
        throw $e;
      }
      echo $e-&gt;getMessage()."\
";
      if ( $e-&gt;getCode() == self::STOP_CRITICAL ) {
        return false;
      }
    }
    return true;
  }

  public function GetAttachments() {
    return $this-&gt;attachment;
  }

  private function AttachAll() {
    // Return text of body
    $mime = array();
    $cidUniq = array();
    $incl = array();

    // Add all attachments
    foreach ($this-&gt;attachment as $attachment) {
      // Check for string attachment
      $bString = $attachment[5];
      if ($bString) {
        $string = $attachment[0];
      } else {
        $path = $attachment[0];
      }

      if (in_array($attachment[0], $incl)) { continue; }
      $filename    = $attachment[1];
      $name        = $attachment[2];
      $encoding    = $attachment[3];
      $type        = $attachment[4];
      $disposition = $attachment[6];
      $cid         = $attachment[7];
      $incl[]      = $attachment[0];
      if ( $disposition == 'inline' && isset($cidUniq[$cid]) ) { continue; }
      $cidUniq[$cid] = true;

      $mime[] = sprintf("--%s%s", $this-&gt;boundary[1], $this-&gt;LE);
      $mime[] = sprintf("Content-Type: %s; name=\\"%s\\"%s", $type, $this-&gt;EncodeHeader($this-&gt;SecureHeader($name)), $this-&gt;LE);
      $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this-&gt;LE);

      if($disposition == 'inline') {
        $mime[] = sprintf("Content-ID: &lt;%s&gt;%s", $cid, $this-&gt;LE);
      }

      $mime[] = sprintf("Content-Disposition: %s; filename=\\"%s\\"%s", $disposition, $this-&gt;EncodeHeader($this-&gt;SecureHeader($name)), $this-&gt;LE.$this-&gt;LE);

      // Encode as string attachment
      if($bString) {
        $mime[] = $this-&gt;EncodeString($string, $encoding);
        if($this-&gt;IsError()) {
          return '';
        }
        $mime[] = $this-&gt;LE.$this-&gt;LE;
      } else {
        $mime[] = $this-&gt;EncodeFile($path, $encoding);
        if($this-&gt;IsError()) {
          return '';
        }
        $mime[] = $this-&gt;LE.$this-&gt;LE;
      }
    }

    $mime[] = sprintf("--%s--%s", $this-&gt;boundary[1], $this-&gt;LE);

    return join('', $mime);
  }

  private function EncodeFile($path, $encoding = 'base64') {
    try {
      if (!is_readable($path)) {
        throw new phpmailerException($this-&gt;Lang('file_open') . $path, self::STOP_CONTINUE);
      }
      if (function_exists('get_magic_quotes')) {
        function get_magic_quotes() {
          return false;
        }
      }
      if (PHP_VERSION &lt; 6) {
        $magic_quotes = get_magic_quotes_runtime();
        set_magic_quotes_runtime(0);
      }
      $file_buffer  = file_get_contents($path);
      $file_buffer  = $this-&gt;EncodeString($file_buffer, $encoding);
      if (PHP_VERSION &lt; 6) { set_magic_quotes_runtime($magic_quotes); }
      return $file_buffer;
    } catch (Exception $e) {
      $this-&gt;SetError($e-&gt;getMessage());
      return '';
    }
  }
  public function EncodeString ($str, $encoding = 'base64') {
    $encoded = '';
    switch(strtolower($encoding)) {
      case 'base64':
        $encoded = chunk_split(base64_encode($str), 76, $this-&gt;LE);
        break;
      case '7bit':
      case '8bit':
        $encoded = $this-&gt;FixEOL($str);
        //Make sure it ends with a line break
        if (substr($encoded, -(strlen($this-&gt;LE))) != $this-&gt;LE)
          $encoded .= $this-&gt;LE;
        break;
      case 'binary':
        $encoded = $str;
        break;
      case 'quoted-printable':
        $encoded = $this-&gt;EncodeQP($str);
        break;
      default:
        $this-&gt;SetError($this-&gt;Lang('encoding') . $encoding);
        break;
    }
    return $encoded;
  }

  /**
   * Encode a header string to best (shortest) of Q, B, quoted or none.
   * @access public
   * @return string
   */
  public function EncodeHeader($str, $position = 'text') {
    $x = 0;

    switch (strtolower($position)) {
      case 'phrase':
        if (!preg_match('/[\\200-\\377]/', $str)) {
          // Can't use addslashes as we don't know what value has magic_quotes_sybase
          $encoded = addcslashes($str, "\\0..\\37\\177\\\\\\"");
          if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\\'*+\\/=?^_`{|}~ -]/', $str)) {
            return ($encoded);
          } else {
            return ("\\"$encoded\\"");
          }
        }
        $x = preg_match_all('/[^\\040\\041\\043-\\133\\135-\\176]/', $str, $matches);
        break;
      case 'comment':
        $x = preg_match_all('/[()"]/', $str, $matches);
        // Fall-through
      case 'text':
      default:
        $x += preg_match_all('/[\\000-\\010\\013\\014\\016-\\037\\177-\\377]/', $str, $matches);
        break;
    }

    if ($x == 0) {
      return ($str);
    }

    $maxlen = 75 - 7 - strlen($this-&gt;CharSet);
    // Try to select the encoding which should produce the shortest output
    if (strlen($str)/3 &lt; $x) {
      $encoding = 'B';
      if (function_exists('mb_strlen') && $this-&gt;HasMultiBytes($str)) {
        // Use a custom function which correctly encodes and wraps long
        // multibyte strings without breaking lines within a character
        $encoded = $this-&gt;Base64EncodeWrapMB($str);
      } else {
        $encoded = base64_encode($str);
        $maxlen -= $maxlen % 4;
        $encoded = trim(chunk_split($encoded, $maxlen, "\
"));
      }
    } else {
      $encoding = 'Q';
      $encoded = $this-&gt;EncodeQ($str, $position);
      $encoded = $this-&gt;WrapText($encoded, $maxlen, true);
      $encoded = str_replace('='.$this-&gt;LE, "\
", trim($encoded));
    }

    $encoded = preg_replace('/^(.*)$/m', " =?".$this-&gt;CharSet."?$encoding?\\\\1?=", $encoded);
    $encoded = trim(str_replace("\
", $this-&gt;LE, $encoded));

    return $encoded;
  }

  public function HasMultiBytes($str) {
    if (function_exists('mb_strlen')) {
      return (strlen($str) &gt; mb_strlen($str, $this-&gt;CharSet));
    } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
      return false;
    }
  }
  public function Base64EncodeWrapMB($str) {
    $start = "=?".$this-&gt;CharSet."?B?";
    $end = "?=";
    $encoded = "";

    $mb_length = mb_strlen($str, $this-&gt;CharSet);
    // Each line must have length &lt;= 75, including $start and $end
    $length = 75 - strlen($start) - strlen($end);
    // Average multi-byte ratio
    $ratio = $mb_length / strlen($str);
    // Base64 has a 4:3 ratio
    $offset = $avgLength = floor($length * $ratio * .75);

    for ($i = 0; $i &lt; $mb_length; $i += $offset) {
      $lookBack = 0;

      do {
        $offset = $avgLength - $lookBack;
        $chunk = mb_substr($str, $i, $offset, $this-&gt;CharSet);
        $chunk = base64_encode($chunk);
        $lookBack++;
      }
      while (strlen($chunk) &gt; $length);

      $encoded .= $chunk . $this-&gt;LE;
    }

    // Chomp the last linefeed
    $encoded = substr($encoded, 0, -strlen($this-&gt;LE));
    return $encoded;
  }
  public function EncodeQPphp( $input = '', $line_max = 76, $space_conv = false) {
    $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
    $lines = preg_split('/(?:\\r\
|\\r|\
)/', $input);
    $eol = "\\r\
";
    $escape = '=';
    $output = '';
    while( list(, $line) = each($lines) ) {
      $linlen = strlen($line);
      $newline = '';
      for($i = 0; $i &lt; $linlen; $i++) {
        $c = substr( $line, $i, 1 );
        $dec = ord( $c );
        if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E
          $c = '=2E';
        }
        if ( $dec == 32 ) {
          if ( $i == ( $linlen - 1 ) ) { // convert space at eol only
            $c = '=20';
          } else if ( $space_conv ) {
            $c = '=20';
          }
        } elseif ( ($dec == 61) || ($dec &lt; 32 ) || ($dec &gt; 126) ) { // always encode "\	", which is *not* required
          $h2 = floor($dec/16);
          $h1 = floor($dec%16);
          $c = $escape.$hex[$h2].$hex[$h1];
        }
        if ( (strlen($newline) + strlen($c)) &gt;= $line_max ) { // CRLF is not counted
          $output .= $newline.$escape.$eol; //  soft line break; " =\\r\
" is okay
          $newline = '';
          // check if newline first character will be point or not
          if ( $dec == 46 ) {
            $c = '=2E';
          }
        }
        $newline .= $c;
      } // end of for
      $output .= $newline.$eol;
    } // end of while
    return $output;
  }
  public function EncodeQP($string, $line_max = 76, $space_conv = false) {
    if (function_exists('quoted_printable_encode')) { //Use native function if it's available (&gt;= PHP5.3)
      return quoted_printable_encode($string);
    }
    $filters = stream_get_filters();
    if (!in_array('convert.*', $filters)) { //Got convert stream filter?
      return $this-&gt;EncodeQPphp($string, $line_max, $space_conv); //Fall back to old implementation
    }
    $fp = fopen('php://temp/', 'r+');
    $string = preg_replace('/\\r\
?/', $this-&gt;LE, $string); //Normalise line breaks
    $params = array('line-length' =&gt; $line_max, 'line-break-chars' =&gt; $this-&gt;LE);
    $s = stream_filter_append($fp, 'convert.quoted-printable-encode', STREAM_FILTER_READ, $params);
    fputs($fp, $string);
    rewind($fp);
    $out = stream_get_contents($fp);
    stream_filter_remove($s);
    $out = preg_replace('/^\\./m', '=2E', $out); //Encode . if it is first char on a line, workaround for bug in Exchange
    fclose($fp);
    return $out;
  }
  public function EncodeQ ($str, $position = 'text') {
    // There should not be any EOL in the string
    $encoded = preg_replace('/[\\r\
]*/', '', $str);

    switch (strtolower($position)) {
      case 'phrase':
        $encoded = preg_replace("/([^A-Za-z0-9!*+\\/ -])/e", "'='.sprintf('%02X', ord('\\\\1'))", $encoded);
        break;
      case 'comment':
        $encoded = preg_replace("/([\\(\\)\\"])/e", "'='.sprintf('%02X', ord('\\\\1'))", $encoded);
      case 'text':
      default:
        $encoded = preg_replace('/([\\000-\\011\\013\\014\\016-\\037\\075\\077\\137\\177-\\377])/e',
              "'='.sprintf('%02X', ord('\\\\1'))", $encoded);
        break;
    }

    // Replace every spaces to _ (more readable than =20)
    $encoded = str_replace(' ', '_', $encoded);

    return $encoded;
  }

  public function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') {
    // Append to $attachment array
    $this-&gt;attachment[] = array(
      0 =&gt; $string,
      1 =&gt; $filename,
      2 =&gt; basename($filename),
      3 =&gt; $encoding,
      4 =&gt; $type,
      5 =&gt; true,  // isStringAttachment
      6 =&gt; 'attachment',
      7 =&gt; 0
    );
  }

  public function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {

    if ( !@is_file($path) ) {
      $this-&gt;SetError($this-&gt;Lang('file_access') . $path);
      return false;
    }

    $filename = basename($path);
    if ( $name == '' ) {
      $name = $filename;
    }

    // Append to $attachment array
    $this-&gt;attachment[] = array(
      0 =&gt; $path,
      1 =&gt; $filename,
      2 =&gt; $name,
      3 =&gt; $encoding,
      4 =&gt; $type,
      5 =&gt; false,  // isStringAttachment
      6 =&gt; 'inline',
      7 =&gt; $cid
    );

    return true;
  }

  public function InlineImageExists() {
    foreach($this-&gt;attachment as $attachment) {
      if ($attachment[6] == 'inline') {
        return true;
      }
    }
    return false;
  }

  public function ClearAddresses() {
    foreach($this-&gt;to as $to) {
      unset($this-&gt;all_recipients[strtolower($to[0])]);
    }
    $this-&gt;to = array();
  }

  /**
   * Clears all recipients assigned in the CC array.  Returns void.
   * @return void
   */
  public function ClearCCs() {
    foreach($this-&gt;cc as $cc) {
      unset($this-&gt;all_recipients[strtolower($cc[0])]);
    }
    $this-&gt;cc = array();
  }

  public function ClearBCCs() {
    foreach($this-&gt;bcc as $bcc) {
      unset($this-&gt;all_recipients[strtolower($bcc[0])]);
    }
    $this-&gt;bcc = array();
  }
  public function ClearReplyTos() {
    $this-&gt;ReplyTo = array();
  }

  public function ClearAllRecipients() {
    $this-&gt;to = array();
    $this-&gt;cc = array();
    $this-&gt;bcc = array();
    $this-&gt;all_recipients = array();
  }
  public function ClearAttachments() {
    $this-&gt;attachment = array();
  }

  /**
   * Clears all custom headers.  Returns void.
   * @return void
   */
  public function ClearCustomHeaders() {
    $this-&gt;CustomHeader = array();
  }

  protected function SetError($msg) {
    $this-&gt;error_count++;
    if ($this-&gt;Mailer == 'smtp' and !is_null($this-&gt;smtp)) {
      $lasterror = $this-&gt;smtp-&gt;getError();
      if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) {
        $msg .= '&lt;p&gt;' . $this-&gt;Lang('smtp_error') . $lasterror['smtp_msg'] . "&lt;/p&gt;\
";
      }
    }
    $this-&gt;ErrorInfo = $msg;
  }
  public static function RFCDate() {
    $tz = date('Z');
    $tzs = ($tz &lt; 0) ? '-' : '+';
    $tz = abs($tz);
    $tz = (int)($tz/3600)*100 + ($tz%3600)/60;
    $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz);

    return $result;
  }
  private function ServerHostname() {
    if (!empty($this-&gt;Hostname)) {
      $result = $this-&gt;Hostname;
    } elseif (isset($_SERVER['SERVER_NAME'])) {
      $result = $_SERVER['SERVER_NAME'];
    } else {
      $result = 'localhost.localdomain';
    }

    return $result;
  }
  private function Lang($key) {
    if(count($this-&gt;language) &lt; 1) {
      $this-&gt;SetLanguage('en'); // set the default language
    }

    if(isset($this-&gt;language[$key])) {
      return $this-&gt;language[$key];
    } else {
      return 'Language string failed to load: ' . $key;
    }
  }
  public function IsError() {
    return ($this-&gt;error_count &gt; 0);
  }

  private function FixEOL($str) {
    $str = str_replace("\\r\
", "\
", $str);
    $str = str_replace("\\r", "\
", $str);
    $str = str_replace("\
", $this-&gt;LE, $str);
    return $str;
  }

  public function AddCustomHeader($custom_header) {
    $this-&gt;CustomHeader[] = explode(':', $custom_header, 2);
  }

  public function MsgHTML($message, $basedir = '') {
    preg_match_all("/(src|background)=\\"(.*)\\"/Ui", $message, $images);
    if(isset($images[2])) {
      foreach($images[2] as $i =&gt; $url) {
        // do not change urls for absolute images (thanks to corvuscorax)
        if (!preg_match('#^[A-z]+://#',$url)) {
          $filename = basename($url);
          $directory = dirname($url);
          ($directory == '.')?$directory='':'';
          $cid = 'cid:' . md5($filename);
          $ext = pathinfo($filename, PATHINFO_EXTENSION);
          $mimeType  = self::_mime_types($ext);
          if ( strlen($basedir) &gt; 1 && substr($basedir,-1) != '/') { $basedir .= '/'; }
          if ( strlen($directory) &gt; 1 && substr($directory,-1) != '/') { $directory .= '/'; }
          if ( $this-&gt;AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64',$mimeType) ) {
            $message = preg_replace("/".$images[1][$i]."=\\"".preg_quote($url, '/')."\\"/Ui", $images[1][$i]."=\\"".$cid."\\"", $message);
          }
        }
      }
    }
    $this-&gt;IsHTML(true);
    $this-&gt;Body = $message;
    $textMsg = trim(strip_tags(preg_replace('/&lt;(head|title|style|script)[^&gt;]*&gt;.*?&lt;\\/\\\\1&gt;/s','',$message)));
    if (!empty($textMsg) && empty($this-&gt;AltBody)) {
      $this-&gt;AltBody = html_entity_decode($textMsg);
    }
    if (empty($this-&gt;AltBody)) {
      $this-&gt;AltBody = 'To view this email message, open it in a program that understands HTML!' . "\
\
";
    }
  }

  public static function _mime_types($ext = '') {
    $mimes = array(
      'hqx'   =&gt;  'application/mac-binhex40',
      'cpt'   =&gt;  'application/mac-compactpro',
      'doc'   =&gt;  'application/msword',
      'bin'   =&gt;  'application/macbinary',
      'dms'   =&gt;  'application/octet-stream',
      'lha'   =&gt;  'application/octet-stream',
      'lzh'   =&gt;  'application/octet-stream',
      'exe'   =&gt;  'application/octet-stream',
      'class' =&gt;  'application/octet-stream',
      'psd'   =&gt;  'application/octet-stream',
      'so'    =&gt;  'application/octet-stream',
      'sea'   =&gt;  'application/octet-stream',
      'dll'   =&gt;  'application/octet-stream',
      'oda'   =&gt;  'application/oda',
      'pdf'   =&gt;  'application/pdf',
      'ai'    =&gt;  'application/postscript',
      'eps'   =&gt;  'application/postscript',
      'ps'    =&gt;  'application/postscript',
      'smi'   =&gt;  'application/smil',
      'smil'  =&gt;  'application/smil',
      'mif'   =&gt;  'application/vnd.mif',
      'xls'   =&gt;  'application/vnd.ms-excel',
      'ppt'   =&gt;  'application/vnd.ms-powerpoint',
      'wbxml' =&gt;  'application/vnd.wap.wbxml',
      'wmlc'  =&gt;  'application/vnd.wap.wmlc',
      'dcr'   =&gt;  'application/x-director',
      'dir'   =&gt;  'application/x-director',
      'dxr'   =&gt;  'application/x-director',
      'dvi'   =&gt;  'application/x-dvi',
      'gtar'  =&gt;  'application/x-gtar',
      'php'   =&gt;  'application/x-httpd-php',
      'php4'  =&gt;  'application/x-httpd-php',
      'php3'  =&gt;  'application/x-httpd-php',
      'phtml' =&gt;  'application/x-httpd-php',
      'phps'  =&gt;  'application/x-httpd-php-source',
      'js'    =&gt;  'application/x-javascript',
      'swf'   =&gt;  'application/x-shockwave-flash',
      'sit'   =&gt;  'application/x-stuffit',
      'tar'   =&gt;  'application/x-tar',
      'tgz'   =&gt;  'application/x-tar',
      'xhtml' =&gt;  'application/xhtml+xml',
      'xht'   =&gt;  'application/xhtml+xml',
      'zip'   =&gt;  'application/zip',
      'mid'   =&gt;  'audio/midi',
      'midi'  =&gt;  'audio/midi',
      'mpga'  =&gt;  'audio/mpeg',
      'mp2'   =&gt;  'audio/mpeg',
      'mp3'   =&gt;  'audio/mpeg',
      'aif'   =&gt;  'audio/x-aiff',
      'aiff'  =&gt;  'audio/x-aiff',
      'aifc'  =&gt;  'audio/x-aiff',
      'ram'   =&gt;  'audio/x-pn-realaudio',
      'rm'    =&gt;  'audio/x-pn-realaudio',
      'rpm'   =&gt;  'audio/x-pn-realaudio-plugin',
      'ra'    =&gt;  'audio/x-realaudio',
      'rv'    =&gt;  'video/vnd.rn-realvideo',
      'wav'   =&gt;  'audio/x-wav',
      'bmp'   =&gt;  'image/bmp',
      'gif'   =&gt;  'image/gif',
      'jpeg'  =&gt;  'image/jpeg',
      'jpg'   =&gt;  'image/jpeg',
      'jpe'   =&gt;  'image/jpeg',
      'png'   =&gt;  'image/png',
      'tiff'  =&gt;  'image/tiff',
      'tif'   =&gt;  'image/tiff',
      'css'   =&gt;  'text/css',
      'html'  =&gt;  'text/html',
      'htm'   =&gt;  'text/html',
      'shtml' =&gt;  'text/html',
      'txt'   =&gt;  'text/plain',
      'text'  =&gt;  'text/plain',
      'log'   =&gt;  'text/plain',
      'rtx'   =&gt;  'text/richtext',
      'rtf'   =&gt;  'text/rtf',
      'xml'   =&gt;  'text/xml',
      'xsl'   =&gt;  'text/xml',
      'mpeg'  =&gt;  'video/mpeg',
      'mpg'   =&gt;  'video/mpeg',
      'mpe'   =&gt;  'video/mpeg',
      'qt'    =&gt;  'video/quicktime',
      'mov'   =&gt;  'video/quicktime',
      'avi'   =&gt;  'video/x-msvideo',
      'movie' =&gt;  'video/x-sgi-movie',
      'doc'   =&gt;  'application/msword',
      'word'  =&gt;  'application/msword',
      'xl'    =&gt;  'application/excel',
      'eml'   =&gt;  'message/rfc822'
    );
    return (!isset($mimes[strtolower($ext)])) ? 'application/octet-stream' : $mimes[strtolower($ext)];
  }

  public function set($name, $value = '') {
    try {
      if (isset($this-&gt;$name) ) {
        $this-&gt;$name = $value;
      } else {
        throw new phpmailerException($this-&gt;Lang('variable_set') . $name, self::STOP_CRITICAL);
      }
    } catch (Exception $e) {
      $this-&gt;SetError($e-&gt;getMessage());
      if ($e-&gt;getCode() == self::STOP_CRITICAL) {
        return false;
      }
    }
    return true;
  }

  public function SecureHeader($str) {
    $str = str_replace("\\r", '', $str);
    $str = str_replace("\
", '', $str);
    return trim($str);
  }

  public function Sign($cert_filename, $key_filename, $key_pass) {
    $this-&gt;sign_cert_file = $cert_filename;
    $this-&gt;sign_key_file = $key_filename;
    $this-&gt;sign_key_pass = $key_pass;
  }

  public function DKIM_QP($txt) {
    $tmp="";
    $line="";
    for ($i=0;$i&lt;strlen($txt);$i++) {
      $ord=ord($txt[$i]);
      if ( ((0x21 &lt;= $ord) && ($ord &lt;= 0x3A)) || $ord == 0x3C || ((0x3E &lt;= $ord) && ($ord &lt;= 0x7E)) ) {
        $line.=$txt[$i];
      } else {
        $line.="=".sprintf("%02X",$ord);
      }
    }
    return $line;
  }

  public function DKIM_Sign($s) {
    $privKeyStr = file_get_contents($this-&gt;DKIM_private);
    if ($this-&gt;DKIM_passphrase!='') {
      $privKey = openssl_pkey_get_private($privKeyStr,$this-&gt;DKIM_passphrase);
    } else {
      $privKey = $privKeyStr;
    }
    if (openssl_sign($s, $signature, $privKey)) {
      return base64_encode($signature);
    }
  }

  public function DKIM_HeaderC($s) {
    $s=preg_replace("/\\r\
\\s+/"," ",$s);
    $lines=explode("\\r\
",$s);
    foreach ($lines as $key=&gt;$line) {
      list($heading,$value)=explode(":",$line,2);
      $heading=strtolower($heading);
      $value=preg_replace("/\\s+/"," ",$value) ; // Compress useless spaces
      $lines[$key]=$heading.":".trim($value) ; // Don't forget to remove WSP around the value
    }
    $s=implode("\\r\
",$lines);
    return $s;
  }

  public function DKIM_BodyC($body) {
    if ($body == '') return "\\r\
";
    // stabilize line endings
    $body=str_replace("\\r\
","\
",$body);
    $body=str_replace("\
","\\r\
",$body);
    // END stabilize line endings
    while (substr($body,strlen($body)-4,4) == "\\r\
\\r\
") {
      $body=substr($body,0,strlen($body)-2);
    }
    return $body;
  }

  public function DKIM_Add($headers_line,$subject,$body) {
    $DKIMsignatureType    = 'rsa-sha1'; // Signature & hash algorithms
    $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
    $DKIMquery            = 'dns/txt'; // Query method
    $DKIMtime             = time() ; // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
    $subject_header       = "Subject: $subject";
    $headers              = explode("\\r\
",$headers_line);
    foreach($headers as $header) {
      if (strpos($header,'From:') === 0) {
        $from_header=$header;
      } elseif (strpos($header,'To:') === 0) {
        $to_header=$header;
      }
    }
    $from     = str_replace('|','=7C',$this-&gt;DKIM_QP($from_header));
    $to       = str_replace('|','=7C',$this-&gt;DKIM_QP($to_header));
    $subject  = str_replace('|','=7C',$this-&gt;DKIM_QP($subject_header)) ; // Copied header fields (dkim-quoted-printable
    $body     = $this-&gt;DKIM_BodyC($body);
    $DKIMlen  = strlen($body) ; // Length of body
    $DKIMb64  = base64_encode(pack("H*", sha1($body))) ; // Base64 of packed binary SHA-1 hash of body
    $ident    = ($this-&gt;DKIM_identity == '')? '' : " i=" . $this-&gt;DKIM_identity . ";";
    $dkimhdrs = "DKIM-Signature: v=1; a=" . $DKIMsignatureType . "; q=" . $DKIMquery . "; l=" . $DKIMlen . "; s=" . $this-&gt;DKIM_selector . ";\\r\
".
                "\	t=" . $DKIMtime . "; c=" . $DKIMcanonicalization . ";\\r\
".
                "\	h=From:To:Subject;\\r\
".
                "\	d=" . $this-&gt;DKIM_domain . ";" . $ident . "\\r\
".
                "\	z=$from\\r\
".
                "\	|$to\\r\
".
                "\	|$subject;\\r\
".
                "\	bh=" . $DKIMb64 . ";\\r\
".
                "\	b=";
    $toSign   = $this-&gt;DKIM_HeaderC($from_header . "\\r\
" . $to_header . "\\r\
" . $subject_header . "\\r\
" . $dkimhdrs);
    $signed   = $this-&gt;DKIM_Sign($toSign);
    return "X-PHPMAILER-DKIM: phpmailer.worxware.com\\r\
".$dkimhdrs.$signed."\\r\
";
  }

  protected function doCallback($isSent,$to,$cc,$bcc,$subject,$body) {
    if (!empty($this-&gt;action_function) && function_exists($this-&gt;action_function)) {
      $params = array($isSent,$to,$cc,$bcc,$subject,$body);
      call_user_func_array($this-&gt;action_function,$params);
    }
  }
}

class phpmailerException extends Exception {
  public function errorMessage() {
    $errorMsg = '&lt;strong&gt;' . $this-&gt;getMessage() . "&lt;/strong&gt;&lt;br /&gt;\
";
    return $errorMsg;
  }
}
?&gt;