File:
1.17.7a/server/base/phpmailer/class.pop3.php (
View as Code)
1: 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 '';
381:
382: foreach ($this->error as $single_error) {
383: print_r($single_error);
384: }
385:
386: echo '';
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: ?>