@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
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
62class 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 stream_set_timeout($this->pop_conn, $tval, 0);
243
244 // Get the POP3 server response
245 $pop3_response = $this->getResponse();
246
247 // Check for the +OK
248 if ($this->checkResponse($pop3_response)) {
249 // The connection is established and the POP3 server is talking
250 $this->connected = true;
251 return true;
252 }
253
254 }
255
256 /**
257 * Login to the POP3 server (does not support APOP yet)
258 * @access public
259 * @param string $username
260 * @param string $password
261 * @return boolean
262 */
263 public function Login ($username = '', $password = '') {
264 if ($this->connected == false) {
265 $this->error = 'Not connected to POP3 server';
266
267 if ($this->do_debug >= 1) {
268 $this->displayErrors();
269 }
270 }
271
272 if (empty($username)) {
273 $username = $this->username;
274 }
275
276 if (empty($password)) {
277 $password = $this->password;
278 }
279
280 $pop_username = "USER $username" . $this->CRLF;
281 $pop_password = "PASS $password" . $this->CRLF;
282
283 // Send the Username
284 $this->sendString($pop_username);
285 $pop3_response = $this->getResponse();
286
287 if ($this->checkResponse($pop3_response)) {
288 // Send the Password
289 $this->sendString($pop_password);
290 $pop3_response = $this->getResponse();
291
292 if ($this->checkResponse($pop3_response)) {
293 return true;
294 } else {
295 return false;
296 }
297 } else {
298 return false;
299 }
300 }
301
302 /**
303 * Disconnect from the POP3 server
304 * @access public
305 */
306 public function Disconnect () {
307 $this->sendString('QUIT');
308
309 fclose($this->pop_conn);
310 }
311
312 /////////////////////////////////////////////////
313 // Private Methods
314 /////////////////////////////////////////////////
315
316 /**
317 * Get the socket response back.
318 * $size is the maximum number of bytes to retrieve
319 * @access private
320 * @param integer $size
321 * @return string
322 */
323 private function getResponse ($size = 128) {
324 $pop3_response = fgets($this->pop_conn, $size);
325
326 return $pop3_response;
327 }
328
329 /**
330 * Send a string down the open socket connection to the POP3 server
331 * @access private
332 * @param string $string
333 * @return integer
334 */
335 private function sendString ($string) {
336 $bytes_sent = fwrite($this->pop_conn, $string, strlen($string));
337
338 return $bytes_sent;
339 }
340
341 /**
342 * Checks the POP3 server response for +OK or -ERR
343 * @access private
344 * @param string $string
345 * @return boolean
346 */
347 private function checkResponse ($string) {
348 if (substr($string, 0, 3) !== '+OK') {
349 $this->error = array(
350 'error' => "Server reported an error: $string",
351 'errno' => 0,
352 'errstr' => ''
353 );
354
355 if ($this->do_debug >= 1) {
356 $this->displayErrors();
357 }
358
359 return false;
360 } else {
361 return true;
362 }
363
364 }
365
366 /**
367 * If debug is enabled, display the error message array
368 * @access private
369 */
370 private function displayErrors () {
371 echo '<pre>';
372
373 foreach ($this->error as $single_error) {
374 print_r($single_error);
375 }
376
377 echo '</pre>';
378 }
379
380 /**
381 * Takes over from PHP for the socket warning handler
382 * @access private
383 * @param integer $errno
384 * @param string $errstr
385 * @param string $errfile
386 * @param integer $errline
387 */
388 private function catchWarning ($errno, $errstr, $errfile, $errline) {
389 $this->error[] = array(
390 'error' => "Connecting to the POP3 server raised a PHP warning: ",
391 'errno' => $errno,
392 'errstr' => $errstr
393 );
394 }
395
396 // End of class
397}
398?>