fh = fopen( $fileName, 'rt' ); } /** * Finds the position of the first message while skipping a possible header. * * Mbox files can contain a header which does not describe an email * message. This method skips over this optional header by checking for a * specific From MAILER-DAEMON header. * * @return int */ private function findFirstMessage() { $data = fgets( $this->fh ); fseek( $this->fh, 0 ); if ( substr( $data, 0, 18 ) === 'From MAILER-DAEMON' ) { return $this->findNextMessage(); } else { return 0; } } /** * Reads through the Mbox file and stops at the next message. * * Messages in Mbox files are separated with lines starting with "From " * and this function reads to the next "From " marker. It then returns the * current posistion in the file. If EOF is detected during reading the * function returns false instead. * * @return int */ private function findNextMessage() { do { $data = fgets( $this->fh ); } while ( !feof( $this->fh ) && substr( $data, 0, 5 ) !== "From " ); if ( feof( $this->fh ) ) { return false; } return ftell( $this->fh ); } /** * This function reads through the whole mbox and returns starting positions of the messages. * * @return array(int=>int) */ public function listMessages() { $messages = array(); fseek( $this->fh, 0 ); // Skip the first mail as this is the mbox header $position = $this->findFirstMessage(); if ( $position === false ) { return $messages; } // Continue reading through the rest of the mbox do { $position = $this->findNextMessage(); if ( $position !== false ) { $messages[] = $position; } } while ( $position !== false ); return $messages; } /** * Returns an ezcMailMboxSet containing all the messages in the mbox. * * @return ezcMailMboxSet */ public function fetchAll() { $messages = $this->listMessages(); return new ezcMailMboxSet( $this->fh, $messages ); } /** * Returns an ezcMailMboxSet containing only the $number -th message in the mbox. * * @throws ezcMailNoSuchMessageException * if the message $number is out of range. * @param int $number * @return ezcMailMboxSet */ public function fetchByMessageNr( $number ) { $messages = $this->listMessages(); if ( !isset( $messages[$number] ) ) { throw new ezcMailNoSuchMessageException( $number ); } return new ezcMailMboxSet( $this->fh, array( 0 => $messages[$number] ) ); } /** * Returns an ezcMailMboxSet with $count messages starting from $offset. * * Fetches $count messages starting from the $offset and returns them as a * ezcMailMboxSet. If $count is not specified or if it is 0, it fetches * all messages starting from the $offset. * * @throws ezcMailInvalidLimitException * if $count is negative. * @throws ezcMailOffsetOutOfRangeException * if $offset is outside of the existing range of messages. * @param int $offset * @param int $count * @return ezcMailMboxSet */ public function fetchFromOffset( $offset, $count = 0 ) { if ( $count < 0 ) { throw new ezcMailInvalidLimitException( $offset, $count ); } $messages = $this->listMessages(); if ( !isset( $messages[$offset] ) ) { throw new ezcMailOffsetOutOfRangeException( $offset, $count ); } if ( $count == 0 ) { $range = array_slice( $messages, $offset ); } else { $range = array_slice( $messages, $offset, $count ); } return new ezcMailMboxSet( $this->fh, $range ); } } ?>