Project

General

Profile

1
<?php
2
/*~ class.pop3.php
3
.---------------------------------------------------------------------------.
4
|  Software: PHPMailer - PHP email class                                    |
5
|   Version: 5.2.1                                                          |
6
|      Site: https://code.google.com/a/apache-extras.org/p/phpmailer/       |
7
| ------------------------------------------------------------------------- |
8
|     Admin: Jim Jagielski (project admininistrator)                        |
9
|   Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
10
|          : Marcus Bointon (coolbru) coolbru@users.sourceforge.net         |
11
|          : Jim Jagielski (jimjag) jimjag@gmail.com                        |
12
|   Founder: Brent R. Matzelle (original founder)                           |
13
| Copyright (c) 2010-2012, Jim Jagielski. All Rights Reserved.              |
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
*/
24

    
25
/**
26
 * PHPMailer - PHP POP Before SMTP Authentication Class
27
 * NOTE: Designed for use with PHP version 5 and up
28
 * @package PHPMailer
29
 * @author Andy Prevost
30
 * @author Marcus Bointon
31
 * @author Jim Jagielski
32
 * @copyright 2010 - 2012 Jim Jagielski
33
 * @copyright 2004 - 2009 Andy Prevost
34
 * @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL)
35
 * @version $Id: class.pop3.php 450 2010-06-23 16:46:33Z coolbru $
36
 */
37

    
38
/**
39
 * POP Before SMTP Authentication Class
40
 * Version 5.2.1
41
 *
42
 * Author: Richard Davey (rich@corephp.co.uk)
43
 * Modifications: Andy Prevost
44
 * License: LGPL, see PHPMailer License
45
 *
46
 * Specifically for PHPMailer to allow POP before SMTP authentication.
47
 * Does not yet work with APOP - if you have an APOP account, contact Richard Davey
48
 * and we can test changes to this script.
49
 *
50
 * This class is based on the structure of the SMTP class originally authored by Chris Ryan
51
 *
52
 * This class is rfc 1939 compliant and implements all the commands
53
 * required for POP3 connection, authentication and disconnection.
54
 *
55
 * @package PHPMailer
56
 * @author Richard Davey
57
 */
58

    
59
class POP3 {
60
  /**
61
   * Default POP3 port
62
   * @var int
63
   */
64
  public $POP3_PORT = 110;
65

    
66
  /**
67
   * Default Timeout
68
   * @var int
69
   */
70
  public $POP3_TIMEOUT = 30;
71

    
72
  /**
73
   * POP3 Carriage Return + Line Feed
74
   * @var string
75
   */
76
  public $CRLF = "\r\n";
77

    
78
  /**
79
   * Displaying Debug warnings? (0 = now, 1+ = yes)
80
   * @var int
81
   */
82
  public $do_debug = 2;
83

    
84
  /**
85
   * POP3 Mail Server
86
   * @var string
87
   */
88
  public $host;
89

    
90
  /**
91
   * POP3 Port
92
   * @var int
93
   */
94
  public $port;
95

    
96
  /**
97
   * POP3 Timeout Value
98
   * @var int
99
   */
100
  public $tval;
101

    
102
  /**
103
   * POP3 Username
104
   * @var string
105
   */
106
  public $username;
107

    
108
  /**
109
   * POP3 Password
110
   * @var string
111
   */
112
  public $password;
113

    
114
  /**
115
   * Sets the POP3 PHPMailer Version number
116
   * @var string
117
   */
118
  public $Version         = '5.2.1';
119

    
120
  /////////////////////////////////////////////////
121
  // PROPERTIES, PRIVATE AND PROTECTED
122
  /////////////////////////////////////////////////
123

    
124
  private $pop_conn;
125
  private $connected;
126
  private $error;     //  Error log array
127

    
128
  /**
129
   * Constructor, sets the initial values
130
   * @access public
131
   * @return POP3
132
   */
133
  public function __construct() {
134
    $this->pop_conn  = 0;
135
    $this->connected = false;
136
    $this->error     = null;
137
  }
138

    
139
  /**
140
   * Combination of public events - connect, login, disconnect
141
   * @access public
142
   * @param string $host
143
   * @param integer $port
144
   * @param integer $tval
145
   * @param string $username
146
   * @param string $password
147
   */
148
  public function Authorise ($host, $port = false, $tval = false, $username, $password, $debug_level = 0) {
149
    $this->host = $host;
150

    
151
    //  If no port value is passed, retrieve it
152
    if ($port == false) {
153
      $this->port = $this->POP3_PORT;
154
    } else {
155
      $this->port = $port;
156
    }
157

    
158
    //  If no port value is passed, retrieve it
159
    if ($tval == false) {
160
      $this->tval = $this->POP3_TIMEOUT;
161
    } else {
162
      $this->tval = $tval;
163
    }
164

    
165
    $this->do_debug = $debug_level;
166
    $this->username = $username;
167
    $this->password = $password;
168

    
169
    //  Refresh the error log
170
    $this->error = null;
171

    
172
    //  Connect
173
    $result = $this->Connect($this->host, $this->port, $this->tval);
174

    
175
    if ($result) {
176
      $login_result = $this->Login($this->username, $this->password);
177

    
178
      if ($login_result) {
179
        $this->Disconnect();
180

    
181
        return true;
182
      }
183

    
184
    }
185

    
186
    //  We need to disconnect regardless if the login succeeded
187
    $this->Disconnect();
188

    
189
    return false;
190
  }
191

    
192
  /**
193
   * Connect to the POP3 server
194
   * @access public
195
   * @param string $host
196
   * @param integer $port
197
   * @param integer $tval
198
   * @return boolean
199
   */
200
  public function Connect ($host, $port = false, $tval = 30) {
201
    //  Are we already connected?
202
    if ($this->connected) {
203
      return true;
204
    }
205

    
206
    /*
207
    On Windows this will raise a PHP Warning error if the hostname doesn't exist.
208
    Rather than supress it with @fsockopen, let's capture it cleanly instead
209
    */
210

    
211
    set_error_handler(array(&$this, 'catchWarning'));
212

    
213
    //  Connect to the POP3 server
214
    $this->pop_conn = fsockopen($host,    //  POP3 Host
215
                  $port,    //  Port #
216
                  $errno,   //  Error Number
217
                  $errstr,  //  Error Message
218
                  $tval);   //  Timeout (seconds)
219

    
220
    //  Restore the error handler
221
    restore_error_handler();
222

    
223
    //  Does the Error Log now contain anything?
224
    if ($this->error && $this->do_debug >= 1) {
225
      $this->displayErrors();
226
    }
227

    
228
    //  Did we connect?
229
    if ($this->pop_conn == false) {
230
      //  It would appear not...
231
      $this->error = array(
232
        'error' => "Failed to connect to server $host on port $port",
233
        'errno' => $errno,
234
        'errstr' => $errstr
235
      );
236

    
237
      if ($this->do_debug >= 1) {
238
        $this->displayErrors();
239
      }
240

    
241
      return false;
242
    }
243

    
244
    //  Increase the stream time-out
245

    
246
    //  Check for PHP 4.3.0 or later
247
    if (version_compare(phpversion(), '5.0.0', 'ge')) {
248
      stream_set_timeout($this->pop_conn, $tval, 0);
249
    } else {
250
      //  Does not work on Windows
251
      if (substr(PHP_OS, 0, 3) !== 'WIN') {
252
        socket_set_timeout($this->pop_conn, $tval, 0);
253
      }
254
    }
255

    
256
    //  Get the POP3 server response
257
    $pop3_response = $this->getResponse();
258

    
259
    //  Check for the +OK
260
    if ($this->checkResponse($pop3_response)) {
261
    //  The connection is established and the POP3 server is talking
262
    $this->connected = true;
263
      return true;
264
    }
265

    
266
  }
267

    
268
  /**
269
   * Login to the POP3 server (does not support APOP yet)
270
   * @access public
271
   * @param string $username
272
   * @param string $password
273
   * @return boolean
274
   */
275
  public function Login ($username = '', $password = '') {
276
    if ($this->connected == false) {
277
      $this->error = 'Not connected to POP3 server';
278

    
279
      if ($this->do_debug >= 1) {
280
        $this->displayErrors();
281
      }
282
    }
283

    
284
    if (empty($username)) {
285
      $username = $this->username;
286
    }
287

    
288
    if (empty($password)) {
289
      $password = $this->password;
290
    }
291

    
292
    $pop_username = "USER $username" . $this->CRLF;
293
    $pop_password = "PASS $password" . $this->CRLF;
294

    
295
    //  Send the Username
296
    $this->sendString($pop_username);
297
    $pop3_response = $this->getResponse();
298

    
299
    if ($this->checkResponse($pop3_response)) {
300
      //  Send the Password
301
      $this->sendString($pop_password);
302
      $pop3_response = $this->getResponse();
303

    
304
      if ($this->checkResponse($pop3_response)) {
305
        return true;
306
      } else {
307
        return false;
308
      }
309
    } else {
310
      return false;
311
    }
312
  }
313

    
314
  /**
315
   * Disconnect from the POP3 server
316
   * @access public
317
   */
318
  public function Disconnect () {
319
    $this->sendString('QUIT');
320

    
321
    fclose($this->pop_conn);
322
  }
323

    
324
  /////////////////////////////////////////////////
325
  //  Private Methods
326
  /////////////////////////////////////////////////
327

    
328
  /**
329
   * Get the socket response back.
330
   * $size is the maximum number of bytes to retrieve
331
   * @access private
332
   * @param integer $size
333
   * @return string
334
   */
335
  private function getResponse ($size = 128) {
336
    $pop3_response = fgets($this->pop_conn, $size);
337

    
338
    return $pop3_response;
339
  }
340

    
341
  /**
342
   * Send a string down the open socket connection to the POP3 server
343
   * @access private
344
   * @param string $string
345
   * @return integer
346
   */
347
  private function sendString ($string) {
348
    $bytes_sent = fwrite($this->pop_conn, $string, strlen($string));
349

    
350
    return $bytes_sent;
351
  }
352

    
353
  /**
354
   * Checks the POP3 server response for +OK or -ERR
355
   * @access private
356
   * @param string $string
357
   * @return boolean
358
   */
359
  private function checkResponse ($string) {
360
    if (substr($string, 0, 3) !== '+OK') {
361
      $this->error = array(
362
        'error' => "Server reported an error: $string",
363
        'errno' => 0,
364
        'errstr' => ''
365
      );
366

    
367
      if ($this->do_debug >= 1) {
368
        $this->displayErrors();
369
      }
370

    
371
      return false;
372
    } else {
373
      return true;
374
    }
375

    
376
  }
377

    
378
  /**
379
   * If debug is enabled, display the error message array
380
   * @access private
381
   */
382
  private function displayErrors () {
383
    echo '<pre>';
384

    
385
    foreach ($this->error as $single_error) {
386
      print_r($single_error);
387
    }
388

    
389
    echo '</pre>';
390
  }
391

    
392
  /**
393
   * Takes over from PHP for the socket warning handler
394
   * @access private
395
   * @param integer $errno
396
   * @param string $errstr
397
   * @param string $errfile
398
   * @param integer $errline
399
   */
400
  private function catchWarning ($errno, $errstr, $errfile, $errline) {
401
    $this->error[] = array(
402
      'error' => "Connecting to the POP3 server raised a PHP warning: ",
403
      'errno' => $errno,
404
      'errstr' => $errstr
405
    );
406
  }
407

    
408
  //  End of class
409
}
410
?>
(5-5/7)