[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/externals/phpmailer/ -> class.pop3.php (source)

   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) [email protected] |
  12  |          : Marcus Bointon (coolbru) [email protected]         |
  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 ([email protected])
  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  ?>


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1