# File Source for class.pop3.php

# Source for file class.pop3.php

Documentation is available at class.pop3.php

    <?php
    /*~ class.pop3.php
    .---------------------------------------------------------------------------.
    |  Software: PHPMailer - PHP email class                                    |
    |   Version: 2.0.4                                                          |
    |   Contact: via sourceforge.net support pages (also www.codeworxtech.com)  |
    |      Info: http://phpmailer.sourceforge.net                               |
    |   Support: http://sourceforge.net/projects/phpmailer/                     |
    | ------------------------------------------------------------------------- |
    |    Author: Andy Prevost (project admininistrator)                         |
    |    Author: Brent R. Matzelle (original founder)                           |
    | Copyright (c) 2004-2007, Andy Prevost. All Rights Reserved.               |
    | Copyright (c) 2001-2003, Brent R. Matzelle                                |
    | ------------------------------------------------------------------------- |
    |   License: Distributed under the Lesser General Public License (LGPL)     |
    |            http://www.gnu.org/copyleft/lesser.html                        |
    | This program is distributed in the hope that it will be useful - WITHOUT  |
    | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or     |
    | FITNESS FOR A PARTICULAR PURPOSE.                                         |
    | ------------------------------------------------------------------------- |
    | We offer a number of paid services (www.codeworxtech.com):                |
    | - Web Hosting on highly optimized fast and secure servers                 |
    | - Technology Consulting                                                   |
    | - Oursourcing (highly qualified programmers and graphic designers)        |
    '---------------------------------------------------------------------------'

    /**
     * POP Before SMTP Authentication Class
     *
     * Author: Richard Davey (rich@corephp.co.uk)
     * License: LGPL, see PHPMailer License
     *
     * Specifically for PHPMailer to allow POP before SMTP authentication.
     * Does not yet work with APOP - if you have an APOP account, contact me
     * and we can test changes to this script.
     *
     * This class is based on the structure of the SMTP class by Chris Ryan
     *
     * This class is rfc 1939 compliant and implements all the commands
     * required for POP3 connection, authentication and disconnection.
     *
     * @package PHPMailer
     * @author Richard Davey
     */

    class POP3
    {
      /**
       * Default POP3 port
       * @var int
       */
      var $POP3_PORT = 110;

      /**
       * Default Timeout
       * @var int
       */
      var $POP3_TIMEOUT = 30;

      /**
       * POP3 Carriage Return + Line Feed
       * @var string
       */
      var $CRLF = "\r\n";

      /**
       * Displaying Debug warnings? (0 = now, 1+ = yes)
       * @var int
       */
      var $do_debug = 2;

      /**
       * POP3 Mail Server
       * @var string
       */
      var $host;

      /**
       * POP3 Port
       * @var int
       */
      var $port;

      /**
       * POP3 Timeout Value
       * @var int
       */
      var $tval;

      /**
       * POP3 Username
       * @var string
       */
      var $username;

      /**
       * POP3 Password
       * @var string
       */
      var $password;

      /**#@+
       * @access private
       */
      var $pop_conn;
      var $connected;
      var $error;     //  Error log array

      /**#@-*/

      /**
       * Constructor, sets the initial values
       *
       * @return POP3
       */
      function POP3 ()
        {
          $this->pop_conn = 0;
          $this->connected = false;
          $this->error = null;
        }

      /**
       * Combination of public events - connect, login, disconnect
       *
       * @param string $host
       * @param integer $port
       * @param integer $tval
       * @param string $username
       * @param string $password
       */
      function Authorise ($host, $port = false, $tval = false, $username, $password, $debug_level = 0)
      {
        $this->host = $host;

        //  If no port value is passed, retrieve it
        if ($port == false)
        {
          $this->port = $this->POP3_PORT;
        }
        else
        {
          $this->port = $port;
        }

        //  If no port value is passed, retrieve it
        if ($tval == false)
        {
          $this->tval = $this->POP3_TIMEOUT;
        }
        else
        {
          $this->tval = $tval;
        }

        $this->do_debug = $debug_level;
        $this->username = $username;
        $this->password = $password;

        //  Refresh the error log
          $this->error = null;

          //  Connect
        $result = $this->Connect($this->host, $this->port, $this->tval);

        if ($result)
        {
          $login_result = $this->Login($this->username, $this->password);

          if ($login_result)
          {
            $this->Disconnect();

            return true;
          }

        }

        //  We need to disconnect regardless if the login succeeded
        $this->Disconnect();

        return false;
      }

      /**
       * Connect to the POP3 server
       *
       * @param string $host
       * @param integer $port
       * @param integer $tval
       * @return boolean
       */
      function Connect ($host, $port = false, $tval = 30)
        {
        //  Are we already connected?
        if ($this->connected)
        {
          return true;
        }

        /*
          On Windows this will raise a PHP Warning error if the hostname doesn't exist.
          Rather than supress it with @fsockopen, let's capture it cleanly instead
        */

        set_error_handler(array(&$this, 'catchWarning'));

        //  Connect to the POP3 server
        $this->pop_conn = fsockopen($host,    //  POP3 Host
                      $port,    //  Port #
                      $errno,   //  Error Number
                      $errstr,  //  Error Message
                      $tval);   //  Timeout (seconds)

        //  Restore the error handler
        restore_error_handler();

        //  Does the Error Log now contain anything?
        if ($this->error && $this->do_debug >= 1)
        {
            $this->displayErrors();
        }

        //  Did we connect?
          if ($this->pop_conn == false)
          {
            //  It would appear not...
            $this->error = array(
              'error' => "Failed to connect to server $host on port $port",
              'errno' => $errno,
              'errstr' => $errstr
            );

            if ($this->do_debug >= 1)
            {
              $this->displayErrors();
            }

            return false;
          }

          //  Increase the stream time-out

          //  Check for PHP 4.3.0 or later
          if (version_compare(phpversion(), '4.3.0', 'ge'))
          {
            stream_set_timeout($this->pop_conn, $tval, 0);
          }
          else
          {
            //  Does not work on Windows
            if (substr(PHP_OS, 0, 3) !== 'WIN')
            {
              socket_set_timeout($this->pop_conn, $tval, 0);
            }
          }

        //  Get the POP3 server response
          $pop3_response = $this->getResponse();

          //  Check for the +OK
          if ($this->checkResponse($pop3_response))
          {
          //  The connection is established and the POP3 server is talking
          $this->connected = true;
            return true;
          }

        }

        /**
         * Login to the POP3 server (does not support APOP yet)
         *
         * @param string $username
         * @param string $password
         * @return boolean
         */
        function Login ($username = '', $password = '')
        {
          if ($this->connected == false)
          {
            $this->error = 'Not connected to POP3 server';

            if ($this->do_debug >= 1)
            {
              $this->displayErrors();
            }
          }

          if (empty($username))
          {
            $username = $this->username;
          }

          if (empty($password))
          {
            $password = $this->password;
          }

        $pop_username = "USER $username" . $this->CRLF;
        $pop_password = "PASS $password" . $this->CRLF;

          //  Send the Username
          $this->sendString($pop_username);
          $pop3_response = $this->getResponse();

          if ($this->checkResponse($pop3_response))
          {
            //  Send the Password
            $this->sendString($pop_password);
            $pop3_response = $this->getResponse();

            if ($this->checkResponse($pop3_response))
            {
              return true;
            }
            else
            {
              return false;
            }
          }
          else
          {
            return false;
          }
        }

        /**
         * Disconnect from the POP3 server
         */
        function Disconnect ()
        {
          $this->sendString('QUIT');

          fclose($this->pop_conn);
        }

        /*
          ---------------
          Private Methods
          ---------------
        */

        /**
         * Get the socket response back.
         * $size is the maximum number of bytes to retrieve
         *
         * @param integer $size
         * @return string
         */
        function getResponse ($size = 128)
        {
          $pop3_response = fgets($this->pop_conn, $size);

          return $pop3_response;
        }

        /**
         * Send a string down the open socket connection to the POP3 server
         *
         * @param string $string
         * @return integer
         */
        function sendString ($string)
        {
          $bytes_sent = fwrite($this->pop_conn, $string, strlen($string));

          return $bytes_sent;

        }

        /**
         * Checks the POP3 server response for +OK or -ERR
         *
         * @param string $string
         * @return boolean
         */
        function checkResponse ($string)
        {
          if (substr($string, 0, 3) !== '+OK')
          {
            $this->error = array(
              'error' => "Server reported an error: $string",
              'errno' => 0,
              'errstr' => ''
            );

            if ($this->do_debug >= 1)
            {
              $this->displayErrors();
            }

            return false;
          }
          else
          {
            return true;
          }

        }

        /**
         * If debug is enabled, display the error message array
         *
         */
        function displayErrors ()
        {
          echo '<pre>';

          foreach ($this->error as $single_error)
        {
            print_r($single_error);
        }

          echo '</pre>';
        }

      /**
       * Takes over from PHP for the socket warning handler
       *
       * @param integer $errno
       * @param string $errstr
       * @param string $errfile
       * @param integer $errline
       */
      function catchWarning ($errno, $errstr, $errfile, $errline)
      {
        $this->error[] = array(
          'error' => "Connecting to the POP3 server raised a PHP warning: ",
          'errno' => $errno,
          'errstr' => $errstr
        );
      }

      //  End of class

    }
    ?>

Documentation generated on Thu, 02 Apr 2009 21:19:49 -0400 by phpDocumentor 1.3.0RC3