File: 0.00.1a/core/phpmailer/class.pop3.php (View as Code)

1: 2: /*~ class.pop3.php 3: .---------------------------------------------------------------------------. 4: | Software: PHPMailer - PHP email class | 5: | Version: 5.2.1 | 6: | Site: https://code.google.com/a/apache-extras.org/p/phpmailer/ | 7: | ------------------------------------------------------------------------- | 8: | Admin: Jim Jagielski (project admininistrator) | 9: | Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net | 10: | : Marcus Bointon (coolbru) coolbru@users.sourceforge.net | 11: | : Jim Jagielski (jimjag) jimjag@gmail.com | 12: | Founder: Brent R. Matzelle (original founder) | 13: | Copyright (c) 2010-2012, Jim Jagielski. All Rights Reserved. | 14: | Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved. | 15: | Copyright (c) 2001-2003, Brent R. Matzelle | 16: | ------------------------------------------------------------------------- | 17: | License: Distributed under the Lesser General Public License (LGPL) | 18: | http://www.gnu.org/copyleft/lesser.html | 19: | This program is distributed in the hope that it will be useful - WITHOUT | 20: | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 21: | FITNESS FOR A PARTICULAR PURPOSE. | 22: '---------------------------------------------------------------------------' 23: */ 24: 25: /** 26: * PHPMailer - PHP POP Before SMTP Authentication Class 27: * NOTE: Designed for use with PHP version 5 and up 28: * @package PHPMailer 29: * @author Andy Prevost 30: * @author Marcus Bointon 31: * @author Jim Jagielski 32: * @copyright 2010 - 2012 Jim Jagielski 33: * @copyright 2004 - 2009 Andy Prevost 34: * @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL) 35: * @version $Id: class.pop3.php 450 2010-06-23 16:46:33Z coolbru $ 36: */ 37: 38: /** 39: * POP Before SMTP Authentication Class 40: * Version 5.2.1 41: * 42: * Author: Richard Davey (rich@corephp.co.uk) 43: * Modifications: Andy Prevost 44: * License: LGPL, see PHPMailer License 45: * 46: * Specifically for PHPMailer to allow POP before SMTP authentication. 47: * Does not yet work with APOP - if you have an APOP account, contact Richard Davey 48: * and we can test changes to this script. 49: * 50: * This class is based on the structure of the SMTP class originally authored by Chris Ryan 51: * 52: * This class is rfc 1939 compliant and implements all the commands 53: * required for POP3 connection, authentication and disconnection. 54: * 55: * @package PHPMailer 56: * @author Richard Davey 57: */ 58: 59: class POP3 { 60: /** 61: * Default POP3 port 62: * @var int 63: */ 64: public $POP3_PORT = 110; 65: 66: /** 67: * Default Timeout 68: * @var int 69: */ 70: public $POP3_TIMEOUT = 30; 71: 72: /** 73: * POP3 Carriage Return + Line Feed 74: * @var string 75: */ 76: public $CRLF = "\r\n"; 77: 78: /** 79: * Displaying Debug warnings? (0 = now, 1+ = yes) 80: * @var int 81: */ 82: public $do_debug = 2; 83: 84: /** 85: * POP3 Mail Server 86: * @var string 87: */ 88: public $host; 89: 90: /** 91: * POP3 Port 92: * @var int 93: */ 94: public $port; 95: 96: /** 97: * POP3 Timeout Value 98: * @var int 99: */ 100: public $tval; 101: 102: /** 103: * POP3 Username 104: * @var string 105: */ 106: public $username; 107: 108: /** 109: * POP3 Password 110: * @var string 111: */ 112: public $password; 113: 114: /** 115: * Sets the POP3 PHPMailer Version number 116: * @var string 117: */ 118: public $Version = '5.2.1'; 119: 120: ///////////////////////////////////////////////// 121: // PROPERTIES, PRIVATE AND PROTECTED 122: ///////////////////////////////////////////////// 123: 124: private $pop_conn; 125: private $connected; 126: private $error; // Error log array 127: 128: /** 129: * Constructor, sets the initial values 130: * @access public 131: * @return POP3 132: */ 133: public function __construct() { 134: $this->pop_conn = 0; 135: $this->connected = false; 136: $this->error = null; 137: } 138: 139: /** 140: * Combination of public events - connect, login, disconnect 141: * @access public 142: * @param string $host 143: * @param integer $port 144: * @param integer $tval 145: * @param string $username 146: * @param string $password 147: */ 148: public function Authorise ($host, $port = false, $tval = false, $username, $password, $debug_level = 0) { 149: $this->host = $host; 150: 151: // If no port value is passed, retrieve it 152: if ($port == false) { 153: $this->port = $this->POP3_PORT; 154: } else { 155: $this->port = $port; 156: } 157: 158: // If no port value is passed, retrieve it 159: if ($tval == false) { 160: $this->tval = $this->POP3_TIMEOUT; 161: } else { 162: $this->tval = $tval; 163: } 164: 165: $this->do_debug = $debug_level; 166: $this->username = $username; 167: $this->password = $password; 168: 169: // Refresh the error log 170: $this->error = null; 171: 172: // Connect 173: $result = $this->Connect($this->host, $this->port, $this->tval); 174: 175: if ($result) { 176: $login_result = $this->Login($this->username, $this->password); 177: 178: if ($login_result) { 179: $this->Disconnect(); 180: 181: return true; 182: } 183: 184: } 185: 186: // We need to disconnect regardless if the login succeeded 187: $this->Disconnect(); 188: 189: return false; 190: } 191: 192: /** 193: * Connect to the POP3 server 194: * @access public 195: * @param string $host 196: * @param integer $port 197: * @param integer $tval 198: * @return boolean 199: */ 200: public function Connect ($host, $port = false, $tval = 30) { 201: // Are we already connected? 202: if ($this->connected) { 203: return true; 204: } 205: 206: /* 207: On Windows this will raise a PHP Warning error if the hostname doesn't exist. 208: Rather than supress it with @fsockopen, let's capture it cleanly instead 209: */ 210: 211: set_error_handler(array(&$this, 'catchWarning')); 212: 213: // Connect to the POP3 server 214: $this->pop_conn = fsockopen($host, // POP3 Host 215: $port, // Port # 216: $errno, // Error Number 217: $errstr, // Error Message 218: $tval); // Timeout (seconds) 219: 220: // Restore the error handler 221: restore_error_handler(); 222: 223: // Does the Error Log now contain anything? 224: if ($this->error && $this->do_debug >= 1) { 225: $this->displayErrors(); 226: } 227: 228: // Did we connect? 229: if ($this->pop_conn == false) { 230: // It would appear not... 231: $this->error = array( 232: 'error' => "Failed to connect to server $host on port $port", 233: 'errno' => $errno, 234: 'errstr' => $errstr 235: ); 236: 237: if ($this->do_debug >= 1) { 238: $this->displayErrors(); 239: } 240: 241: return false; 242: } 243: 244: // Increase the stream time-out 245: 246: // Check for PHP 4.3.0 or later 247: if (version_compare(phpversion(), '5.0.0', 'ge')) { 248: stream_set_timeout($this->pop_conn, $tval, 0); 249: } else { 250: // Does not work on Windows 251: if (substr(PHP_OS, 0, 3) !== 'WIN') { 252: socket_set_timeout($this->pop_conn, $tval, 0); 253: } 254: } 255: 256: // Get the POP3 server response 257: $pop3_response = $this->getResponse(); 258: 259: // Check for the +OK 260: if ($this->checkResponse($pop3_response)) { 261: // The connection is established and the POP3 server is talking 262: $this->connected = true; 263: return true; 264: } 265: 266: } 267: 268: /** 269: * Login to the POP3 server (does not support APOP yet) 270: * @access public 271: * @param string $username 272: * @param string $password 273: * @return boolean 274: */ 275: public function Login ($username = '', $password = '') { 276: if ($this->connected == false) { 277: $this->error = 'Not connected to POP3 server'; 278: 279: if ($this->do_debug >= 1) { 280: $this->displayErrors(); 281: } 282: } 283: 284: if (empty($username)) { 285: $username = $this->username; 286: } 287: 288: if (empty($password)) { 289: $password = $this->password; 290: } 291: 292: $pop_username = "USER $username" . $this->CRLF; 293: $pop_password = "PASS $password" . $this->CRLF; 294: 295: // Send the Username 296: $this->sendString($pop_username); 297: $pop3_response = $this->getResponse(); 298: 299: if ($this->checkResponse($pop3_response)) { 300: // Send the Password 301: $this->sendString($pop_password); 302: $pop3_response = $this->getResponse(); 303: 304: if ($this->checkResponse($pop3_response)) { 305: return true; 306: } else { 307: return false; 308: } 309: } else { 310: return false; 311: } 312: } 313: 314: /** 315: * Disconnect from the POP3 server 316: * @access public 317: */ 318: public function Disconnect () { 319: $this->sendString('QUIT'); 320: 321: fclose($this->pop_conn); 322: } 323: 324: ///////////////////////////////////////////////// 325: // Private Methods 326: ///////////////////////////////////////////////// 327: 328: /** 329: * Get the socket response back. 330: * $size is the maximum number of bytes to retrieve 331: * @access private 332: * @param integer $size 333: * @return string 334: */ 335: private function getResponse ($size = 128) { 336: $pop3_response = fgets($this->pop_conn, $size); 337: 338: return $pop3_response; 339: } 340: 341: /** 342: * Send a string down the open socket connection to the POP3 server 343: * @access private 344: * @param string $string 345: * @return integer 346: */ 347: private function sendString ($string) { 348: $bytes_sent = fwrite($this->pop_conn, $string, strlen($string)); 349: 350: return $bytes_sent; 351: } 352: 353: /** 354: * Checks the POP3 server response for +OK or -ERR 355: * @access private 356: * @param string $string 357: * @return boolean 358: */ 359: private function checkResponse ($string) { 360: if (substr($string, 0, 3) !== '+OK') { 361: $this->error = array( 362: 'error' => "Server reported an error: $string", 363: 'errno' => 0, 364: 'errstr' => '' 365: ); 366: 367: if ($this->do_debug >= 1) { 368: $this->displayErrors(); 369: } 370: 371: return false; 372: } else { 373: return true; 374: } 375: 376: } 377: 378: /** 379: * If debug is enabled, display the error message array 380: * @access private 381: */ 382: private function displayErrors () { 383: echo '
';
384: 
385:     foreach ($this->error as $single_error) {
386:       print_r($single_error);
387:     }
388: 
389:     echo '
';
390: } 391: 392: /** 393: * Takes over from PHP for the socket warning handler 394: * @access private 395: * @param integer $errno 396: * @param string $errstr 397: * @param string $errfile 398: * @param integer $errline 399: */ 400: private function catchWarning ($errno, $errstr, $errfile, $errline) { 401: $this->error[] = array( 402: 'error' => "Connecting to the POP3 server raised a PHP warning: ", 403: 'errno' => $errno, 404: 'errstr' => $errstr 405: ); 406: } 407: 408: // End of class 409: } 410: ?> 411: