_positions) - 1; } /** * get a list of messages with number and size * * @param int number of message * @return int|array size of given message of list with all messages as array(num => size) */ public function getSize($id = 0) { if($id) { return $id == 1 ? $this->_positions[0] : $this->_positions[$id - 1] - $this->_positions[$id - 2]; } $result = array(); $lastPos = 0; foreach($this->_positions as $num => $pos) { $result[$num + 1] = $pos - $lastPos; $lastPos = $pos; } return $result; } private function _goto($id) { fseek($this->_fh, $id == 0 ? 0 : $this->_positions[$id - 1]); fgets($this->_fh); // consume first line (mbox marker) return $this->_positions[$id]; } /** * * get a message with headers and body * * @param int number of message * @return Zend_Mail_Message */ public function getMessage($id) { // TODO: error handling! $endPos = $this->_goto($id); $message = ''; while(ftell($this->_fh) < $endPos) { $message .= fgets($this->_fh); } return new Zend_Mail_Message($message); } /** * * get a message with only header and $bodyLines lines of body * * @param int number of message * @param int also retrieve this number of body lines * @return Zend_Mail_Message */ public function getHeader($id, $bodyLines = 0) { // TODO: error handling! $endPos = $this->_goto($id); $inHeader = true; $message = ''; while(ftell($this->_fh) < $endPos && ($inHeader || $bodyLines--)) { $line = fgets($this->_fh); if($inHeader && !trim($line)) { if(!$bodyLines) { break; } else { $inHeader = false; } } $message .= $line; } if(!$inHeader) { return new Zend_Mail_Message($message); } else { return new Zend_Mail_Message('', $message); } } /** * * create instance with parameters * Supported parameters are: * - filename filename of mbox file * * @params array mail reader specific parameters * @throws Zend_Mail_Exception */ public function __construct($params) { if(!isset($params['filename']) /* || Zend::isReadable($params['filename']) */) { Zend::loadClass('Zend_Mail_Read_Autodetect'); $params['filename'] = Zend_Mail_Read_Autodetect::filename('*.mbox', Zend_Mail_Read_Autodetect::INCLUDE_PATH); } $this->_fh = fopen($params['filename'], 'r'); if(!$this->_fh) { throw new Zend_Mail_Exception('cannot open mbox file'); } $line = fgets($this->_fh); if(strpos($line, 'From ') !== 0) { throw new Zend_Mail_Exception('file is not a valid mbox format'); fclose($this->_fh); } while(($line = fgets($this->_fh)) !== false) { if(strpos($line, 'From ') === 0) { $this->_positions[] = ftell($this->_fh) - strlen($line); } } $this->_positions[] = ftell($this->_fh); $this->_has['top'] = true; } /** * * Close resource for mail lib. If you need to control, when the resource * is closed. Otherwise the destructor would call this. * */ public function close() { fclose($this->_fh); } /** * * Waste some CPU cycles doing nothing. * */ public function noop() { return true; } /* public function removeMessage() { return false; // not supported } */ } ?>