Project

General

Profile

1
<?php
2
/*~ class.pop3.php
3
.---------------------------------------------------------------------------.
4
|  Software: PHPMailer - PHP email class                                    |
5
|   Version: 5.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
|     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 444 2009-05-05 11:22:26Z coolbru $
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
?>
(5-5/7)