File: 1.08.0a/server/base/phpmailer/class.pop3.php (View as HTML)

  1: <?php
  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 '<pre>';
381: 
382:     foreach ($this->error as $single_error) {
383:       print_r($single_error);
384:     }
385: 
386:     echo '</pre>';
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: ?>