Gentics Portal.Node PHP API
 All Classes Namespaces Functions Variables Pages
class.pop3.php
1 <?php
2 /*~ class.pop3.php
3 .---------------------------------------------------------------------------.
4 | Software: PHPMailer - PHP email class |
5 | Version: 5.0.0 |
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 241 2009-03-31 04:44:24Z codeworxtech $
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 ?>