phpmailer.pop3.php
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:10k
源码类别:

网络

开发平台:

Unix_Linux

  1. <?php
  2. /*~ class.pop3.php
  3. .---------------------------------------------------------------------------.
  4. |  Software: PHPMailer - PHP email class                                    |
  5. |   Version: 2.0.0 rc2                                                      |
  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. |    Author: Andy Prevost (project admininistrator)                         |
  11. |    Author: Brent R. Matzelle (original founder)                           |
  12. | Copyright (c) 2004-2007, Andy Prevost. All Rights Reserved.               |
  13. | Copyright (c) 2001-2003, Brent R. Matzelle                                |
  14. | ------------------------------------------------------------------------- |
  15. |   License: Distributed under the Lesser General Public License (LGPL)     |
  16. |            http://www.gnu.org/copyleft/lesser.html                        |
  17. | This program is distributed in the hope that it will be useful - WITHOUT  |
  18. | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or     |
  19. | FITNESS FOR A PARTICULAR PURPOSE.                                         |
  20. | ------------------------------------------------------------------------- |
  21. | We offer a number of paid services (www.codeworxtech.com):                |
  22. | - Web Hosting on highly optimized fast and secure servers                 |
  23. | - Technology Consulting                                                   |
  24. | - Oursourcing (highly qualified programmers and graphic designers)        |
  25. '---------------------------------------------------------------------------'
  26. /**
  27.  * POP Before SMTP Authentication Class
  28.  * Version 1.0
  29.  *
  30.  * Author: Richard Davey (rich@corephp.co.uk)
  31.  * License: LGPL, see PHPMailer License
  32.  *
  33.  * Specifically for PHPMailer to allow POP before SMTP authentication.
  34.  * Does not yet work with APOP - if you have an APOP account, contact me
  35.  * and we can test changes to this script.
  36.  *
  37.  * This class is based on the structure of the SMTP class by Chris Ryan
  38.  *
  39.  * This class is rfc 1939 compliant and implements all the commands
  40.  * required for POP3 connection, authentication and disconnection.
  41.  *
  42.  * @package PHPMailer
  43.  * @author Richard Davey
  44.  */
  45. class CBPOP3
  46. {
  47.   /**
  48.    * Default POP3 port
  49.    * @var int
  50.    */
  51.   var $POP3_PORT = 110;
  52.   /**
  53.    * Default Timeout
  54.    * @var int
  55.    */
  56.   var $POP3_TIMEOUT = 30;
  57.   /**
  58.    * POP3 Carriage Return + Line Feed
  59.    * @var string
  60.    */
  61.   var $CRLF = "rn";
  62.   /**
  63.    * Displaying Debug warnings? (0 = now, 1+ = yes)
  64.    * @var int
  65.    */
  66.   var $do_debug = 2;
  67.   /**
  68.    * POP3 Mail Server
  69.    * @var string
  70.    */
  71.   var $host;
  72.   /**
  73.    * POP3 Port
  74.    * @var int
  75.    */
  76.   var $port;
  77.   /**
  78.    * POP3 Timeout Value
  79.    * @var int
  80.    */
  81.   var $tval;
  82.   /**
  83.    * POP3 Username
  84.    * @var string
  85.    */
  86.   var $username;
  87.   /**
  88.    * POP3 Password
  89.    * @var string
  90.    */
  91.   var $password;
  92.   /**#@+
  93.    * @access private
  94.    */
  95.   var $pop_conn;
  96.   var $connected;
  97.   var $error;     //  Error log array
  98.   /**#@-*/
  99.   /**
  100.    * Constructor, sets the initial values
  101.    *
  102.    * @return POP3
  103.    */
  104.   function POP3 ()
  105.     {
  106.       $this->pop_conn = 0;
  107.       $this->connected = false;
  108.       $this->error = null;
  109.     }
  110.   /**
  111.    * Combination of public events - connect, login, disconnect
  112.    *
  113.    * @param string $host
  114.    * @param integer $port
  115.    * @param integer $tval
  116.    * @param string $username
  117.    * @param string $password
  118.    */
  119.   function Authorise ($host, $port = false, $tval = false, $username, $password, $debug_level = 0)
  120.   {
  121.     $this->host = $host;
  122.     //  If no port value is passed, retrieve it
  123.     if ($port == false)
  124.     {
  125.       $this->port = $this->POP3_PORT;
  126.     }
  127.     else
  128.     {
  129.       $this->port = $port;
  130.     }
  131.     //  If no port value is passed, retrieve it
  132.     if ($tval == false)
  133.     {
  134.       $this->tval = $this->POP3_TIMEOUT;
  135.     }
  136.     else
  137.     {
  138.       $this->tval = $tval;
  139.     }
  140.     $this->do_debug = $debug_level;
  141.     $this->username = $username;
  142.     $this->password = $password;
  143.     //  Refresh the error log
  144.       $this->error = null;
  145.       //  Connect
  146.     $result = $this->Connect($this->host, $this->port, $this->tval);
  147.     if ($result)
  148.     {
  149.       $login_result = $this->Login($this->username, $this->password);
  150.       if ($login_result)
  151.       {
  152.         $this->Disconnect();
  153.         return true;
  154.       }
  155.     }
  156.     //  We need to disconnect regardless if the login succeeded
  157.     $this->Disconnect();
  158.     return false;
  159.   }
  160.   /**
  161.    * Connect to the POP3 server
  162.    *
  163.    * @param string $host
  164.    * @param integer $port
  165.    * @param integer $tval
  166.    * @return boolean
  167.    */
  168.   function Connect ($host, $port = false, $tval = 30)
  169.     {
  170.     //  Are we already connected?
  171.     if ($this->connected)
  172.     {
  173.       return true;
  174.     }
  175.     /*
  176.       On Windows this will raise a PHP Warning error if the hostname doesn't exist.
  177.       Rather than supress it with @fsockopen, let's capture it cleanly instead
  178.     */
  179.     set_error_handler(array(&$this, 'catchWarning'));
  180.     //  Connect to the POP3 server
  181.     $this->pop_conn = fsockopen($host,    //  POP3 Host
  182.                   $port,    //  Port #
  183.                   $errno,   //  Error Number
  184.                   $errstr,  //  Error Message
  185.                   $tval);   //  Timeout (seconds)
  186.     //  Restore the error handler
  187.     restore_error_handler();
  188.     //  Does the Error Log now contain anything?
  189.     if ($this->error && $this->do_debug >= 1)
  190.     {
  191.         $this->displayErrors();
  192.     }
  193.     //  Did we connect?
  194.       if ($this->pop_conn == false)
  195.       {
  196.         //  It would appear not...
  197.         $this->error = array(
  198.           'error' => "Failed to connect to server $host on port $port",
  199.           'errno' => $errno,
  200.           'errstr' => $errstr
  201.         );
  202.         if ($this->do_debug >= 1)
  203.         {
  204.           $this->displayErrors();
  205.         }
  206.         return false;
  207.       }
  208.       //  Increase the stream time-out
  209.       //  Check for PHP 4.3.0 or later
  210.       if (version_compare(phpversion(), '4.3.0', 'ge'))
  211.       {
  212.         stream_set_timeout($this->pop_conn, $tval, 0);
  213.       }
  214.       else
  215.       {
  216.         //  Does not work on Windows
  217.         if (substr(PHP_OS, 0, 3) !== 'WIN')
  218.         {
  219.           socket_set_timeout($this->pop_conn, $tval, 0);
  220.         }
  221.       }
  222.     //  Get the POP3 server response
  223.       $pop3_response = $this->getResponse();
  224.       //  Check for the +OK
  225.       if ($this->checkResponse($pop3_response))
  226.       {
  227.       //  The connection is established and the POP3 server is talking
  228.       $this->connected = true;
  229.         return true;
  230.       }
  231.     }
  232.     /**
  233.      * Login to the POP3 server (does not support APOP yet)
  234.      *
  235.      * @param string $username
  236.      * @param string $password
  237.      * @return boolean
  238.      */
  239.     function Login ($username = '', $password = '')
  240.     {
  241.       if ($this->connected == false)
  242.       {
  243.         $this->error = 'Not connected to POP3 server';
  244.         if ($this->do_debug >= 1)
  245.         {
  246.           $this->displayErrors();
  247.         }
  248.       }
  249.       if (empty($username))
  250.       {
  251.         $username = $this->username;
  252.       }
  253.       if (empty($password))
  254.       {
  255.         $password = $this->password;
  256.       }
  257.     $pop_username = "USER $username" . $this->CRLF;
  258.     $pop_password = "PASS $password" . $this->CRLF;
  259.       //  Send the Username
  260.       $this->sendString($pop_username);
  261.       $pop3_response = $this->getResponse();
  262.       if ($this->checkResponse($pop3_response))
  263.       {
  264.         //  Send the Password
  265.         $this->sendString($pop_password);
  266.         $pop3_response = $this->getResponse();
  267.         if ($this->checkResponse($pop3_response))
  268.         {
  269.           return true;
  270.         }
  271.         else
  272.         {
  273.           return false;
  274.         }
  275.       }
  276.       else
  277.       {
  278.         return false;
  279.       }
  280.     }
  281.     /**
  282.      * Disconnect from the POP3 server
  283.      */
  284.     function Disconnect ()
  285.     {
  286.       $this->sendString('QUIT');
  287.       fclose($this->pop_conn);
  288.     }
  289.     /*
  290.       ---------------
  291.       Private Methods
  292.       ---------------
  293.     */
  294.     /**
  295.      * Get the socket response back.
  296.      * $size is the maximum number of bytes to retrieve
  297.      *
  298.      * @param integer $size
  299.      * @return string
  300.      */
  301.     function getResponse ($size = 128)
  302.     {
  303.       $pop3_response = fgets($this->pop_conn, $size);
  304.       return $pop3_response;
  305.     }
  306.     /**
  307.      * Send a string down the open socket connection to the POP3 server
  308.      *
  309.      * @param string $string
  310.      * @return integer
  311.      */
  312.     function sendString ($string)
  313.     {
  314.       $bytes_sent = fwrite($this->pop_conn, $string, strlen($string));
  315.       return $bytes_sent;
  316.     }
  317.     /**
  318.      * Checks the POP3 server response for +OK or -ERR
  319.      *
  320.      * @param string $string
  321.      * @return boolean
  322.      */
  323.     function checkResponse ($string)
  324.     {
  325.       if (substr($string, 0, 3) !== '+OK')
  326.       {
  327.         $this->error = array(
  328.           'error' => "Server reported an error: $string",
  329.           'errno' => 0,
  330.           'errstr' => ''
  331.         );
  332.         if ($this->do_debug >= 1)
  333.         {
  334.           $this->displayErrors();
  335.         }
  336.         return false;
  337.       }
  338.       else
  339.       {
  340.         return true;
  341.       }
  342.     }
  343.     /**
  344.      * If debug is enabled, display the error message array
  345.      *
  346.      */
  347.     function displayErrors ()
  348.     {
  349.       echo '<pre>';
  350.       foreach ($this->error as $single_error)
  351.     {
  352.         print_r($single_error);
  353.     }
  354.       echo '</pre>';
  355.     }
  356.   /**
  357.    * Takes over from PHP for the socket warning handler
  358.    *
  359.    * @param integer $errno
  360.    * @param string $errstr
  361.    * @param string $errfile
  362.    * @param integer $errline
  363.    */
  364.   function catchWarning ($errno, $errstr, $errfile, $errline)
  365.   {
  366.     $this->error[] = array(
  367.       'error' => "Connecting to the POP3 server raised a PHP warning: ",
  368.       'errno' => $errno,
  369.       'errstr' => $errstr
  370.     );
  371.   }
  372.   //  End of class
  373. }
  374. ?>