File: 1.01.4b/server/base/phpmailer/class.pop3.php (View as Code)

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