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

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