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

  1: <?php
  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 '<pre>';
367: 
368:     foreach ($this->error as $single_error) {
369:       print_r($single_error);
370:     }
371: 
372:     echo '</pre>';
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: