Re-added
[mailer.git] / inc / phpmailer / class.pop3.php
1 <?php
2 /*~ class.pop3.php
3 .---------------------------------------------------------------------------.
4 |  Software: PHPMailer - PHP email class                                    |
5 |   Version: 2.0.2                                                          |
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  *
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    * @var int
51    */
52   var $POP3_PORT = 110;
53
54   /**
55    * Default Timeout
56    * @var int
57    */
58   var $POP3_TIMEOUT = 30;
59
60   /**
61    * POP3 Carriage Return + Line Feed
62    * @var string
63    */
64   var $CRLF = "\r\n";
65
66   /**
67    * Displaying Debug warnings? (0 = now, 1+ = yes)
68    * @var int
69    */
70   var $do_debug = 2;
71
72   /**
73    * POP3 Mail Server
74    * @var string
75    */
76   var $host;
77
78   /**
79    * POP3 Port
80    * @var int
81    */
82   var $port;
83
84   /**
85    * POP3 Timeout Value
86    * @var int
87    */
88   var $tval;
89
90   /**
91    * POP3 Username
92    * @var string
93    */
94   var $username;
95
96   /**
97    * POP3 Password
98    * @var string
99    */
100   var $password;
101
102   /**#@+
103    * @access private
104    */
105   var $pop_conn;
106   var $connected;
107   var $error;     //  Error log array
108   /**#@-*/
109
110   /**
111    * Constructor, sets the initial values
112    *
113    * @return POP3
114    */
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    * @param string $host
126    * @param integer $port
127    * @param integer $tval
128    * @param string $username
129    * @param string $password
130    */
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    * @param string $host
188    * @param integer $port
189    * @param integer $tval
190    * @return boolean
191    */
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      * @param string $username
274      * @param string $password
275      * @return boolean
276      */
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      * @param integer $size
348      * @return string
349      */
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      * @param string $string
361      * @return integer
362      */
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      * @param string $string
375      * @return boolean
376      */
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    * @param integer $errno
421    * @param string $errstr
422    * @param string $errfile
423    * @param integer $errline
424    */
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 ?>