Project

General

Profile

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