Rolling back PHPMailer from version 5.2.14 to 5.2.2. The latest version had a problem with smtp authentication set to false it still tried to authenticate.

This commit is contained in:
markjcrane 2016-03-15 02:58:23 -06:00
parent d8aeecad35
commit 0deda1db2e
3 changed files with 3995 additions and 5238 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,407 +1,418 @@
<?php <?php
/*~ class.pop3.php
.---------------------------------------------------------------------------.
| Software: PHPMailer - PHP email class |
| Version: 5.2.2 |
| Site: https://code.google.com/a/apache-extras.org/p/phpmailer/ |
| ------------------------------------------------------------------------- |
| Admin: Jim Jagielski (project admininistrator) |
| Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
| : Marcus Bointon (coolbru) coolbru@users.sourceforge.net |
| : Jim Jagielski (jimjag) jimjag@gmail.com |
| Founder: Brent R. Matzelle (original founder) |
| Copyright (c) 2010-2012, Jim Jagielski. All Rights Reserved. |
| Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved. |
| Copyright (c) 2001-2003, Brent R. Matzelle |
| ------------------------------------------------------------------------- |
| License: Distributed under the Lesser General Public License (LGPL) |
| http://www.gnu.org/copyleft/lesser.html |
| This program is distributed in the hope that it will be useful - WITHOUT |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| FITNESS FOR A PARTICULAR PURPOSE. |
'---------------------------------------------------------------------------'
*/
/** /**
* PHPMailer POP-Before-SMTP Authentication Class. * PHPMailer - PHP POP Before SMTP Authentication Class
* PHP Version 5 * NOTE: Designed for use with PHP version 5 and up
* @package PHPMailer * @package PHPMailer
* @link https://github.com/PHPMailer/PHPMailer/ * @author Andy Prevost
* @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk> * @author Marcus Bointon
* @author Jim Jagielski (jimjag) <jimjag@gmail.com> * @author Jim Jagielski
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
* @author Brent R. Matzelle (original founder)
* @copyright 2012 - 2014 Marcus Bointon
* @copyright 2010 - 2012 Jim Jagielski * @copyright 2010 - 2012 Jim Jagielski
* @copyright 2004 - 2009 Andy Prevost * @copyright 2004 - 2009 Andy Prevost
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL)
* @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*/ */
/** /**
* PHPMailer POP-Before-SMTP Authentication Class. * PHP POP-Before-SMTP Authentication Class
* Specifically for PHPMailer to use for RFC1939 POP-before-SMTP authentication. *
* Does not support APOP. * Version 5.2.2
*
* @license: LGPL, see PHPMailer License
*
* Specifically for PHPMailer to allow POP before SMTP authentication.
* Does not yet work with APOP - if you have an APOP account, contact Jim Jagielski
* and we can test changes to this script.
*
* This class is based on the structure of the SMTP class originally authored by Chris Ryan
*
* This class is rfc 1939 compliant and implements all the commands
* required for POP3 connection, authentication and disconnection.
*
* @package PHPMailer * @package PHPMailer
* @author Richard Davey (original author) <rich@corephp.co.uk> * @author Richard Davey (orig) <rich@corephp.co.uk>
* @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk> * @author Andy Prevost
* @author Jim Jagielski (jimjag) <jimjag@gmail.com> * @author Jim Jagielski
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
*/ */
class POP3
{
/**
* The POP3 PHPMailer Version number.
* @var string
* @access public
*/
public $Version = '5.2.14';
/** class POP3 {
* Default POP3 port number. /**
* @var integer * Default POP3 port
* @access public * @var int
*/ */
public $POP3_PORT = 110; public $POP3_PORT = 110;
/** /**
* Default timeout in seconds. * Default Timeout
* @var integer * @var int
* @access public */
*/ public $POP3_TIMEOUT = 30;
public $POP3_TIMEOUT = 30;
/** /**
* POP3 Carriage Return + Line Feed. * POP3 Carriage Return + Line Feed
* @var string * @var string
* @access public */
* @deprecated Use the constant instead public $CRLF = "\r\n";
*/
public $CRLF = "\r\n";
/** /**
* Debug display level. * Displaying Debug warnings? (0 = now, 1+ = yes)
* Options: 0 = no, 1+ = yes * @var int
* @var integer */
* @access public public $do_debug = 2;
*/
public $do_debug = 0;
/** /**
* POP3 mail server hostname. * POP3 Mail Server
* @var string * @var string
* @access public */
*/ public $host;
public $host;
/** /**
* POP3 port number. * POP3 Port
* @var integer * @var int
* @access public */
*/ public $port;
public $port;
/** /**
* POP3 Timeout Value in seconds. * POP3 Timeout Value
* @var integer * @var int
* @access public */
*/ public $tval;
public $tval;
/** /**
* POP3 username * POP3 Username
* @var string * @var string
* @access public */
*/ public $username;
public $username;
/** /**
* POP3 password. * POP3 Password
* @var string * @var string
* @access public */
*/ public $password;
public $password;
/** /**
* Resource handle for the POP3 connection socket. * Sets the POP3 PHPMailer Version number
* @var resource * @var string
* @access protected */
*/ public $Version = '5.2.2';
protected $pop_conn;
/** /////////////////////////////////////////////////
* Are we connected? // PROPERTIES, PRIVATE AND PROTECTED
* @var boolean /////////////////////////////////////////////////
* @access protected
*/
protected $connected = false;
/** /**
* Error container. * @var resource Resource handle for the POP connection socket
* @var array */
* @access protected private $pop_conn;
*/ /**
protected $errors = array(); * @var boolean Are we connected?
*/
private $connected;
/**
* @var array Error container
*/
private $error; // Error log array
/** /**
* Line break constant * Constructor, sets the initial values
*/ * @access public
const CRLF = "\r\n"; * @return POP3
*/
public function __construct() {
$this->pop_conn = 0;
$this->connected = false;
$this->error = null;
}
/** /**
* Simple static wrapper for all-in-one POP before SMTP * Combination of public events - connect, login, disconnect
* @param $host * @access public
* @param integer|boolean $port The port number to connect to * @param string $host
* @param integer|boolean $timeout The timeout value * @param bool|int $port
* @param string $username * @param bool|int $tval
* @param string $password * @param string $username
* @param integer $debug_level * @param string $password
* @return boolean * @param int $debug_level
*/ * @return bool
public static function popBeforeSmtp( */
$host, public function Authorise ($host, $port = false, $tval = false, $username, $password, $debug_level = 0) {
$port = false, $this->host = $host;
$timeout = false,
$username = '', // If no port value is passed, retrieve it
$password = '', if ($port == false) {
$debug_level = 0 $this->port = $this->POP3_PORT;
) { } else {
$pop = new POP3; $this->port = $port;
return $pop->authorise($host, $port, $timeout, $username, $password, $debug_level);
} }
/** // If no port value is passed, retrieve it
* Authenticate with a POP3 server. if ($tval == false) {
* A connect, login, disconnect sequence $this->tval = $this->POP3_TIMEOUT;
* appropriate for POP-before SMTP authorisation. } else {
* @access public $this->tval = $tval;
* @param string $host The hostname to connect to
* @param integer|boolean $port The port number to connect to
* @param integer|boolean $timeout The timeout value
* @param string $username
* @param string $password
* @param integer $debug_level
* @return boolean
*/
public function authorise($host, $port = false, $timeout = false, $username = '', $password = '', $debug_level = 0)
{
$this->host = $host;
// If no port value provided, use default
if (false === $port) {
$this->port = $this->POP3_PORT;
} else {
$this->port = (integer)$port;
}
// If no timeout value provided, use default
if (false === $timeout) {
$this->tval = $this->POP3_TIMEOUT;
} else {
$this->tval = (integer)$timeout;
}
$this->do_debug = $debug_level;
$this->username = $username;
$this->password = $password;
// Reset the error log
$this->errors = array();
// connect
$result = $this->connect($this->host, $this->port, $this->tval);
if ($result) {
$login_result = $this->login($this->username, $this->password);
if ($login_result) {
$this->disconnect();
return true;
}
}
// We need to disconnect regardless of whether the login succeeded
$this->disconnect();
return false;
} }
/** $this->do_debug = $debug_level;
* Connect to a POP3 server. $this->username = $username;
* @access public $this->password = $password;
* @param string $host
* @param integer|boolean $port
* @param integer $tval
* @return boolean
*/
public function connect($host, $port = false, $tval = 30)
{
// Are we already connected?
if ($this->connected) {
return true;
}
//On Windows this will raise a PHP Warning error if the hostname doesn't exist. // Refresh the error log
//Rather than suppress it with @fsockopen, capture it cleanly instead $this->error = null;
set_error_handler(array($this, 'catchWarning'));
if (false === $port) { // Connect
$port = $this->POP3_PORT; $result = $this->Connect($this->host, $this->port, $this->tval);
}
// connect to the POP3 server if ($result) {
$this->pop_conn = fsockopen( $login_result = $this->Login($this->username, $this->password);
$host, // POP3 Host
$port, // Port #
$errno, // Error Number
$errstr, // Error Message
$tval
); // Timeout (seconds)
// Restore the error handler
restore_error_handler();
// Did we connect? if ($login_result) {
if (false === $this->pop_conn) { $this->Disconnect();
// It would appear not...
$this->setError(array(
'error' => "Failed to connect to server $host on port $port",
'errno' => $errno,
'errstr' => $errstr
));
return false;
}
// Increase the stream time-out return true;
stream_set_timeout($this->pop_conn, $tval, 0); }
// Get the POP3 server response
$pop3_response = $this->getResponse();
// Check for the +OK
if ($this->checkResponse($pop3_response)) {
// The connection is established and the POP3 server is talking
$this->connected = true;
return true;
}
return false;
} }
/** // We need to disconnect regardless if the login succeeded
* Log in to the POP3 server. $this->Disconnect();
* Does not support APOP (RFC 2828, 4949).
* @access public
* @param string $username
* @param string $password
* @return boolean
*/
public function login($username = '', $password = '')
{
if (!$this->connected) {
$this->setError('Not connected to POP3 server');
}
if (empty($username)) {
$username = $this->username;
}
if (empty($password)) {
$password = $this->password;
}
// Send the Username return false;
$this->sendString("USER $username" . self::CRLF); }
$pop3_response = $this->getResponse();
if ($this->checkResponse($pop3_response)) { /**
// Send the Password * Connect to the POP3 server
$this->sendString("PASS $password" . self::CRLF); * @access public
$pop3_response = $this->getResponse(); * @param string $host
if ($this->checkResponse($pop3_response)) { * @param bool|int $port
return true; * @param integer $tval
} * @return boolean
} */
return false; public function Connect ($host, $port = false, $tval = 30) {
// Are we already connected?
if ($this->connected) {
return true;
} }
/** /*
* Disconnect from the POP3 server. On Windows this will raise a PHP Warning error if the hostname doesn't exist.
* @access public Rather than supress it with @fsockopen, let's capture it cleanly instead
*/ */
public function disconnect()
{ set_error_handler(array(&$this, 'catchWarning'));
$this->sendString('QUIT');
//The QUIT command may cause the daemon to exit, which will kill our connection // Connect to the POP3 server
//So ignore errors here $this->pop_conn = fsockopen($host, // POP3 Host
try { $port, // Port #
@fclose($this->pop_conn); $errno, // Error Number
} catch (Exception $e) { $errstr, // Error Message
//Do nothing $tval); // Timeout (seconds)
};
// Restore the error handler
restore_error_handler();
// Does the Error Log now contain anything?
if ($this->error && $this->do_debug >= 1) {
$this->displayErrors();
} }
/** // Did we connect?
* Get a response from the POP3 server. if ($this->pop_conn == false) {
* $size is the maximum number of bytes to retrieve // It would appear not...
* @param integer $size $this->error = array(
* @return string 'error' => "Failed to connect to server $host on port $port",
* @access protected 'errno' => $errno,
*/ 'errstr' => $errstr
protected function getResponse($size = 128) );
{
$response = fgets($this->pop_conn, $size); if ($this->do_debug >= 1) {
if ($this->do_debug >= 1) { $this->displayErrors();
echo "Server -> Client: $response"; }
}
return $response; return false;
} }
/** // Increase the stream time-out
* Send raw data to the POP3 server.
* @param string $string // Check for PHP 4.3.0 or later
* @return integer if (version_compare(phpversion(), '5.0.0', 'ge')) {
* @access protected stream_set_timeout($this->pop_conn, $tval, 0);
*/ } else {
protected function sendString($string) // Does not work on Windows
{ if (substr(PHP_OS, 0, 3) !== 'WIN') {
if ($this->pop_conn) { socket_set_timeout($this->pop_conn, $tval, 0);
if ($this->do_debug >= 2) { //Show client messages when debug >= 2 }
echo "Client -> Server: $string";
}
return fwrite($this->pop_conn, $string, strlen($string));
}
return 0;
} }
/** // Get the POP3 server response
* Checks the POP3 server response. $pop3_response = $this->getResponse();
* Looks for for +OK or -ERR.
* @param string $string // Check for the +OK
* @return boolean if ($this->checkResponse($pop3_response)) {
* @access protected // The connection is established and the POP3 server is talking
*/ $this->connected = true;
protected function checkResponse($string) return true;
{ }
if (substr($string, 0, 3) !== '+OK') { return false;
$this->setError(array( }
'error' => "Server reported an error: $string",
'errno' => 0, /**
'errstr' => '' * Login to the POP3 server (does not support APOP yet)
)); * @access public
return false; * @param string $username
} else { * @param string $password
return true; * @return boolean
} */
public function Login ($username = '', $password = '') {
if ($this->connected == false) {
$this->error = 'Not connected to POP3 server';
if ($this->do_debug >= 1) {
$this->displayErrors();
}
} }
/** if (empty($username)) {
* Add an error to the internal error store. $username = $this->username;
* Also display debug output if it's enabled.
* @param $error
* @access protected
*/
protected function setError($error)
{
$this->errors[] = $error;
if ($this->do_debug >= 1) {
echo '<pre>';
foreach ($this->errors as $error) {
print_r($error);
}
echo '</pre>';
}
} }
/** if (empty($password)) {
* Get an array of error messages, if any. $password = $this->password;
* @return array
*/
public function getErrors()
{
return $this->errors;
} }
/** $pop_username = "USER $username" . $this->CRLF;
* POP3 connection error handler. $pop_password = "PASS $password" . $this->CRLF;
* @param integer $errno
* @param string $errstr // Send the Username
* @param string $errfile $this->sendString($pop_username);
* @param integer $errline $pop3_response = $this->getResponse();
* @access protected
*/ if ($this->checkResponse($pop3_response)) {
protected function catchWarning($errno, $errstr, $errfile, $errline) // Send the Password
{ $this->sendString($pop_password);
$this->setError(array( $pop3_response = $this->getResponse();
'error' => "Connecting to the POP3 server raised a PHP warning: ",
'errno' => $errno, if ($this->checkResponse($pop3_response)) {
'errstr' => $errstr, return true;
'errfile' => $errfile, }
'errline' => $errline
));
} }
return false;
}
/**
* Disconnect from the POP3 server
* @access public
*/
public function Disconnect () {
$this->sendString('QUIT');
fclose($this->pop_conn);
}
/////////////////////////////////////////////////
// Private Methods
/////////////////////////////////////////////////
/**
* Get the socket response back.
* $size is the maximum number of bytes to retrieve
* @access private
* @param integer $size
* @return string
*/
private function getResponse ($size = 128) {
$pop3_response = fgets($this->pop_conn, $size);
return $pop3_response;
}
/**
* Send a string down the open socket connection to the POP3 server
* @access private
* @param string $string
* @return integer
*/
private function sendString ($string) {
$bytes_sent = fwrite($this->pop_conn, $string, strlen($string));
return $bytes_sent;
}
/**
* Checks the POP3 server response for +OK or -ERR
* @access private
* @param string $string
* @return boolean
*/
private function checkResponse ($string) {
if (substr($string, 0, 3) !== '+OK') {
$this->error = array(
'error' => "Server reported an error: $string",
'errno' => 0,
'errstr' => ''
);
if ($this->do_debug >= 1) {
$this->displayErrors();
}
return false;
} else {
return true;
}
}
/**
* If debug is enabled, display the error message array
* @access private
*/
private function displayErrors () {
echo '<pre>';
foreach ($this->error as $single_error) {
print_r($single_error);
}
echo '</pre>';
}
/**
* Takes over from PHP for the socket warning handler
* @access private
* @param integer $errno
* @param string $errstr
* @param string $errfile
* @param integer $errline
*/
private function catchWarning ($errno, $errstr, $errfile, $errline) {
$this->error[] = array(
'error' => "Connecting to the POP3 server raised a PHP warning: ",
'errno' => $errno,
'errstr' => $errstr
);
}
// End of class
} }
?>

File diff suppressed because it is too large Load Diff