Zend Framework - Zend_Mail
Current view: /usr/local/lib/zend/trunk/incubator/library/Zend/Mail/Storage/Imap.php
Date: Tue Feb 6 18:30:06 CET 2007 Executable lines: 82
Code covered: 87.80% Executed lines: 72
Legend: executed not executed dead code


       1                 : <?php                                                                                                        
       2                 : /**                                                                                                          
       3                 :  * Zend Framework                                                                                            
       4                 :  *                                                                                                           
       5                 :  * LICENSE                                                                                                   
       6                 :  *                                                                                                           
       7                 :  * This source file is subject to version 1.0 of the Zend Framework                                          
       8                 :  * license, that is bundled with this package in the file LICENSE, and                                       
       9                 :  * is available through the world-wide-web at the following URL:                                             
      10                 :  * http://www.zend.com/license/framework/1_0.txt. If you did not receive                                     
      11                 :  * a copy of the Zend Framework license and are unable to obtain it                                          
      12                 :  * through the world-wide-web, please send a note to license@zend.com                                        
      13                 :  * so we can mail you a copy immediately.                                                                    
      14                 :  *                                                                                                           
      15                 :  * @package    Zend_Mail                                                                                     
      16                 :  * @copyright  Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)                      
      17                 :  * @license    http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0              
      18                 :  */                                                                                                          
      19                 :                                                                                                              
      20                 :                                                                                                              
      21                 : /**                                                                                                          
      22                 :  * Zend_Mail_Storage_Abstract                                                                                
      23                 :  */                                                                                                          
      24                 : require_once 'Zend/Mail/Storage/Abstract.php';                                                               
      25                 :                                                                                                              
      26                 : /**                                                                                                          
      27                 :  * Zend_Mail_Transport_Imap                                                                                  
      28                 :  */                                                                                                          
      29                 : require_once 'Zend/Mail/Transport/Imap.php';                                                                 
      30                 :                                                                                                              
      31                 : /**                                                                                                          
      32                 :  * Zend_Mail_Storage_Folder_Interface                                                                        
      33                 :  */                                                                                                          
      34                 : require_once 'Zend/Mail/Storage/Folder/Interface.php';                                                       
      35                 :                                                                                                              
      36                 : /**                                                                                                          
      37                 :  * Zend_Mail_Storage_Folder                                                                                  
      38                 :  */                                                                                                          
      39                 : require_once 'Zend/Mail/Storage/Folder.php';                                                                 
      40                 :                                                                                                              
      41                 : /**                                                                                                          
      42                 :  * Zend_Mail_Message                                                                                         
      43                 :  */                                                                                                          
      44                 : require_once 'Zend/Mail/Message.php';                                                                        
      45                 :                                                                                                              
      46                 : /**                                                                                                          
      47                 :  * Zend_Mail_Storage_Exception                                                                               
      48                 :  */                                                                                                          
      49                 : require_once 'Zend/Mail/Storage/Exception.php';                                                              
      50                 :                                                                                                              
      51                 : /**                                                                                                          
      52                 :  * @package    Zend_Mail                                                                                     
      53                 :  * @copyright  Copyright (c) 2005-2007 Zend Technologies USA Inc. (http://www.zend.com)                      
      54                 :  * @license    http://www.zend.com/license/framework/1_0.txt Zend Framework License version 1.0              
      55                 :  */                                                                                                          
      56                 : class Zend_Mail_Storage_Imap extends Zend_Mail_Storage_Abstract implements Zend_Mail_Storage_Folder_Interface
      57                 : {                                                                                                            
      58                 :     private $_protocol;                                                                                      
      59                 :     private $_currentFolder = '';                                                                            
      60                 :                                                                                                              
      61                 :                                                                                                              
      62                 :     /**                                                                                                      
      63                 :      *                                                                                                       
      64                 :      * Count messages all messages in current box                                                            
      65                 :      * No flags are supported by POP3 (exceptions is thrown)                                                 
      66                 :      *                                                                                                       
      67                 :      * @param int filter by flags                                                                            
      68                 :      * @return int number of messages                                                                        
      69                 :      * @throws Zend_Mail_Storage_Exception                                                                   
      70                 :      */                                                                                                      
      71                 :     public function countMessages($flags = null)                                                             
      72                 :     {                                                                                                        
      73               3 :         if(!$this->_currentFolder) {                                                                         
      74               1 :             throw new Zend_Mail_Storage_Exception('No selected folder to count');                            
      75                 :         }                                                                                                    
      76               2 :         $result = $this->_protocol->examine($this->_currentFolder);                                          
      77               2 :         return $result['exists'];                                                                            
      78                 :     }                                                                                                        
      79                 :                                                                                                              
      80                 :     /**                                                                                                      
      81                 :      * get a list of messages with number and size                                                           
      82                 :      *                                                                                                       
      83                 :      * @param int number of message                                                                          
      84                 :      * @return int|array size of given message of list with all messages as array(num => size)               
      85                 :      */                                                                                                      
      86                 :     public function getSize($id = 0)                                                                         
      87                 :     {                                                                                                        
      88               3 :         if($id) {                                                                                            
      89               1 :             return $this->_protocol->fetch('RFC822.SIZE', $id);                                              
      90                 :         }                                                                                                    
      91               2 :         return $this->_protocol->fetch('RFC822.SIZE', 1, INF);                                               
      92                 :     }                                                                                                        
      93                 :                                                                                                              
      94                 :     /**                                                                                                      
      95                 :      *                                                                                                       
      96                 :      * get a message with headers and body                                                                   
      97                 :      *                                                                                                       
      98                 :      * @param int number of message                                                                          
      99                 :      * @return Zend_Mail_Message                                                                             
     100                 :      */                                                                                                      
     101                 :     public function getMessage($id)                                                                          
     102                 :     {                                                                                                        
     103               4 :         $header = $this->_protocol->fetch('RFC822.HEADER', $id);                                             
     104               4 :         return new Zend_Mail_Message(array('handler' => $this, 'id' => $id, 'headers' => $header));          
     105                 :     }                                                                                                        
     106                 :                                                                                                              
     107                 :     public function getRaw($id, $part)                                                                       
     108                 :     {                                                                                                        
     109                 :         // TODO: indexes for header and content should be changed to negative numbers                        
     110                 :         switch($part) {                                                                                      
     111               1 :             case 'header':                                                                                   
     112               0 :                 return $this->_protocol->fetch('RFC822.HEADER', $id);                                        
     113                 :                 break;                                                                                       
     114               1 :             case 'content':                                                                                  
     115               1 :                 return $this->_protocol->fetch('RFC822.TEXT', $id);                                          
     116                 :                 break;                                                                                       
     117               0 :             default:                                                                                         
     118                 :                 // fall through                                                                              
     119               0 :         }                                                                                                    
     120                 :                                                                                                              
     121                 :         // TODO: check for number or mime type                                                               
     122               0 :         throw new Zend_Mail_Storage_Exception('part not found');                                             
     123                 :     }                                                                                                        
     124                 :                                                                                                              
     125                 :                                                                                                              
     126                 :     /**                                                                                                      
     127                 :      *                                                                                                       
     128                 :      * create instance with parameters                                                                       
     129                 :      * Supported paramters are                                                                               
     130                 :      *   - host hostname or ip address of IMAP server                                                        
     131                 :      *   - user username                                                                                     
     132                 :      *   - password password for user 'username' [optional, default = '']                                    
     133                 :      *   - port port for IMAP server [optional, default = 110]                                               
     134                 :      *   - ssl 'SSL' or 'TLS' for secure sockets                                                             
     135                 :      *   - folder select this folder [optional, default = 'INBOX']                                           
     136                 :      *                                                                                                       
     137                 :      * @param  $params array  mail reader specific parameters                                                
     138                 :      * @throws Zend_Mail_Storage_Exception                                                                   
     139                 :      */                                                                                                      
     140                 :     public function __construct($params)                                                                     
     141                 :     {                                                                                                        
     142              29 :         if($params instanceof Zend_Mail_Transport_Imap) {                                                    
     143               1 :             $this->_protocol = $params;                                                                      
     144                 :             try {                                                                                            
     145               1 :                 $this->selectFolder('INBOX');                                                                
     146               1 :             } catch(Zend_Mail_Storage_Exception $e) {                                                        
     147               0 :                 throw Zend_Mail_Storage_Exception('cannot select INBOX, is this a valid transport?');        
     148                 :             }                                                                                                
     149               1 :             return;                                                                                          
     150                 :         }                                                                                                    
     151                 :                                                                                                              
     152              28 :         if(!isset($params['user'])) {                                                                        
     153               1 :             throw new Zend_Mail_Storage_Exception('need at least user in params');                           
     154                 :         }                                                                                                    
     155                 :                                                                                                              
     156              27 :         $params['host']     = isset($params['host'])     ? $params['host']     : 'localhost';                
     157              27 :         $params['password'] = isset($params['password']) ? $params['password'] : '';                         
     158              27 :         $params['port']     = isset($params['port'])     ? $params['port']     : null;                       
     159              27 :         $params['ssl']      = isset($params['ssl'])      ? $params['ssl']      : false;                      
     160                 :                                                                                                              
     161              27 :         $this->_protocol = new Zend_Mail_Transport_Imap();                                                   
     162              27 :         $this->_protocol->connect($params['host'], $params['port'], $params['ssl']);                         
     163              24 :         if(!$this->_protocol->login($params['user'], $params['password'])) {                                 
     164               1 :             throw new Zend_Mail_Storage_Exception('cannot login, user or password wrong');                   
     165                 :         }                                                                                                    
     166              23 :         $this->selectFolder(isset($params['folder']) ? $params['folder'] : 'INBOX');                         
     167              21 :     }                                                                                                        
     168                 :                                                                                                              
     169                 :                                                                                                              
     170                 :     /**                                                                                                      
     171                 :      *                                                                                                       
     172                 :      * public destructor                                                                                     
     173                 :      */                                                                                                      
     174                 :     public function __destruct()                                                                             
     175                 :     {                                                                                                        
     176              22 :         $this->close();                                                                                      
     177              22 :     }                                                                                                        
     178                 :                                                                                                              
     179                 :     /**                                                                                                      
     180                 :      *                                                                                                       
     181                 :      * Close resource for mail lib. If you need to control, when the resource                                
     182                 :      * is closed. Otherwise the destructor would call this.                                                  
     183                 :      *                                                                                                       
     184                 :      */                                                                                                      
     185                 :     public function close()                                                                                  
     186                 :     {                                                                                                        
     187              22 :         $this->_currentFolder = '';                                                                          
     188              22 :         $this->_protocol->logout();                                                                          
     189              22 :     }                                                                                                        
     190                 :                                                                                                              
     191                 :     /**                                                                                                      
     192                 :      *                                                                                                       
     193                 :      * Keep the server busy.                                                                                 
     194                 :      *                                                                                                       
     195                 :      */                                                                                                      
     196                 :     public function noop()                                                                                   
     197                 :     {                                                                                                        
     198                 :         // TODO: real noop                                                                                   
     199               0 :         return false;                                                                                        
     200                 : //        return $this->_protocol->noop();                                                                   
     201                 :     }                                                                                                        
     202                 :                                                                                                              
     203                 :     /**                                                                                                      
     204                 :      *                                                                                                       
     205                 :      * Remove a message from server. If you're doing that from a web enviroment                              
     206                 :      * you should be careful and use a uniqueid as parameter if possible to                                  
     207                 :      * identify the message.                                                                                 
     208                 :      *                                                                                                       
     209                 :      * @param int number of message                                                                          
     210                 :      */                                                                                                      
     211                 :     public function removeMessage($id)                                                                       
     212                 :     {                                                                                                        
     213                 :         // TODO: real remove                                                                                 
     214               0 :         return false;                                                                                        
     215                 : //        $this->_protocol->delete($id);                                                                     
     216                 :     }                                                                                                        
     217                 :                                                                                                              
     218                 :     /**                                                                                                      
     219                 :      *                                                                                                       
     220                 :      * Special handling for hasTop. The headers of the first message is                                      
     221                 :      * retrieved if Top wasn't needed/tried yet.                                                             
     222                 :      *                                                                                                       
     223                 :      * @see Zend_Mail_Storage_Abstract:__get()                                                               
     224                 :      */                                                                                                      
     225                 :     public function __get($var)                                                                              
     226                 :     {                                                                                                        
     227               1 :         return parent::__get($var);                                                                          
     228                 :     }                                                                                                        
     229                 :                                                                                                              
     230                 :     /**                                                                                                      
     231                 :      * get root folder or given folder                                                                       
     232                 :      *                                                                                                       
     233                 :      * @param string $rootFolder get folder structure for given folder, else root                            
     234                 :      * @return Zend_Mail_Storage_Folder root or wanted folder                                                
     235                 :      */                                                                                                      
     236                 :     public function getFolders($rootFolder = null)                                                           
     237                 :     {                                                                                                        
     238               4 :         $folders = $this->_protocol->listMailbox((string)$rootFolder);                                       
     239               4 :         if(!$folders) {                                                                                      
     240               0 :             throw new Zend_Mail_Storage_Exception('folder not found');                                       
     241                 :         }                                                                                                    
     242                 :                                                                                                              
     243               4 :         ksort($folders, SORT_STRING);                                                                        
     244               4 :         $root = new Zend_Mail_Storage_Folder('/', '/', false);                                               
     245               4 :         $stack = array(null);                                                                                
     246               4 :         $folderStack = array(null);                                                                          
     247               4 :         $parentFolder = $root;                                                                               
     248               4 :         $parent = '';                                                                                        
     249                 :                                                                                                              
     250               4 :         foreach($folders as $globalName => $data) {                                                          
     251                 :             do {                                                                                             
     252               4 :                 if(!$parent || strpos($globalName, $parent) === 0) {                                         
     253               4 :                     $pos = strrpos($globalName, $data['delim']);                                             
     254               4 :                     if($pos === false) {                                                                     
     255               4 :                         $localName = $globalName;                                                            
     256               4 :                     } else {                                                                                 
     257               4 :                         $localName = substr($globalName, $pos + 1);                                          
     258                 :                     }                                                                                        
     259               4 :                     $selectable = !$data['flags'] || !in_array('\\Noselect', $data['flags']);                
     260                 :                                                                                                              
     261               4 :                     array_push($stack, $parent);                                                             
     262               4 :                     $parent = $globalName . $data['delim'];                                                  
     263               4 :                     $folder = new Zend_Mail_Storage_Folder($localName, $globalName, $selectable);            
     264               4 :                     $parentFolder->$localName = $folder;                                                     
     265               4 :                     array_push($folderStack, $parentFolder);                                                 
     266               4 :                     $parentFolder = $folder;                                                                 
     267               4 :                     break;                                                                                   
     268               4 :                 } else if($stack) {                                                                          
     269               4 :                     $parent = array_pop($stack);                                                             
     270               4 :                     $parentFolder = array_pop($folderStack);                                                 
     271               4 :                 }                                                                                            
     272               0 :             } while($stack);                                                                                 
     273               4 :             if(!$stack) {                                                                                    
     274               0 :                 throw new Zend_Mail_Storage_Exception('error while constructing folder tree');               
     275                 :             }                                                                                                
     276               4 :         }                                                                                                    
     277                 :                                                                                                              
     278               4 :         return $root;                                                                                        
     279                 :     }                                                                                                        
     280                 :                                                                                                              
     281                 :     /**                                                                                                      
     282                 :      * select given folder                                                                                   
     283                 :      *                                                                                                       
     284                 :      * folder must be selectable!                                                                            
     285                 :      *                                                                                                       
     286                 :      * @param Zend_Mail_Storage_Folder|string global name of folder or instance for subfolder                
     287                 :      * @throws Zend_Mail_Storage_Exception                                                                   
     288                 :      */                                                                                                      
     289                 :     public function selectFolder($globalName)                                                                
     290                 :     {                                                                                                        
     291              24 :         $this->_currentFolder = $globalName;                                                                 
     292              24 :         if(!$this->_protocol->select($this->_currentFolder)) {                                               
     293               3 :             $this->_currentFolder = '';                                                                      
     294               3 :             throw new Zend_Mail_Storage_Exception('cannot change folder, maybe it does not exist');          
     295                 :         }                                                                                                    
     296              22 :     }                                                                                                        
     297                 :                                                                                                              
     298                 :                                                                                                              
     299                 :     /**                                                                                                      
     300                 :      * get Zend_Mail_Storage_Folder instance for current folder                                              
     301                 :      *                                                                                                       
     302                 :      * @return Zend_Mail_Storage_Folder instance of current folder                                           
     303                 :      * @throws Zend_Mail_Storage_Exception                                                                   
     304                 :      */                                                                                                      
     305                 :     public function getCurrentFolder()                                                                       
     306                 :     {                                                                                                        
     307               1 :         return $this->_currentFolder;                                                                        
     308                 :     }                                                                                                        
     309                 : }                                                                                                            
     310                 : 

Generated by: PHPUnit 3.0.0 and Xdebug 2.0.0RC2-dev.