<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[39725] branches/4.3: Mail: Upgrade PHPMailer to 5.2.21.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/39725">39725</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/39725","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>dd32</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2017-01-06 05:42:02 +0000 (Fri, 06 Jan 2017)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Mail: Upgrade PHPMailer to 5.2.21.

Merges <a href="https://core.trac.wordpress.org/changeset/39645">[39645]</a>, <a href="https://core.trac.wordpress.org/changeset/36083">[36083]</a> to the 4.3 branch.
See <a href="https://core.trac.wordpress.org/ticket/37210">#37210</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branches43srcwpincludesclassphpmailerphp">branches/4.3/src/wp-includes/class-phpmailer.php</a></li>
<li><a href="#branches43srcwpincludesclasssmtpphp">branches/4.3/src/wp-includes/class-smtp.php</a></li>
</ul>

<h3>Property Changed</h3>
<ul>
<li><a href="#branches43">branches/4.3/</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<span class="cx" style="display: block; padding: 0 10px">Index: branches/4.3
</span><span class="cx" style="display: block; padding: 0 10px">===================================================================
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">--- branches/4.3 2017-01-06 05:37:55 UTC (rev 39724)
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+++ branches/4.3  2017-01-06 05:42:02 UTC (rev 39725)
</ins><a id="branches43"></a>
<div class="propset"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Property changes: branches/4.3</h4>
<pre class="diff"><span>
</span></pre></div>
<a id="svnmergeinfo"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: svn:mergeinfo</h4></div>
<span class="cx" style="display: block; padding: 0 10px"> /branches/3.3:20543
</span><span class="cx" style="display: block; padding: 0 10px"> /branches/3.4:21757
</span><span class="cx" style="display: block; padding: 0 10px"> /branches/4.6:38615
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-/trunk:18512,33646,33681,33688,33693,33710,33716,33727,33766,34094,34179,34219,34278,34788,34829,34834,36435,37124,37651,38524,39659
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+/trunk:18512,33646,33681,33688,33693,33710,33716,33727,33766,34094,34179,34219,34278,34788,34829,34834,36083,36435,37124,37651,38524,39645,39659
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="branches43srcwpincludesclassphpmailerphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: branches/4.3/src/wp-includes/class-phpmailer.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- branches/4.3/src/wp-includes/class-phpmailer.php  2017-01-06 05:37:55 UTC (rev 39724)
+++ branches/4.3/src/wp-includes/class-phpmailer.php    2017-01-06 05:42:02 UTC (rev 39725)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -29,65 +29,66 @@
</span><span class="cx" style="display: block; padding: 0 10px"> {
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The PHPMailer Version number.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    public $Version = '5.2.10';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    public $Version = '5.2.21';
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Email priority.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * Options: 1 = High, 3 = Normal, 5 = low.
-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
+     * When null, the header is not set at all.
+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    public $Priority = 3;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    public $Priority = null;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The character set of the message.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $CharSet = 'iso-8859-1';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The MIME Content-type of the message.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $ContentType = 'text/plain';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The message encoding.
</span><span class="cx" style="display: block; padding: 0 10px">      * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Encoding = '8bit';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Holds the most recent mailer error message.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $ErrorInfo = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The From email address for the message.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $From = 'root@localhost';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The From name of the message.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $FromName = 'Root User';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The Sender email (Return-Path) of the message.
</span><span class="cx" style="display: block; padding: 0 10px">      * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Sender = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The Return-Path of the message.
</span><span class="cx" style="display: block; padding: 0 10px">      * If empty, it will be set to either From or Sender.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @deprecated Email senders should never set a return-path header;
</span><span class="cx" style="display: block; padding: 0 10px">      * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
</span><span class="cx" style="display: block; padding: 0 10px">      * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -96,14 +97,14 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The Subject of the message.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Subject = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * An HTML or plain text message body.
</span><span class="cx" style="display: block; padding: 0 10px">      * If HTML then call isHTML(true).
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Body = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -112,7 +113,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * This body can be read by mail clients that do not have HTML email
</span><span class="cx" style="display: block; padding: 0 10px">      * capability such as mutt & Eudora.
</span><span class="cx" style="display: block; padding: 0 10px">      * Clients that can read HTML will view the normal Body.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $AltBody = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -122,27 +123,27 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
</span><span class="cx" style="display: block; padding: 0 10px">      * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
</span><span class="cx" style="display: block; padding: 0 10px">      * @link http://kigkonsult.se/iCalcreator/
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Ical = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The complete compiled MIME message body.
</span><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $MIMEBody = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The complete compiled MIME message headers.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $MIMEHeader = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Extra headers that createHeader() doesn't fold in.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $mailHeader = '';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -150,64 +151,67 @@
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Word-wrap the message body to this number of chars.
</span><span class="cx" style="display: block; padding: 0 10px">      * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $WordWrap = 0;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Which method to use to send mail.
</span><span class="cx" style="display: block; padding: 0 10px">      * Options: "mail", "sendmail", or "smtp".
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Mailer = 'mail';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The path to the sendmail program.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Sendmail = '/usr/sbin/sendmail';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Whether mail() uses a fully sendmail-compatible MTA.
</span><span class="cx" style="display: block; padding: 0 10px">      * One which supports sendmail's "-oi -f" options.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type boolean
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var boolean
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $UseSendmailOptions = true;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Path to PHPMailer plugins.
</span><span class="cx" style="display: block; padding: 0 10px">      * Useful if the SMTP class is not in the PHP include path.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @deprecated Should not be needed now there is an autoloader.
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $PluginDir = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * The email address that a reading confirmation should be sent to.
-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * The email address that a reading confirmation should be sent to, also known as read receipt.
+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $ConfirmReadingTo = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * The hostname to use in Message-Id and Received headers
-     * and as default HELO string.
-     * If empty, the value returned
-     * by SERVER_NAME is used or 'localhost.localdomain'.
-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * The hostname to use in the Message-ID header and as default HELO string.
+     * If empty, PHPMailer attempts to find one with, in order,
+     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
+     * 'localhost.localdomain'.
+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Hostname = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * An ID to be used in the Message-Id header.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * An ID to be used in the Message-ID header.
</ins><span class="cx" style="display: block; padding: 0 10px">      * If empty, a unique id will be generated.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * You can set your own, but it must be in the format "<id@domain>",
+     * as defined in RFC5322 section 3.6.4 or it will be ignored.
+     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $MessageID = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The message Date to be used in the Date header.
</span><span class="cx" style="display: block; padding: 0 10px">      * If empty, the current date will be added.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $MessageDate = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -220,21 +224,22 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * You can also specify encryption type, for example:
</span><span class="cx" style="display: block; padding: 0 10px">      * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
</span><span class="cx" style="display: block; padding: 0 10px">      * Hosts will be tried in order.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Host = 'localhost';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The default SMTP server port.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      * @TODO Why is this needed when the SMTP class takes care of it?
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Port = 25;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The SMTP HELO of the message.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * Default is $Hostname.
-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
+     * one with the same method described above for $Hostname.
+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @see PHPMailer::$Hostname
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Helo = '';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -242,7 +247,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * What kind of encryption to use on the SMTP connection.
</span><span class="cx" style="display: block; padding: 0 10px">      * Options: '', 'ssl' or 'tls'
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $SMTPSecure = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -250,14 +255,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * Whether to enable TLS encryption automatically if a server supports it,
</span><span class="cx" style="display: block; padding: 0 10px">      * even if `SMTPSecure` is not set to 'tls'.
</span><span class="cx" style="display: block; padding: 0 10px">      * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type boolean
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var boolean
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $SMTPAutoTLS = true;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Whether to use SMTP authentication.
</span><span class="cx" style="display: block; padding: 0 10px">      * Uses the Username and Password properties.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type boolean
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var boolean
</ins><span class="cx" style="display: block; padding: 0 10px">      * @see PHPMailer::$Username
</span><span class="cx" style="display: block; padding: 0 10px">      * @see PHPMailer::$Password
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -265,47 +270,47 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Options array passed to stream_context_create when connecting via SMTP.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var array
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $SMTPOptions = array();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * SMTP username.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Username = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * SMTP password.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Password = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * SMTP auth type.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5
-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Options are CRAM-MD5, LOGIN, PLAIN, attempted in that order if not specified
+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $AuthType = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * SMTP realm.
</span><span class="cx" style="display: block; padding: 0 10px">      * Used for NTLM auth
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Realm = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * SMTP workstation.
</span><span class="cx" style="display: block; padding: 0 10px">      * Used for NTLM auth
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Workstation = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The SMTP server timeout in seconds.
</span><span class="cx" style="display: block; padding: 0 10px">      * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Timeout = 300;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -318,7 +323,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * * `2` Data and commands
</span><span class="cx" style="display: block; padding: 0 10px">      * * `3` As 2 plus connection status
</span><span class="cx" style="display: block; padding: 0 10px">      * * `4` Low-level data output
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      * @see SMTP::$do_debug
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $SMTPDebug = 0;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -334,7 +339,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * <code>
</span><span class="cx" style="display: block; padding: 0 10px">      * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
</span><span class="cx" style="display: block; padding: 0 10px">      * </code>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string|callable
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string|callable
</ins><span class="cx" style="display: block; padding: 0 10px">      * @see SMTP::$Debugoutput
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Debugoutput = 'echo';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -343,20 +348,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * Whether to keep SMTP connection open after each message.
</span><span class="cx" style="display: block; padding: 0 10px">      * If this is set to true then to close the connection
</span><span class="cx" style="display: block; padding: 0 10px">      * requires an explicit call to smtpClose().
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type boolean
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var boolean
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $SMTPKeepAlive = false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Whether to split multiple to addresses into multiple messages
</span><span class="cx" style="display: block; padding: 0 10px">      * or send them all in one message.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type boolean
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Only supported in `mail` and `sendmail` transports, not in SMTP.
+     * @var boolean
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $SingleTo = false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Storage for addresses when SingleTo is enabled.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var array
</ins><span class="cx" style="display: block; padding: 0 10px">      * @TODO This should really not be public
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $SingleToArray = array();
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -364,15 +370,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Whether to generate VERP addresses on send.
</span><span class="cx" style="display: block; padding: 0 10px">      * Only applicable when sending via SMTP.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
</ins><span class="cx" style="display: block; padding: 0 10px">      * @link http://www.postfix.org/VERP_README.html Postfix VERP info
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type boolean
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var boolean
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $do_verp = false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Whether to allow sending messages with an empty body.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type boolean
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var boolean
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $AllowEmpty = false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -380,44 +386,51 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * The default line ending.
</span><span class="cx" style="display: block; padding: 0 10px">      * @note The default remains "\n". We force CRLF where we know
</span><span class="cx" style="display: block; padding: 0 10px">      *        it must be used via self::CRLF.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $LE = "\n";
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * DKIM selector.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $DKIM_selector = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * DKIM Identity.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * Usually the email address used as the source of the email
-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Usually the email address used as the source of the email.
+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $DKIM_identity = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * DKIM passphrase.
</span><span class="cx" style="display: block; padding: 0 10px">      * Used if your key is encrypted.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $DKIM_passphrase = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * DKIM signing domain name.
</span><span class="cx" style="display: block; padding: 0 10px">      * @example 'example.com'
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $DKIM_domain = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * DKIM private key file path.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $DKIM_private = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * DKIM private key string.
+     * If set, takes precedence over `$DKIM_private`.
+     * @var string
+     */
+    public $DKIM_private_string = '';
+
+    /**
</ins><span class="cx" style="display: block; padding: 0 10px">      * Callback Action function name.
</span><span class="cx" style="display: block; padding: 0 10px">      *
</span><span class="cx" style="display: block; padding: 0 10px">      * The function that handles the result of the send email action.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -433,48 +446,57 @@
</span><span class="cx" style="display: block; padding: 0 10px">      *   string  $subject       the subject
</span><span class="cx" style="display: block; padding: 0 10px">      *   string  $body          the email body
</span><span class="cx" style="display: block; padding: 0 10px">      *   string  $from          email address of sender
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $action_function = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * What to put in the X-Mailer header.
</span><span class="cx" style="display: block; padding: 0 10px">      * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $XMailer = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Which validator to use by default when validating email addresses.
+     * May be a callable to inject your own validator, but there are several built-in validators.
+     * @see PHPMailer::validateAddress()
+     * @var string|callable
+     * @static
+     */
+    public static $validator = 'auto';
+
+    /**
</ins><span class="cx" style="display: block; padding: 0 10px">      * An instance of the SMTP sender class.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type SMTP
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var SMTP
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $smtp = null;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * The array of 'to' addresses.
-     * @type array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * The array of 'to' names and addresses.
+     * @var array
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $to = array();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * The array of 'cc' addresses.
-     * @type array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * The array of 'cc' names and addresses.
+     * @var array
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $cc = array();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * The array of 'bcc' addresses.
-     * @type array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * The array of 'bcc' names and addresses.
+     * @var array
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $bcc = array();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The array of reply-to names and addresses.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var array
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $ReplyTo = array();
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -482,77 +504,100 @@
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * An array of all kinds of addresses.
</span><span class="cx" style="display: block; padding: 0 10px">      * Includes all of $to, $cc, $bcc
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var array
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $all_recipients = array();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * An array of names and addresses queued for validation.
+     * In send(), valid and non duplicate entries are moved to $all_recipients
+     * and one of $to, $cc, or $bcc.
+     * This array is used only for addresses with IDN.
+     * @var array
+     * @access protected
+     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
+     * @see PHPMailer::$all_recipients
+     */
+    protected $RecipientsQueue = array();
+
+    /**
+     * An array of reply-to names and addresses queued for validation.
+     * In send(), valid and non duplicate entries are moved to $ReplyTo.
+     * This array is used only for addresses with IDN.
+     * @var array
+     * @access protected
+     * @see PHPMailer::$ReplyTo
+     */
+    protected $ReplyToQueue = array();
+
+    /**
</ins><span class="cx" style="display: block; padding: 0 10px">      * The array of attachments.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var array
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $attachment = array();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The array of custom headers.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var array
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $CustomHeader = array();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The most recent Message-ID (including angular brackets).
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $lastMessageID = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The message's MIME type.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $message_type = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The array of MIME boundary strings.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var array
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $boundary = array();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The array of available languages.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var array
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $language = array();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The number of errors encountered.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $error_count = 0;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The S/MIME certificate file path.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $sign_cert_file = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The S/MIME key file path.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $sign_key_file = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The optional S/MIME extra certificates ("CA Chain") file path.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $sign_extracerts_file = '';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -560,21 +605,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The S/MIME password for the key.
</span><span class="cx" style="display: block; padding: 0 10px">      * Used only if the key is encrypted.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $sign_key_pass = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Whether to throw exceptions for errors.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type boolean
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var boolean
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $exceptions = false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Unique ID used for message ID and boundaries.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $uniqueid = '';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -601,7 +646,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The maximum line length allowed by RFC 2822 section 2.1.1
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     const MAX_LINE_LENGTH = 998;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -609,9 +654,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * Constructor.
</span><span class="cx" style="display: block; padding: 0 10px">      * @param boolean $exceptions Should we throw external exceptions?
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    public function __construct($exceptions = false)
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    public function __construct($exceptions = null)
</ins><span class="cx" style="display: block; padding: 0 10px">     {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $this->exceptions = (boolean)$exceptions;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if ($exceptions !== null) {
+            $this->exceptions = (boolean)$exceptions;
+        }
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -620,9 +667,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">     public function __destruct()
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><span class="cx" style="display: block; padding: 0 10px">         //Close any open SMTP connection nicely
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ($this->Mailer == 'smtp') {
-            $this->smtpClose();
-        }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $this->smtpClose();
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -646,14 +691,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">         } else {
</span><span class="cx" style="display: block; padding: 0 10px">             $subject = $this->encodeHeader($this->secureHeader($subject));
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
+        //@link http://php.net/manual/en/function.mail.php
+        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
</ins><span class="cx" style="display: block; padding: 0 10px">             $result = @mail($to, $subject, $body, $header);
</span><span class="cx" style="display: block; padding: 0 10px">         } else {
</span><span class="cx" style="display: block; padding: 0 10px">             $result = @mail($to, $subject, $body, $header, $params);
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         return $result;
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-
</del><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Output debugging info via user-defined method.
</span><span class="cx" style="display: block; padding: 0 10px">      * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -688,7 +735,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">             case 'echo':
</span><span class="cx" style="display: block; padding: 0 10px">             default:
</span><span class="cx" style="display: block; padding: 0 10px">                 //Normalize line breaks
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $str = preg_replace('/\r\n?/ms', "\n", $str);
</ins><span class="cx" style="display: block; padding: 0 10px">                 echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
</span><span class="cx" style="display: block; padding: 0 10px">                     "\n",
</span><span class="cx" style="display: block; padding: 0 10px">                     "\n                   \t                  ",
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -763,82 +810,128 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Add a "To" address.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @param string $address
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @param string $address The email address to send to
</ins><span class="cx" style="display: block; padding: 0 10px">      * @param string $name
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @return boolean true on success, false if address already used
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @return boolean true on success, false if address already used or invalid in some way
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public function addAddress($address, $name = '')
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        return $this->addAnAddress('to', $address, $name);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        return $this->addOrEnqueueAnAddress('to', $address, $name);
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Add a "CC" address.
</span><span class="cx" style="display: block; padding: 0 10px">      * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @param string $address
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @param string $address The email address to send to
</ins><span class="cx" style="display: block; padding: 0 10px">      * @param string $name
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @return boolean true on success, false if address already used
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @return boolean true on success, false if address already used or invalid in some way
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public function addCC($address, $name = '')
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        return $this->addAnAddress('cc', $address, $name);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        return $this->addOrEnqueueAnAddress('cc', $address, $name);
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Add a "BCC" address.
</span><span class="cx" style="display: block; padding: 0 10px">      * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @param string $address
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @param string $address The email address to send to
</ins><span class="cx" style="display: block; padding: 0 10px">      * @param string $name
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @return boolean true on success, false if address already used
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @return boolean true on success, false if address already used or invalid in some way
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public function addBCC($address, $name = '')
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        return $this->addAnAddress('bcc', $address, $name);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * Add a "Reply-to" address.
-     * @param string $address
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Add a "Reply-To" address.
+     * @param string $address The email address to reply to
</ins><span class="cx" style="display: block; padding: 0 10px">      * @param string $name
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @return boolean
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @return boolean true on success, false if address already used or invalid in some way
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public function addReplyTo($address, $name = '')
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        return $this->addAnAddress('Reply-To', $address, $name);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * Add an address to one of the recipient arrays.
-     * Addresses that have been added already return false, but do not throw exceptions
-     * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'
-     * @param string $address The email address to send to
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
+     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
+     * be modified after calling this function), addition of such addresses is delayed until send().
+     * Addresses that have been added already return false, but do not throw exceptions.
+     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
+     * @param string $address The email address to send, resp. to reply to
</ins><span class="cx" style="display: block; padding: 0 10px">      * @param string $name
</span><span class="cx" style="display: block; padding: 0 10px">      * @throws phpmailerException
</span><span class="cx" style="display: block; padding: 0 10px">      * @return boolean true on success, false if address already used or invalid in some way
</span><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    protected function addOrEnqueueAnAddress($kind, $address, $name)
+    {
+        $address = trim($address);
+        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
+        if (($pos = strrpos($address, '@')) === false) {
+            // At-sign is misssing.
+            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
+            $this->setError($error_message);
+            $this->edebug($error_message);
+            if ($this->exceptions) {
+                throw new phpmailerException($error_message);
+            }
+            return false;
+        }
+        $params = array($kind, $address, $name);
+        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
+        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
+            if ($kind != 'Reply-To') {
+                if (!array_key_exists($address, $this->RecipientsQueue)) {
+                    $this->RecipientsQueue[$address] = $params;
+                    return true;
+                }
+            } else {
+                if (!array_key_exists($address, $this->ReplyToQueue)) {
+                    $this->ReplyToQueue[$address] = $params;
+                    return true;
+                }
+            }
+            return false;
+        }
+        // Immediately add standard addresses without IDN.
+        return call_user_func_array(array($this, 'addAnAddress'), $params);
+    }
+
+    /**
+     * Add an address to one of the recipient arrays or to the ReplyTo array.
+     * Addresses that have been added already return false, but do not throw exceptions.
+     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
+     * @param string $address The email address to send, resp. to reply to
+     * @param string $name
+     * @throws phpmailerException
+     * @return boolean true on success, false if address already used or invalid in some way
+     * @access protected
+     */
</ins><span class="cx" style="display: block; padding: 0 10px">     protected function addAnAddress($kind, $address, $name = '')
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) {
-            $this->setError($this->lang('Invalid recipient array') . ': ' . $kind);
-            $this->edebug($this->lang('Invalid recipient array') . ': ' . $kind);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
+            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
+            $this->setError($error_message);
+            $this->edebug($error_message);
</ins><span class="cx" style="display: block; padding: 0 10px">             if ($this->exceptions) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                throw new phpmailerException('Invalid recipient array: ' . $kind);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                throw new phpmailerException($error_message);
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">             return false;
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $address = trim($address);
-        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
</del><span class="cx" style="display: block; padding: 0 10px">         if (!$this->validateAddress($address)) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            $this->setError($this->lang('invalid_address') . ': ' . $address);
-            $this->edebug($this->lang('invalid_address') . ': ' . $address);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
+            $this->setError($error_message);
+            $this->edebug($error_message);
</ins><span class="cx" style="display: block; padding: 0 10px">             if ($this->exceptions) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                throw new phpmailerException($this->lang('invalid_address') . ': ' . $address);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                throw new phpmailerException($error_message);
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">             return false;
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         if ($kind != 'Reply-To') {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            if (!isset($this->all_recipients[strtolower($address)])) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 array_push($this->$kind, array($address, $name));
</span><span class="cx" style="display: block; padding: 0 10px">                 $this->all_recipients[strtolower($address)] = true;
</span><span class="cx" style="display: block; padding: 0 10px">                 return true;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -853,6 +946,61 @@
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
+     * of the form "display name <address>" into an array of name/address pairs.
+     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
+     * Note that quotes in the name part are removed.
+     * @param string $addrstr The address list string
+     * @param bool $useimap Whether to use the IMAP extension to parse the list
+     * @return array
+     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
+     */
+    public function parseAddresses($addrstr, $useimap = true)
+    {
+        $addresses = array();
+        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
+            //Use this built-in parser if it's available
+            $list = imap_rfc822_parse_adrlist($addrstr, '');
+            foreach ($list as $address) {
+                if ($address->host != '.SYNTAX-ERROR.') {
+                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
+                        $addresses[] = array(
+                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
+                            'address' => $address->mailbox . '@' . $address->host
+                        );
+                    }
+                }
+            }
+        } else {
+            //Use this simpler parser
+            $list = explode(',', $addrstr);
+            foreach ($list as $address) {
+                $address = trim($address);
+                //Is there a separate name part?
+                if (strpos($address, '<') === false) {
+                    //No separate name, just use the whole thing
+                    if ($this->validateAddress($address)) {
+                        $addresses[] = array(
+                            'name' => '',
+                            'address' => $address
+                        );
+                    }
+                } else {
+                    list($name, $email) = explode('<', $address);
+                    $email = trim(str_replace('>', '', $email));
+                    if ($this->validateAddress($email)) {
+                        $addresses[] = array(
+                            'name' => trim(str_replace(array('"', "'"), '', $name)),
+                            'address' => $email
+                        );
+                    }
+                }
+            }
+        }
+        return $addresses;
+    }
+
+    /**
</ins><span class="cx" style="display: block; padding: 0 10px">      * Set the From and FromName properties.
</span><span class="cx" style="display: block; padding: 0 10px">      * @param string $address
</span><span class="cx" style="display: block; padding: 0 10px">      * @param string $name
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -864,11 +1012,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><span class="cx" style="display: block; padding: 0 10px">         $address = trim($address);
</span><span class="cx" style="display: block; padding: 0 10px">         $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if (!$this->validateAddress($address)) {
-            $this->setError($this->lang('invalid_address') . ': ' . $address);
-            $this->edebug($this->lang('invalid_address') . ': ' . $address);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        // Don't validate now addresses with IDN. Will be done in send().
+        if (($pos = strrpos($address, '@')) === false or
+            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
+            !$this->validateAddress($address)) {
+            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
+            $this->setError($error_message);
+            $this->edebug($error_message);
</ins><span class="cx" style="display: block; padding: 0 10px">             if ($this->exceptions) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                throw new phpmailerException($this->lang('invalid_address') . ': ' . $address);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                throw new phpmailerException($error_message);
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">             return false;
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -897,19 +1049,34 @@
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Check that a string looks like an email address.
</span><span class="cx" style="display: block; padding: 0 10px">      * @param string $address The email address to check
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @param string $patternselect A selector for the validation pattern to use :
-     * * `auto` Pick strictest one automatically;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @param string|callable $patternselect A selector for the validation pattern to use :
+     * * `auto` Pick best pattern automatically;
</ins><span class="cx" style="display: block; padding: 0 10px">      * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
</span><span class="cx" style="display: block; padding: 0 10px">      * * `pcre` Use old PCRE implementation;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; same as pcre8 but does not allow 'dotless' domains;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
</ins><span class="cx" style="display: block; padding: 0 10px">      * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
</span><span class="cx" style="display: block; padding: 0 10px">      * * `noregex` Don't use a regex: super fast, really dumb.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Alternatively you may pass in a callable to inject your own validator, for example:
+     * PHPMailer::validateAddress('user@example.com', function($address) {
+     *     return (strpos($address, '@') !== false);
+     * });
+     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
</ins><span class="cx" style="display: block; padding: 0 10px">      * @return boolean
</span><span class="cx" style="display: block; padding: 0 10px">      * @static
</span><span class="cx" style="display: block; padding: 0 10px">      * @access public
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    public static function validateAddress($address, $patternselect = 'auto')
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    public static function validateAddress($address, $patternselect = null)
</ins><span class="cx" style="display: block; padding: 0 10px">     {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if (is_null($patternselect)) {
+            $patternselect = self::$validator;
+        }
+        if (is_callable($patternselect)) {
+            return call_user_func($patternselect, $address);
+        }
+        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
+        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
+            return false;
+        }
</ins><span class="cx" style="display: block; padding: 0 10px">         if (!$patternselect or $patternselect == 'auto') {
</span><span class="cx" style="display: block; padding: 0 10px">             //Check this constant first so it works when extension_loaded() is disabled by safe mode
</span><span class="cx" style="display: block; padding: 0 10px">             //Constant was added in PHP 5.2.4
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -990,6 +1157,48 @@
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
+     * "intl" and "mbstring" PHP extensions.
+     * @return bool "true" if required functions for IDN support are present
+     */
+    public function idnSupported()
+    {
+        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
+        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
+    }
+
+    /**
+     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
+     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
+     * This function silently returns unmodified address if:
+     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
+     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
+     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
+     * @see PHPMailer::$CharSet
+     * @param string $address The email address to convert
+     * @return string The encoded address in ASCII form
+     */
+    public function punyencodeAddress($address)
+    {
+        // Verify we have required functions, CharSet, and at-sign.
+        if ($this->idnSupported() and
+            !empty($this->CharSet) and
+            ($pos = strrpos($address, '@')) !== false) {
+            $domain = substr($address, ++$pos);
+            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
+            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
+                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
+                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
+                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
+                    idn_to_ascii($domain)) !== false) {
+                    return substr($address, 0, $pos) . $punycode;
+                }
+            }
+        }
+        return $address;
+    }
+
+    /**
</ins><span class="cx" style="display: block; padding: 0 10px">      * Create a message and send it.
</span><span class="cx" style="display: block; padding: 0 10px">      * Uses the sending method specified by $Mailer.
</span><span class="cx" style="display: block; padding: 0 10px">      * @throws phpmailerException
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1020,17 +1229,41 @@
</span><span class="cx" style="display: block; padding: 0 10px">     public function preSend()
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><span class="cx" style="display: block; padding: 0 10px">         try {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            $this->error_count = 0; // Reset errors
</ins><span class="cx" style="display: block; padding: 0 10px">             $this->mailHeader = '';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+            // Dequeue recipient and Reply-To addresses with IDN
+            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
+                $params[1] = $this->punyencodeAddress($params[1]);
+                call_user_func_array(array($this, 'addAnAddress'), $params);
+            }
</ins><span class="cx" style="display: block; padding: 0 10px">             if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
</span><span class="cx" style="display: block; padding: 0 10px">                 throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
</span><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            // Validate From, Sender, and ConfirmReadingTo addresses
+            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
+                $this->$address_kind = trim($this->$address_kind);
+                if (empty($this->$address_kind)) {
+                    continue;
+                }
+                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
+                if (!$this->validateAddress($this->$address_kind)) {
+                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
+                    $this->setError($error_message);
+                    $this->edebug($error_message);
+                    if ($this->exceptions) {
+                        throw new phpmailerException($error_message);
+                    }
+                    return false;
+                }
+            }
+
</ins><span class="cx" style="display: block; padding: 0 10px">             // Set whether the message is multipart/alternative
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            if (!empty($this->AltBody)) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            if ($this->alternativeExists()) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->ContentType = 'multipart/alternative';
</span><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            $this->error_count = 0; // Reset errors
</del><span class="cx" style="display: block; padding: 0 10px">             $this->setMessageType();
</span><span class="cx" style="display: block; padding: 0 10px">             // Refuse to send an empty message unless we are specifically allowing it
</span><span class="cx" style="display: block; padding: 0 10px">             if (!$this->AllowEmpty and empty($this->Body)) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1061,9 +1294,11 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">             // Sign with DKIM if enabled
</span><span class="cx" style="display: block; padding: 0 10px">             if (!empty($this->DKIM_domain)
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                && !empty($this->DKIM_private)
</del><span class="cx" style="display: block; padding: 0 10px">                 && !empty($this->DKIM_selector)
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                && file_exists($this->DKIM_private)) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                && (!empty($this->DKIM_private_string)
+                   || (!empty($this->DKIM_private) && file_exists($this->DKIM_private))
+                )
+            ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $header_dkim = $this->DKIM_Add(
</span><span class="cx" style="display: block; padding: 0 10px">                     $this->MIMEHeader . $this->mailHeader,
</span><span class="cx" style="display: block; padding: 0 10px">                     $this->encodeHeader($this->secureHeader($this->Subject)),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1129,19 +1364,24 @@
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected function sendmailSend($header, $body)
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ($this->Sender != '') {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
+        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
</ins><span class="cx" style="display: block; padding: 0 10px">             if ($this->Mailer == 'qmail') {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $sendmail = sprintf('%s -f%s', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $sendmailFmt = '%s -f%s';
</ins><span class="cx" style="display: block; padding: 0 10px">             } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $sendmail = sprintf('%s -oi -f%s -t', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $sendmailFmt = '%s -oi -f%s -t';
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">         } else {
</span><span class="cx" style="display: block; padding: 0 10px">             if ($this->Mailer == 'qmail') {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $sendmail = sprintf('%s', escapeshellcmd($this->Sendmail));
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $sendmailFmt = '%s';
</ins><span class="cx" style="display: block; padding: 0 10px">             } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $sendmail = sprintf('%s -oi -t', escapeshellcmd($this->Sendmail));
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $sendmailFmt = '%s -oi -t';
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.
+        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);
+
</ins><span class="cx" style="display: block; padding: 0 10px">         if ($this->SingleTo) {
</span><span class="cx" style="display: block; padding: 0 10px">             foreach ($this->SingleToArray as $toAddr) {
</span><span class="cx" style="display: block; padding: 0 10px">                 if (!@$mail = popen($sendmail, 'w')) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1171,7 +1411,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">             fputs($mail, $header);
</span><span class="cx" style="display: block; padding: 0 10px">             fputs($mail, $body);
</span><span class="cx" style="display: block; padding: 0 10px">             $result = pclose($mail);
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            $this->doCallback(($result == 0), $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            $this->doCallback(
+                ($result == 0),
+                $this->to,
+                $this->cc,
+                $this->bcc,
+                $this->Subject,
+                $body,
+                $this->From
+            );
</ins><span class="cx" style="display: block; padding: 0 10px">             if ($result != 0) {
</span><span class="cx" style="display: block; padding: 0 10px">                 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
</span><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1180,6 +1428,40 @@
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.
+     *
+     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.
+     * @param string $string The string to be validated
+     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report
+     * @access protected
+     * @return boolean
+     */
+    protected static function isShellSafe($string)
+    {
+        // Future-proof
+        if (escapeshellcmd($string) !== $string
+            or !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))
+        ) {
+            return false;
+        }
+
+        $length = strlen($string);
+
+        for ($i = 0; $i < $length; $i++) {
+            $c = $string[$i];
+
+            // All other characters have a special meaning in at least one common shell, including = and +.
+            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.
+            // Note that this does permit non-Latin alphanumeric characters based on the current locale.
+            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
</ins><span class="cx" style="display: block; padding: 0 10px">      * Send mail using the PHP mail() function.
</span><span class="cx" style="display: block; padding: 0 10px">      * @param string $header The message headers
</span><span class="cx" style="display: block; padding: 0 10px">      * @param string $body The message body
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1196,17 +1478,20 @@
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         $to = implode(', ', $toArr);
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if (empty($this->Sender)) {
-            $params = ' ';
-        } else {
-            $params = sprintf('-f%s', $this->Sender);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $params = null;
+        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
+        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
+            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
+            if (self::isShellSafe($this->Sender)) {
+                $params = sprintf('-f%s', $this->Sender);
+            }
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ($this->Sender != '' and !ini_get('safe_mode')) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
</ins><span class="cx" style="display: block; padding: 0 10px">             $old_from = ini_get('sendmail_from');
</span><span class="cx" style="display: block; padding: 0 10px">             ini_set('sendmail_from', $this->Sender);
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         $result = false;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ($this->SingleTo && count($toArr) > 1) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if ($this->SingleTo and count($toArr) > 1) {
</ins><span class="cx" style="display: block; padding: 0 10px">             foreach ($toArr as $toAddr) {
</span><span class="cx" style="display: block; padding: 0 10px">                 $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
</span><span class="cx" style="display: block; padding: 0 10px">                 $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1256,10 +1541,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">         if (!$this->smtpConnect($this->SMTPOptions)) {
</span><span class="cx" style="display: block; padding: 0 10px">             throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ('' == $this->Sender) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
+            $smtp_from = $this->Sender;
+        } else {
</ins><span class="cx" style="display: block; padding: 0 10px">             $smtp_from = $this->From;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        } else {
-            $smtp_from = $this->Sender;
</del><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         if (!$this->smtp->mail($smtp_from)) {
</span><span class="cx" style="display: block; padding: 0 10px">             $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1313,12 +1598,17 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * @throws phpmailerException
</span><span class="cx" style="display: block; padding: 0 10px">      * @return boolean
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    public function smtpConnect($options = array())
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    public function smtpConnect($options = null)
</ins><span class="cx" style="display: block; padding: 0 10px">     {
</span><span class="cx" style="display: block; padding: 0 10px">         if (is_null($this->smtp)) {
</span><span class="cx" style="display: block; padding: 0 10px">             $this->smtp = $this->getSMTPInstance();
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        //If no options are provided, use whatever is set in the instance
+        if (is_null($options)) {
+            $options = $this->SMTPOptions;
+        }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         // Already connected?
</span><span class="cx" style="display: block; padding: 0 10px">         if ($this->smtp->connected()) {
</span><span class="cx" style="display: block; padding: 0 10px">             return true;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1388,7 +1678,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                         if (!$this->smtp->startTLS()) {
</span><span class="cx" style="display: block; padding: 0 10px">                             throw new phpmailerException($this->lang('connect_host'));
</span><span class="cx" style="display: block; padding: 0 10px">                         }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        // We must resend HELO after tls negotiation
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        // We must resend EHLO after TLS negotiation
</ins><span class="cx" style="display: block; padding: 0 10px">                         $this->smtp->hello($hello);
</span><span class="cx" style="display: block; padding: 0 10px">                     }
</span><span class="cx" style="display: block; padding: 0 10px">                     if ($this->SMTPAuth) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1427,7 +1717,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public function smtpClose()
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ($this->smtp !== null) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if (is_a($this->smtp, 'SMTP')) {
</ins><span class="cx" style="display: block; padding: 0 10px">             if ($this->smtp->connected()) {
</span><span class="cx" style="display: block; padding: 0 10px">                 $this->smtp->quit();
</span><span class="cx" style="display: block; padding: 0 10px">                 $this->smtp->close();
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1446,6 +1736,19 @@
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public function setLanguage($langcode = 'en', $lang_path = '')
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        // Backwards compatibility for renamed language codes
+        $renamed_langcodes = array(
+            'br' => 'pt_br',
+            'cz' => 'cs',
+            'dk' => 'da',
+            'no' => 'nb',
+            'se' => 'sv',
+        );
+
+        if (isset($renamed_langcodes[$langcode])) {
+            $langcode = $renamed_langcodes[$langcode];
+        }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         // Define full set of translatable strings in English
</span><span class="cx" style="display: block; padding: 0 10px">         $PHPMAILER_LANG = array(
</span><span class="cx" style="display: block; padding: 0 10px">             'authenticate' => 'SMTP Error: Could not authenticate.',
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1458,7 +1761,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">             'file_open' => 'File Error: Could not open file: ',
</span><span class="cx" style="display: block; padding: 0 10px">             'from_failed' => 'The following From address failed: ',
</span><span class="cx" style="display: block; padding: 0 10px">             'instantiate' => 'Could not instantiate mail function.',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            'invalid_address' => 'Invalid address',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            'invalid_address' => 'Invalid address: ',
</ins><span class="cx" style="display: block; padding: 0 10px">             'mailer_not_supported' => ' mailer is not supported.',
</span><span class="cx" style="display: block; padding: 0 10px">             'provide_address' => 'You must provide at least one recipient email address.',
</span><span class="cx" style="display: block; padding: 0 10px">             'recipients_failed' => 'SMTP Error: The following recipients failed: ',
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1472,6 +1775,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">             // Calculate an absolute path so it can work if CWD is not here
</span><span class="cx" style="display: block; padding: 0 10px">             $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        //Validate $langcode
+        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
+            $langcode = 'en';
+        }
</ins><span class="cx" style="display: block; padding: 0 10px">         $foundlang = true;
</span><span class="cx" style="display: block; padding: 0 10px">         $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
</span><span class="cx" style="display: block; padding: 0 10px">         // There is no English translation file
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1723,7 +2030,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         $result .= $this->headerLine('Date', $this->MessageDate);
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-
</del><span class="cx" style="display: block; padding: 0 10px">         // To be created automatically by mail()
</span><span class="cx" style="display: block; padding: 0 10px">         if ($this->SingleTo) {
</span><span class="cx" style="display: block; padding: 0 10px">             if ($this->Mailer != 'mail') {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1766,17 +2072,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">             $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ($this->MessageID != '') {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
+        // https://tools.ietf.org/html/rfc5322#section-3.6.4
+        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
</ins><span class="cx" style="display: block; padding: 0 10px">             $this->lastMessageID = $this->MessageID;
</span><span class="cx" style="display: block; padding: 0 10px">         } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->ServerHostname());
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         $result .= $this->headerLine('Message-ID', $this->lastMessageID);
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $result .= $this->headerLine('X-Priority', $this->Priority);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if (!is_null($this->Priority)) {
+            $result .= $this->headerLine('X-Priority', $this->Priority);
+        }
</ins><span class="cx" style="display: block; padding: 0 10px">         if ($this->XMailer == '') {
</span><span class="cx" style="display: block; padding: 0 10px">             $result .= $this->headerLine(
</span><span class="cx" style="display: block; padding: 0 10px">                 'X-Mailer',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer/)'
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
</ins><span class="cx" style="display: block; padding: 0 10px">             );
</span><span class="cx" style="display: block; padding: 0 10px">         } else {
</span><span class="cx" style="display: block; padding: 0 10px">             $myXmailer = trim($this->XMailer);
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1786,7 +2096,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">         if ($this->ConfirmReadingTo != '') {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            $result .= $this->headerLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">         // Add custom headers
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1866,10 +2176,18 @@
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public function getSentMIMEMessage()
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        return $this->MIMEHeader . $this->mailHeader . self::CRLF . $this->MIMEBody;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Create unique ID
+     * @return string
+     */
+    protected function generateId() {
+        return md5(uniqid(time()));
+    }
+
+    /**
</ins><span class="cx" style="display: block; padding: 0 10px">      * Assemble the message body.
</span><span class="cx" style="display: block; padding: 0 10px">      * Returns an empty string on failure.
</span><span class="cx" style="display: block; padding: 0 10px">      * @access public
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1880,7 +2198,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><span class="cx" style="display: block; padding: 0 10px">         $body = '';
</span><span class="cx" style="display: block; padding: 0 10px">         //Create unique IDs and preset boundaries
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $this->uniqueid = md5(uniqid(time()));
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $this->uniqueid = $this->generateId();
</ins><span class="cx" style="display: block; padding: 0 10px">         $this->boundary[1] = 'b1_' . $this->uniqueid;
</span><span class="cx" style="display: block; padding: 0 10px">         $this->boundary[2] = 'b2_' . $this->uniqueid;
</span><span class="cx" style="display: block; padding: 0 10px">         $this->boundary[3] = 'b3_' . $this->uniqueid;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1896,11 +2214,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">         //Can we do a 7-bit downgrade?
</span><span class="cx" style="display: block; padding: 0 10px">         if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
</span><span class="cx" style="display: block; padding: 0 10px">             $bodyEncoding = '7bit';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
</ins><span class="cx" style="display: block; padding: 0 10px">             $bodyCharSet = 'us-ascii';
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        //If lines are too long, change to quoted-printable transfer encoding
-        if (self::hasLineLongerThanMax($this->Body)) {
-            $this->Encoding = 'quoted-printable';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        //If lines are too long, and we're not already using an encoding that will shorten them,
+        //change to quoted-printable transfer encoding for the body part only
+        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
</ins><span class="cx" style="display: block; padding: 0 10px">             $bodyEncoding = 'quoted-printable';
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1909,10 +2228,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">         //Can we do a 7-bit downgrade?
</span><span class="cx" style="display: block; padding: 0 10px">         if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
</span><span class="cx" style="display: block; padding: 0 10px">             $altBodyEncoding = '7bit';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
</ins><span class="cx" style="display: block; padding: 0 10px">             $altBodyCharSet = 'us-ascii';
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        //If lines are too long, change to quoted-printable transfer encoding
-        if (self::hasLineLongerThanMax($this->AltBody)) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        //If lines are too long, and we're not already using an encoding that will shorten them,
+        //change to quoted-printable transfer encoding for the alt body part only
+        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
</ins><span class="cx" style="display: block; padding: 0 10px">             $altBodyEncoding = 'quoted-printable';
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         //Use this as a preamble in all multipart message types
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2015,8 +2336,10 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 $body .= $this->attachAll('attachment', $this->boundary[1]);
</span><span class="cx" style="display: block; padding: 0 10px">                 break;
</span><span class="cx" style="display: block; padding: 0 10px">             default:
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                // catch case 'plain' and case ''
-                $body .= $this->encodeString($this->Body, $bodyEncoding);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
+                //Reset the `Encoding` property in case we changed it for line length reasons
+                $this->Encoding = $bodyEncoding;
+                $body .= $this->encodeString($this->Body, $this->Encoding);
</ins><span class="cx" style="display: block; padding: 0 10px">                 break;
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2122,8 +2445,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Set the message type.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * PHPMailer only supports some preset message types,
-     * not arbitrary MIME structures.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      * @return void
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2141,6 +2463,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         $this->message_type = implode('_', $type);
</span><span class="cx" style="display: block; padding: 0 10px">         if ($this->message_type == '') {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
</ins><span class="cx" style="display: block; padding: 0 10px">             $this->message_type = 'plain';
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2266,18 +2589,27 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 $type = $attachment[4];
</span><span class="cx" style="display: block; padding: 0 10px">                 $disposition = $attachment[6];
</span><span class="cx" style="display: block; padding: 0 10px">                 $cid = $attachment[7];
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ($disposition == 'inline' && isset($cidUniq[$cid])) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
</ins><span class="cx" style="display: block; padding: 0 10px">                     continue;
</span><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">                 $cidUniq[$cid] = true;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                 $mime[] = sprintf('--%s%s', $boundary, $this->LE);
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $mime[] = sprintf(
-                    'Content-Type: %s; name="%s"%s',
-                    $type,
-                    $this->encodeHeader($this->secureHeader($name)),
-                    $this->LE
-                );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                //Only include a filename property if we have one
+                if (!empty($name)) {
+                    $mime[] = sprintf(
+                        'Content-Type: %s; name="%s"%s',
+                        $type,
+                        $this->encodeHeader($this->secureHeader($name)),
+                        $this->LE
+                    );
+                } else {
+                    $mime[] = sprintf(
+                        'Content-Type: %s%s',
+                        $type,
+                        $this->LE
+                    );
+                }
</ins><span class="cx" style="display: block; padding: 0 10px">                 // RFC1341 part 5 says 7bit is assumed if not specified
</span><span class="cx" style="display: block; padding: 0 10px">                 if ($encoding != '7bit') {
</span><span class="cx" style="display: block; padding: 0 10px">                     $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2301,12 +2633,20 @@
</span><span class="cx" style="display: block; padding: 0 10px">                             $this->LE . $this->LE
</span><span class="cx" style="display: block; padding: 0 10px">                         );
</span><span class="cx" style="display: block; padding: 0 10px">                     } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $mime[] = sprintf(
-                            'Content-Disposition: %s; filename=%s%s',
-                            $disposition,
-                            $encoded_name,
-                            $this->LE . $this->LE
-                        );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                        if (!empty($encoded_name)) {
+                            $mime[] = sprintf(
+                                'Content-Disposition: %s; filename=%s%s',
+                                $disposition,
+                                $encoded_name,
+                                $this->LE . $this->LE
+                            );
+                        } else {
+                            $mime[] = sprintf(
+                                'Content-Disposition: %s%s',
+                                $disposition,
+                                $this->LE . $this->LE
+                            );
+                        }
</ins><span class="cx" style="display: block; padding: 0 10px">                     }
</span><span class="cx" style="display: block; padding: 0 10px">                 } else {
</span><span class="cx" style="display: block; padding: 0 10px">                     $mime[] = $this->LE;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2340,7 +2680,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * @param string $path The full path to the file
</span><span class="cx" style="display: block; padding: 0 10px">      * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
</span><span class="cx" style="display: block; padding: 0 10px">      * @throws phpmailerException
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @see EncodeFile(encodeFile
</del><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      * @return string
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2560,7 +2899,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><span class="cx" style="display: block; padding: 0 10px">         // Use native function if it's available (>= PHP5.3)
</span><span class="cx" style="display: block; padding: 0 10px">         if (function_exists('quoted_printable_encode')) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            return $this->fixEOL(quoted_printable_encode($string));
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            return quoted_printable_encode($string);
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         // Fall back to a pure PHP implementation
</span><span class="cx" style="display: block; padding: 0 10px">         $string = str_replace(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2568,8 +2907,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">             array(' ', "\r\n=2E", "\r\n", '='),
</span><span class="cx" style="display: block; padding: 0 10px">             rawurlencode($string)
</span><span class="cx" style="display: block; padding: 0 10px">         );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $string = preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
-        return $this->fixEOL($string);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2638,7 +2976,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">         return str_replace(' ', '_', $encoded);
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-
</del><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Add a string or binary attachment (non-filesystem).
</span><span class="cx" style="display: block; padding: 0 10px">      * This method can be used to attach ascii or binary data,
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2744,7 +3081,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         $disposition = 'inline'
</span><span class="cx" style="display: block; padding: 0 10px">     ) {
</span><span class="cx" style="display: block; padding: 0 10px">         // If a MIME type is not specified, try to work it out from the name
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ($type == '') {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if ($type == '' and !empty($name)) {
</ins><span class="cx" style="display: block; padding: 0 10px">             $type = self::filenameToType($name);
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2801,6 +3138,22 @@
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Clear queued addresses of given kind.
+     * @access protected
+     * @param string $kind 'to', 'cc', or 'bcc'
+     * @return void
+     */
+    public function clearQueuedAddresses($kind)
+    {
+        $RecipientsQueue = $this->RecipientsQueue;
+        foreach ($RecipientsQueue as $address => $params) {
+            if ($params[0] == $kind) {
+                unset($this->RecipientsQueue[$address]);
+            }
+        }
+    }
+
+    /**
</ins><span class="cx" style="display: block; padding: 0 10px">      * Clear all To recipients.
</span><span class="cx" style="display: block; padding: 0 10px">      * @return void
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2810,6 +3163,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">             unset($this->all_recipients[strtolower($to[0])]);
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         $this->to = array();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $this->clearQueuedAddresses('to');
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2822,6 +3176,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">             unset($this->all_recipients[strtolower($cc[0])]);
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         $this->cc = array();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $this->clearQueuedAddresses('cc');
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2834,6 +3189,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">             unset($this->all_recipients[strtolower($bcc[0])]);
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         $this->bcc = array();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $this->clearQueuedAddresses('bcc');
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2843,6 +3199,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">     public function clearReplyTos()
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><span class="cx" style="display: block; padding: 0 10px">         $this->ReplyTo = array();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $this->ReplyToQueue = array();
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2855,6 +3212,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         $this->cc = array();
</span><span class="cx" style="display: block; padding: 0 10px">         $this->bcc = array();
</span><span class="cx" style="display: block; padding: 0 10px">         $this->all_recipients = array();
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $this->RecipientsQueue = array();
</ins><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3011,8 +3369,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * Returns all custom headers
-     *
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Returns all custom headers.
</ins><span class="cx" style="display: block; padding: 0 10px">      * @return array
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public function getCustomHeaders()
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3021,21 +3378,23 @@
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * Create a message from an HTML string.
-     * Automatically makes modifications for inline images and backgrounds
-     * and creates a plain-text version by converting the HTML.
-     * Overwrites any existing values in $this->Body and $this->AltBody
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * Create a message body from an HTML string.
+     * Automatically inlines images and creates a plain-text version by converting the HTML,
+     * overwriting any existing values in Body and AltBody.
+     * $basedir is used when handling relative image paths, e.g. <img src="images/a.png">
+     * will look for an image file in $basedir/images/a.png and convert it to inline.
+     * If you don't want to apply these transformations to your HTML, just set Body and AltBody yourself.
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access public
</span><span class="cx" style="display: block; padding: 0 10px">      * @param string $message HTML message string
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @param string $basedir baseline directory for path
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @param string $basedir base directory for relative paths to images
</ins><span class="cx" style="display: block; padding: 0 10px">      * @param boolean|callable $advanced Whether to use the internal HTML to text converter
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     *    or your own custom converter @see html2text()
-     * @return string $message
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     *    or your own custom converter @see PHPMailer::html2text()
+     * @return string $message The transformed message Body
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public function msgHTML($message, $basedir = '', $advanced = false)
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><span class="cx" style="display: block; padding: 0 10px">         preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if (isset($images[2])) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if (array_key_exists(2, $images)) {
</ins><span class="cx" style="display: block; padding: 0 10px">             foreach ($images[2] as $imgindex => $url) {
</span><span class="cx" style="display: block; padding: 0 10px">                 // Convert data URIs into embedded images
</span><span class="cx" style="display: block; padding: 0 10px">                 if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3046,15 +3405,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">                         $data = rawurldecode($data);
</span><span class="cx" style="display: block; padding: 0 10px">                     }
</span><span class="cx" style="display: block; padding: 0 10px">                     $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                    if ($this->addStringEmbeddedImage($data, $cid, '', 'base64', $match[1])) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         $message = str_replace(
</span><span class="cx" style="display: block; padding: 0 10px">                             $images[0][$imgindex],
</span><span class="cx" style="display: block; padding: 0 10px">                             $images[1][$imgindex] . '="cid:' . $cid . '"',
</span><span class="cx" style="display: block; padding: 0 10px">                             $message
</span><span class="cx" style="display: block; padding: 0 10px">                         );
</span><span class="cx" style="display: block; padding: 0 10px">                     }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                } elseif (!preg_match('#^[A-z]+://#', $url)) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                } elseif (substr($url, 0, 4) !== 'cid:' && !preg_match('#^[a-z][a-z0-9+.-]*://#i', $url)) {
</ins><span class="cx" style="display: block; padding: 0 10px">                     // Do not change urls for absolute images (thanks to corvuscorax)
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                    // Do not change urls that are already inline images
</ins><span class="cx" style="display: block; padding: 0 10px">                     $filename = basename($url);
</span><span class="cx" style="display: block; padding: 0 10px">                     $directory = dirname($url);
</span><span class="cx" style="display: block; padding: 0 10px">                     if ($directory == '.') {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3088,7 +3448,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
</span><span class="cx" style="display: block; padding: 0 10px">         $this->Body = $this->normalizeBreaks($message);
</span><span class="cx" style="display: block; padding: 0 10px">         $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if (empty($this->AltBody)) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        if (!$this->alternativeExists()) {
</ins><span class="cx" style="display: block; padding: 0 10px">             $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
</span><span class="cx" style="display: block; padding: 0 10px">                 self::CRLF . self::CRLF;
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3099,7 +3459,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * Convert an HTML string into plain text.
</span><span class="cx" style="display: block; padding: 0 10px">      * This is used by msgHTML().
</span><span class="cx" style="display: block; padding: 0 10px">      * Note - older versions of this function used a bundled advanced converter
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * which was been removed for license reasons in #232
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * which was been removed for license reasons in #232.
</ins><span class="cx" style="display: block; padding: 0 10px">      * Example usage:
</span><span class="cx" style="display: block; padding: 0 10px">      * <code>
</span><span class="cx" style="display: block; padding: 0 10px">      * // Use default conversion
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3144,6 +3504,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">             'bin'   => 'application/macbinary',
</span><span class="cx" style="display: block; padding: 0 10px">             'doc'   => 'application/msword',
</span><span class="cx" style="display: block; padding: 0 10px">             'word'  => 'application/msword',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
+            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
+            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
+            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
+            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
+            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
+            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
</ins><span class="cx" style="display: block; padding: 0 10px">             'class' => 'application/octet-stream',
</span><span class="cx" style="display: block; padding: 0 10px">             'dll'   => 'application/octet-stream',
</span><span class="cx" style="display: block; padding: 0 10px">             'dms'   => 'application/octet-stream',
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3348,7 +3718,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">         return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-
</del><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Set the public and private key files and password for S/MIME signing.
</span><span class="cx" style="display: block; padding: 0 10px">      * @access public
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3390,7 +3759,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * @access public
</span><span class="cx" style="display: block; padding: 0 10px">      * @param string $signHeader
</span><span class="cx" style="display: block; padding: 0 10px">      * @throws phpmailerException
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @return string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @return string The DKIM signature value
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public function DKIM_Sign($signHeader)
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3400,15 +3769,35 @@
</span><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">             return '';
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $privKeyStr = file_get_contents($this->DKIM_private);
-        if ($this->DKIM_passphrase != '') {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
+        if ('' != $this->DKIM_passphrase) {
</ins><span class="cx" style="display: block; padding: 0 10px">             $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
</span><span class="cx" style="display: block; padding: 0 10px">         } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            $privKey = $privKeyStr;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            $privKey = openssl_pkey_get_private($privKeyStr);
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if (openssl_sign($signHeader, $signature, $privKey)) {
-            return base64_encode($signature);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
+        //@link http://stackoverflow.com/a/11117338/333340
+        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
+            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
+            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
+                openssl_pkey_free($privKey);
+                return base64_encode($signature);
+            }
+        } else {
+            $pinfo = openssl_pkey_get_details($privKey);
+            $hash = hash('sha256', $signHeader);
+            //'Magic' constant for SHA256 from RFC3447
+            //@link https://tools.ietf.org/html/rfc3447#page-43
+            $t = '3031300d060960864801650304020105000420' . $hash;
+            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
+            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);
+
+            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
+                openssl_pkey_free($privKey);
+                return base64_encode($signature);
+            }
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        openssl_pkey_free($privKey);
</ins><span class="cx" style="display: block; padding: 0 10px">         return '';
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3425,7 +3814,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         foreach ($lines as $key => $line) {
</span><span class="cx" style="display: block; padding: 0 10px">             list($heading, $value) = explode(':', $line, 2);
</span><span class="cx" style="display: block; padding: 0 10px">             $heading = strtolower($heading);
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            $value = preg_replace('/\s+/', ' ', $value); // Compress useless spaces
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
</ins><span class="cx" style="display: block; padding: 0 10px">             $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         $signHeader = implode("\r\n", $lines);
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3463,7 +3852,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public function DKIM_Add($headers_line, $subject, $body)
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
</ins><span class="cx" style="display: block; padding: 0 10px">         $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
</span><span class="cx" style="display: block; padding: 0 10px">         $DKIMquery = 'dns/txt'; // Query method
</span><span class="cx" style="display: block; padding: 0 10px">         $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3471,6 +3860,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         $headers = explode($this->LE, $headers_line);
</span><span class="cx" style="display: block; padding: 0 10px">         $from_header = '';
</span><span class="cx" style="display: block; padding: 0 10px">         $to_header = '';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $date_header = '';
</ins><span class="cx" style="display: block; padding: 0 10px">         $current = '';
</span><span class="cx" style="display: block; padding: 0 10px">         foreach ($headers as $header) {
</span><span class="cx" style="display: block; padding: 0 10px">             if (strpos($header, 'From:') === 0) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3479,6 +3869,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">             } elseif (strpos($header, 'To:') === 0) {
</span><span class="cx" style="display: block; padding: 0 10px">                 $to_header = $header;
</span><span class="cx" style="display: block; padding: 0 10px">                 $current = 'to_header';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            } elseif (strpos($header, 'Date:') === 0) {
+                $date_header = $header;
+                $current = 'date_header';
</ins><span class="cx" style="display: block; padding: 0 10px">             } else {
</span><span class="cx" style="display: block; padding: 0 10px">                 if (!empty($$current) && strpos($header, ' =?') === 0) {
</span><span class="cx" style="display: block; padding: 0 10px">                     $$current .= $header;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3489,6 +3882,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
</span><span class="cx" style="display: block; padding: 0 10px">         $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
</ins><span class="cx" style="display: block; padding: 0 10px">         $subject = str_replace(
</span><span class="cx" style="display: block; padding: 0 10px">             '|',
</span><span class="cx" style="display: block; padding: 0 10px">             '=7C',
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3496,7 +3890,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         ); // Copied header fields (dkim-quoted-printable)
</span><span class="cx" style="display: block; padding: 0 10px">         $body = $this->DKIM_BodyC($body);
</span><span class="cx" style="display: block; padding: 0 10px">         $DKIMlen = strlen($body); // Length of body
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $DKIMb64 = base64_encode(pack('H*', sha1($body))); // Base64 of packed binary SHA-1 hash of body
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
</ins><span class="cx" style="display: block; padding: 0 10px">         if ('' == $this->DKIM_identity) {
</span><span class="cx" style="display: block; padding: 0 10px">             $ident = '';
</span><span class="cx" style="display: block; padding: 0 10px">         } else {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3509,15 +3903,20 @@
</span><span class="cx" style="display: block; padding: 0 10px">             $this->DKIM_selector .
</span><span class="cx" style="display: block; padding: 0 10px">             ";\r\n" .
</span><span class="cx" style="display: block; padding: 0 10px">             "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            "\th=From:To:Subject;\r\n" .
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            "\th=From:To:Date:Subject;\r\n" .
</ins><span class="cx" style="display: block; padding: 0 10px">             "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
</span><span class="cx" style="display: block; padding: 0 10px">             "\tz=$from\r\n" .
</span><span class="cx" style="display: block; padding: 0 10px">             "\t|$to\r\n" .
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            "\t|$date\r\n" .
</ins><span class="cx" style="display: block; padding: 0 10px">             "\t|$subject;\r\n" .
</span><span class="cx" style="display: block; padding: 0 10px">             "\tbh=" . $DKIMb64 . ";\r\n" .
</span><span class="cx" style="display: block; padding: 0 10px">             "\tb=";
</span><span class="cx" style="display: block; padding: 0 10px">         $toSign = $this->DKIM_HeaderC(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            $from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            $from_header . "\r\n" .
+            $to_header . "\r\n" .
+            $date_header . "\r\n" .
+            $subject_header . "\r\n" .
+            $dkimhdrs
</ins><span class="cx" style="display: block; padding: 0 10px">         );
</span><span class="cx" style="display: block; padding: 0 10px">         $signed = $this->DKIM_Sign($toSign);
</span><span class="cx" style="display: block; padding: 0 10px">         return $dkimhdrs . $signed . "\r\n";
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3537,6 +3936,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Allows for public read access to 'to' property.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access public
</span><span class="cx" style="display: block; padding: 0 10px">      * @return array
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3547,6 +3947,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Allows for public read access to 'cc' property.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access public
</span><span class="cx" style="display: block; padding: 0 10px">      * @return array
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3557,6 +3958,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Allows for public read access to 'bcc' property.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access public
</span><span class="cx" style="display: block; padding: 0 10px">      * @return array
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3567,6 +3969,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Allows for public read access to 'ReplyTo' property.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access public
</span><span class="cx" style="display: block; padding: 0 10px">      * @return array
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3577,6 +3980,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Allows for public read access to 'all_recipients' property.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access public
</span><span class="cx" style="display: block; padding: 0 10px">      * @return array
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span></span></pre></div>
<a id="branches43srcwpincludesclasssmtpphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: branches/4.3/src/wp-includes/class-smtp.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- branches/4.3/src/wp-includes/class-smtp.php       2017-01-06 05:37:55 UTC (rev 39724)
+++ branches/4.3/src/wp-includes/class-smtp.php 2017-01-06 05:42:02 UTC (rev 39725)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -28,25 +28,25 @@
</span><span class="cx" style="display: block; padding: 0 10px"> {
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The PHPMailer SMTP version number.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    const VERSION = '5.2.10';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    const VERSION = '5.2.21';
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * SMTP line break constant.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     const CRLF = "\r\n";
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The SMTP port to use if one is not specified.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     const DEFAULT_SMTP_PORT = 25;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The maximum line length allowed by RFC 2822 section 2.1.1
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     const MAX_LINE_LENGTH = 998;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -77,15 +77,15 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The PHPMailer SMTP Version number.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @deprecated Use the `VERSION` constant instead
</span><span class="cx" style="display: block; padding: 0 10px">      * @see SMTP::VERSION
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    public $Version = '5.2.10';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    public $Version = '5.2.21';
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * SMTP server port number.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead
</span><span class="cx" style="display: block; padding: 0 10px">      * @see SMTP::DEFAULT_SMTP_PORT
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -93,7 +93,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * SMTP reply line ending.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      * @deprecated Use the `CRLF` constant instead
</span><span class="cx" style="display: block; padding: 0 10px">      * @see SMTP::CRLF
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -107,7 +107,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * * self::DEBUG_SERVER (`2`) Client commands and server responses
</span><span class="cx" style="display: block; padding: 0 10px">      * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status
</span><span class="cx" style="display: block; padding: 0 10px">      * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $do_debug = self::DEBUG_OFF;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -122,7 +122,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * <code>
</span><span class="cx" style="display: block; padding: 0 10px">      * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
</span><span class="cx" style="display: block; padding: 0 10px">      * </code>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string|callable
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string|callable
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Debugoutput = 'echo';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -130,7 +130,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * Whether to use VERP.
</span><span class="cx" style="display: block; padding: 0 10px">      * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
</span><span class="cx" style="display: block; padding: 0 10px">      * @link http://www.postfix.org/VERP_README.html Info on VERP
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type boolean
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var boolean
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $do_verp = false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -139,26 +139,37 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
</span><span class="cx" style="display: block; padding: 0 10px">      * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.
</span><span class="cx" style="display: block; padding: 0 10px">      * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Timeout = 300;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * How long to wait for commands to complete, in seconds.
</span><span class="cx" style="display: block; padding: 0 10px">      * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type integer
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var integer
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public $Timelimit = 300;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        /**
+        * @var array patterns to extract smtp transaction id from smtp reply
+        * Only first capture group will be use, use non-capturing group to deal with it
+        * Extend this class to override this property to fulfil your needs.
+        */
+       protected $smtp_transaction_id_patterns = array(
+               'exim' => '/[0-9]{3} OK id=(.*)/',
+               'sendmail' => '/[0-9]{3} 2.0.0 (.*) Message/',
+               'postfix' => '/[0-9]{3} 2.0.0 Ok: queued as (.*)/'
+       );
+
</ins><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The socket for the server connection.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type resource
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var resource
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $smtp_conn;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Error information, if any, for the last SMTP command.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type array
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var array
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $error = array(
</span><span class="cx" style="display: block; padding: 0 10px">         'error' => '',
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -170,7 +181,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The reply the server sent to us for HELO.
</span><span class="cx" style="display: block; padding: 0 10px">      * If null, no HELO string has yet been received.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string|null
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string|null
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $helo_rply = null;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -181,13 +192,13 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * represents the server name. In case of HELO it is the only element of the array.
</span><span class="cx" style="display: block; padding: 0 10px">      * Other values can be boolean TRUE or an array containing extension options.
</span><span class="cx" style="display: block; padding: 0 10px">      * If null, no HELO/EHLO string has yet been received.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type array|null
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var array|null
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $server_caps = null;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * The most recent reply received from the server.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @type string
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @var string
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     protected $last_reply = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -206,7 +217,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         //Avoid clash with built-in function names
</span><span class="cx" style="display: block; padding: 0 10px">         if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            call_user_func($this->Debugoutput, $str, $this->do_debug);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            call_user_func($this->Debugoutput, $str, $level);
</ins><span class="cx" style="display: block; padding: 0 10px">             return;
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         switch ($this->Debugoutput) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -272,8 +283,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">         $errstr = '';
</span><span class="cx" style="display: block; padding: 0 10px">         if ($streamok) {
</span><span class="cx" style="display: block; padding: 0 10px">             $socket_context = stream_context_create($options);
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            //Suppress errors; connection failures are handled at a higher level
-            $this->smtp_conn = @stream_socket_client(
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            set_error_handler(array($this, 'errorHandler'));
+            $this->smtp_conn = stream_socket_client(
</ins><span class="cx" style="display: block; padding: 0 10px">                 $host . ":" . $port,
</span><span class="cx" style="display: block; padding: 0 10px">                 $errno,
</span><span class="cx" style="display: block; padding: 0 10px">                 $errstr,
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -281,12 +292,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 STREAM_CLIENT_CONNECT,
</span><span class="cx" style="display: block; padding: 0 10px">                 $socket_context
</span><span class="cx" style="display: block; padding: 0 10px">             );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            restore_error_handler();
</ins><span class="cx" style="display: block; padding: 0 10px">         } else {
</span><span class="cx" style="display: block; padding: 0 10px">             //Fall back to fsockopen which should work in more places, but is missing some features
</span><span class="cx" style="display: block; padding: 0 10px">             $this->edebug(
</span><span class="cx" style="display: block; padding: 0 10px">                 "Connection: stream_socket_client not available, falling back to fsockopen",
</span><span class="cx" style="display: block; padding: 0 10px">                 self::DEBUG_CONNECTION
</span><span class="cx" style="display: block; padding: 0 10px">             );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            set_error_handler(array($this, 'errorHandler'));
</ins><span class="cx" style="display: block; padding: 0 10px">             $this->smtp_conn = fsockopen(
</span><span class="cx" style="display: block; padding: 0 10px">                 $host,
</span><span class="cx" style="display: block; padding: 0 10px">                 $port,
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -294,6 +307,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                 $errstr,
</span><span class="cx" style="display: block; padding: 0 10px">                 $timeout
</span><span class="cx" style="display: block; padding: 0 10px">             );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            restore_error_handler();
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         // Verify we connected properly
</span><span class="cx" style="display: block; padding: 0 10px">         if (!is_resource($this->smtp_conn)) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -336,11 +350,22 @@
</span><span class="cx" style="display: block; padding: 0 10px">         if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
</span><span class="cx" style="display: block; padding: 0 10px">             return false;
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+        //Allow the best TLS version(s) we can
+        $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;
+
+        //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT
+        //so add them back in manually if we can
+        if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {
+            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
+            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
+        }
+
</ins><span class="cx" style="display: block; padding: 0 10px">         // Begin encrypted connection
</span><span class="cx" style="display: block; padding: 0 10px">         if (!stream_socket_enable_crypto(
</span><span class="cx" style="display: block; padding: 0 10px">             $this->smtp_conn,
</span><span class="cx" style="display: block; padding: 0 10px">             true,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            STREAM_CRYPTO_METHOD_TLS_CLIENT
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            $crypto_method
</ins><span class="cx" style="display: block; padding: 0 10px">         )) {
</span><span class="cx" style="display: block; padding: 0 10px">             return false;
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -351,20 +376,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * Perform SMTP authentication.
</span><span class="cx" style="display: block; padding: 0 10px">      * Must be run after hello().
</span><span class="cx" style="display: block; padding: 0 10px">      * @see hello()
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @param string $username    The user name
-     * @param string $password    The password
-     * @param string $authtype    The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5)
-     * @param string $realm       The auth realm for NTLM
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @param string $username The user name
+     * @param string $password The password
+     * @param string $authtype The auth type (PLAIN, LOGIN, CRAM-MD5)
+     * @param string $realm The auth realm for NTLM
</ins><span class="cx" style="display: block; padding: 0 10px">      * @param string $workstation The auth workstation for NTLM
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @access public
-     * @return boolean True if successfully authenticated.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @param null|OAuth $OAuth An optional OAuth instance (@see PHPMailerOAuth)
+     * @return bool True if successfully authenticated.* @access public
</ins><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="cx" style="display: block; padding: 0 10px">     public function authenticate(
</span><span class="cx" style="display: block; padding: 0 10px">         $username,
</span><span class="cx" style="display: block; padding: 0 10px">         $password,
</span><span class="cx" style="display: block; padding: 0 10px">         $authtype = null,
</span><span class="cx" style="display: block; padding: 0 10px">         $realm = '',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $workstation = ''
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $workstation = '',
+        $OAuth = null
</ins><span class="cx" style="display: block; padding: 0 10px">     ) {
</span><span class="cx" style="display: block; padding: 0 10px">         if (!$this->server_caps) {
</span><span class="cx" style="display: block; padding: 0 10px">             $this->setError('Authentication is not allowed before HELO/EHLO');
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -388,7 +414,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">             );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">             if (empty($authtype)) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                foreach (array('LOGIN', 'CRAM-MD5', 'PLAIN') as $method) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                foreach (array('CRAM-MD5', 'LOGIN', 'PLAIN') as $method) {
</ins><span class="cx" style="display: block; padding: 0 10px">                     if (in_array($method, $this->server_caps['AUTH'])) {
</span><span class="cx" style="display: block; padding: 0 10px">                         $authtype = $method;
</span><span class="cx" style="display: block; padding: 0 10px">                         break;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -672,10 +698,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">     protected function parseHelloFields($type)
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><span class="cx" style="display: block; padding: 0 10px">         $this->server_caps = array();
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $lines = explode("\n", $this->last_reply);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $lines = explode("\n", $this->helo_rply);
+
</ins><span class="cx" style="display: block; padding: 0 10px">         foreach ($lines as $n => $s) {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            //First 4 chars contain response code followed by - or space
</ins><span class="cx" style="display: block; padding: 0 10px">             $s = trim(substr($s, 4));
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            if (!$s) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            if (empty($s)) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 continue;
</span><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">             $fields = explode(' ', $s);
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -685,11 +713,20 @@
</span><span class="cx" style="display: block; padding: 0 10px">                     $fields = $fields[0];
</span><span class="cx" style="display: block; padding: 0 10px">                 } else {
</span><span class="cx" style="display: block; padding: 0 10px">                     $name = array_shift($fields);
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                    if ($name == 'SIZE') {
-                        $fields = ($fields) ? $fields[0] : 0;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                    switch ($name) {
+                        case 'SIZE':
+                            $fields = ($fields ? $fields[0] : 0);
+                            break;
+                        case 'AUTH':
+                            if (!is_array($fields)) {
+                                $fields = array();
+                            }
+                            break;
+                        default:
+                            $fields = true;
</ins><span class="cx" style="display: block; padding: 0 10px">                     }
</span><span class="cx" style="display: block; padding: 0 10px">                 }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $this->server_caps[$name] = ($fields ? $fields : true);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $this->server_caps[$name] = $fields;
</ins><span class="cx" style="display: block; padding: 0 10px">             }
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -739,15 +776,15 @@
</span><span class="cx" style="display: block; padding: 0 10px">      * Sets the TO argument to $toaddr.
</span><span class="cx" style="display: block; padding: 0 10px">      * Returns true if the recipient was accepted false if it was rejected.
</span><span class="cx" style="display: block; padding: 0 10px">      * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @param string $toaddr The address the message is being sent to
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @param string $address The address the message is being sent to
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access public
</span><span class="cx" style="display: block; padding: 0 10px">      * @return boolean
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-    public function recipient($toaddr)
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+    public function recipient($address)
</ins><span class="cx" style="display: block; padding: 0 10px">     {
</span><span class="cx" style="display: block; padding: 0 10px">         return $this->sendCommand(
</span><span class="cx" style="display: block; padding: 0 10px">             'RCPT TO',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            'RCPT TO:<' . $toaddr . '>',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            'RCPT TO:<' . $address . '>',
</ins><span class="cx" style="display: block; padding: 0 10px">             array(250, 251)
</span><span class="cx" style="display: block; padding: 0 10px">         );
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -766,9 +803,9 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">     /**
</span><span class="cx" style="display: block; padding: 0 10px">      * Send a command to an SMTP server and check its return code.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @param string $command       The command name - not sent to the server
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @param string $command The command name - not sent to the server
</ins><span class="cx" style="display: block; padding: 0 10px">      * @param string $commandstring The actual command to send
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-     * @param integer|array $expect     One or more expected integer success codes
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+     * @param integer|array $expect One or more expected integer success codes
</ins><span class="cx" style="display: block; padding: 0 10px">      * @access protected
</span><span class="cx" style="display: block; padding: 0 10px">      * @return boolean True on success.
</span><span class="cx" style="display: block; padding: 0 10px">      */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -778,6 +815,11 @@
</span><span class="cx" style="display: block; padding: 0 10px">             $this->setError("Called $command without being connected");
</span><span class="cx" style="display: block; padding: 0 10px">             return false;
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        //Reject line breaks in all commands
+        if (strpos($commandstring, "\n") !== false or strpos($commandstring, "\r") !== false) {
+            $this->setError("Command '$command' contained line breaks");
+            return false;
+        }
</ins><span class="cx" style="display: block; padding: 0 10px">         $this->client_send($commandstring . self::CRLF);
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">         $this->last_reply = $this->get_lines();
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -981,10 +1023,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px">         while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
</span><span class="cx" style="display: block; padding: 0 10px">             $str = @fgets($this->smtp_conn, 515);
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            $this->edebug("SMTP -> get_lines(): \$data was \"$data\"", self::DEBUG_LOWLEVEL);
-            $this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL);
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+            $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
+            $this->edebug("SMTP -> get_lines(): \$str is  \"$str\"", self::DEBUG_LOWLEVEL);
</ins><span class="cx" style="display: block; padding: 0 10px">             $data .= $str;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-            $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
</del><span class="cx" style="display: block; padding: 0 10px">             // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen
</span><span class="cx" style="display: block; padding: 0 10px">             if ((isset($str[3]) and $str[3] == ' ')) {
</span><span class="cx" style="display: block; padding: 0 10px">                 break;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1099,4 +1140,47 @@
</span><span class="cx" style="display: block; padding: 0 10px">     {
</span><span class="cx" style="display: block; padding: 0 10px">         return $this->Timeout;
</span><span class="cx" style="display: block; padding: 0 10px">     }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+    /**
+     * Reports an error number and string.
+     * @param integer $errno The error number returned by PHP.
+     * @param string $errmsg The error message returned by PHP.
+     */
+    protected function errorHandler($errno, $errmsg)
+    {
+        $notice = 'Connection: Failed to connect to server.';
+        $this->setError(
+            $notice,
+            $errno,
+            $errmsg
+        );
+        $this->edebug(
+            $notice . ' Error number ' . $errno . '. "Error notice: ' . $errmsg,
+            self::DEBUG_CONNECTION
+        );
+    }
+
+       /**
+        * Will return the ID of the last smtp transaction based on a list of patterns provided
+        * in SMTP::$smtp_transaction_id_patterns.
+        * If no reply has been received yet, it will return null.
+        * If no pattern has been matched, it will return false.
+        * @return bool|null|string
+        */
+       public function getLastTransactionID()
+       {
+               $reply = $this->getLastReply();
+
+               if (empty($reply)) {
+                       return null;
+               }
+
+               foreach($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) {
+                       if(preg_match($smtp_transaction_id_pattern, $reply, $matches)) {
+                               return $matches[1];
+                       }
+               }
+
+               return false;
+    }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre>
</div>
</div>

</body>
</html>