blob: fef2a83e3c7b3f616fceae77e95f8bdf47a32ed6 [file] [log] [blame]
<?php
/**
* File containing the ezcMailParser class
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @package Mail
* @version //autogen//
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*/
/**
* Parses a mail in RFC822 format to an ezcMail structure.
*
* By default an object of class {@link ezcMail} is returned by the parser. If
* you want to use your own mail class (which extends {@link ezcMail}),
* use {@link ezcMailParserOptions}. Example:
*
* <code>
* $options = new ezcMailParserOptions();
* $options->mailClass = 'myCustomMailClass'; // extends ezcMail
*
* $parser = new ezcMailParser( $options );
* </code>
*
* Another way to do this is:
* <code>
* $parser = new ezcMailParser();
* $parser->options->mailClass = 'myCustomMailClass'; // extends ezcMail
* </code>
*
* File attachments will be written to disk in a temporary directory.
* This temporary directory and the file attachment will be removed
* when PHP ends execution. If you want to keep the file you should move it
* to another directory.
*
* By default objects of class {@link ezcMailFile} are created to handle file
* attachments. If you want to use your own file class (which extends
* {@link ezcMailFile}), use {@link ezcMailParserOptions}. Example:
*
* <code>
* $options = new ezcMailParserOptions();
* $options->fileClass = 'myCustomFileClass'; // extends ezcMailFile
*
* $parser = new ezcMailParser( $options );
* </code>
*
* Another way to do this is:
* <code>
* $parser = new ezcMailParser();
* $parser->options->fileClass = 'myCustomFileClass'; // extends ezcMailFile
* </code>
*
* By default objects of class {@link ezcMailTextPart} are created for text
* attachments. If you want to use ezcMailFile objects instead, use
* {@link ezcMailParserOptions}. Example:
*
* <code>
* $options = new ezcMailParserOptions();
* $options->parseTextAttachmentsAsFiles = true;
*
* $parser = new ezcMailParser( $options );
* </code>
*
* Another way to do this is:
* <code>
* $parser = new ezcMailParser();
* $parser->options->parseTextAttachmentsAsFiles = true;
* </code>
*
* @property ezcMailParserOptions $options
* Holds the options you can set to the mail parser.
*
* @package Mail
* @version //autogen//
* @mainclass
*/
class ezcMailParser
{
/**
* Holds the parser of the current mail.
*
* @var ezcMailPartParser
*/
private $partParser = null;
/**
* Holds the directory where parsed mail should store temporary files.
*
* @var string
*/
private static $tmpDir = null;
/**
* Holds options you can be set to the mail parser.
*
* @var ezcMailParserOptions
*/
private $options;
/**
* Constructs a new mail parser.
*
* For options you can set to the mail parser see {@link ezcMailParserOptions}.
*
* @throws ezcBasePropertyNotFoundException
* if $options contains a property not defined
* @throws ezcBaseValueException
* if $options contains a property with a value not allowed
* @param ezcMailParserOptions|array(string=>mixed) $options
*/
public function __construct( $options = array() )
{
if ( $options instanceof ezcMailParserOptions )
{
$this->options = $options;
}
else if ( is_array( $options ) )
{
$this->options = new ezcMailParserOptions( $options );
}
else
{
throw new ezcBaseValueException( "options", $options, "ezcMailParserOptions|array" );
}
}
/**
* Sets the property $name to $value.
*
* @throws ezcBasePropertyNotFoundException
* if the property $name does not exist
* @throws ezcBaseValueException
* if $value is not accepted for the property $name
* @param string $name
* @param mixed $value
* @ignore
*/
public function __set( $name, $value )
{
switch ( $name )
{
case 'options':
if ( !( $value instanceof ezcMailParserOptions ) )
{
throw new ezcBaseValueException( 'options', $value, 'instanceof ezcMailParserOptions' );
}
$this->options = $value;
break;
default:
throw new ezcBasePropertyNotFoundException( $name );
}
}
/**
* Returns the value of the property $name.
*
* @throws ezcBasePropertyNotFoundException
* if the property $name does not exist
* @param string $name
* @ignore
*/
public function __get( $name )
{
switch ( $name )
{
case 'options':
return $this->options;
default:
throw new ezcBasePropertyNotFoundException( $name );
}
}
/**
* Returns true if the property $name is set, otherwise false.
*
* @param string $name
* @return bool
* @ignore
*/
public function __isset( $name )
{
switch ( $name )
{
case 'options':
return true;
default:
return false;
}
}
/**
* Returns an array of ezcMail objects parsed from the mail set $set.
*
* You can optionally use ezcMailParserOptions to provide an alternate class
* name which will be instantiated instead of ezcMail, if you need to extend
* ezcMail.
*
* Example:
* <code>
* $options = new ezcMailParserOptions();
* $options->mailClass = 'MyMailClass';
*
* $parser = new ezcMailParser( $options );
* // if you want to use MyMailClass which extends ezcMail
* </code>
*
* @apichange Remove second parameter
*
* @throws ezcBaseFileNotFoundException
* if a neccessary temporary file could not be openened.
* @param ezcMailParserSet $set
* @param string $class Deprecated. Use $mailClass in ezcMailParserOptions class instead.
* @return array(ezcMail)
*/
public function parseMail( ezcMailParserSet $set, $class = null )
{
$mail = array();
if ( !$set->hasData() )
{
return $mail;
}
if ( $class === null )
{
$class = $this->options->mailClass;
}
do
{
$this->partParser = new ezcMailRfc822Parser();
$data = "";
$size = 0;
while ( ( $data = $set->getNextLine() ) !== null )
{
$this->partParser->parseBody( $data );
$size += strlen( $data );
}
$part = $this->partParser->finish( $class );
$part->size = $size;
$mail[] = $part;
} while ( $set->nextMail() );
return $mail;
}
/**
* Sets the temporary directory.
*
* The temporary directory must be writeable by PHP. It will be used to store
* file attachments.
*
* @todo throw if the directory is not writeable.
* @param string $dir
*/
public static function setTmpDir( $dir )
{
self::$tmpDir = $dir;
}
/**
* Returns the temporary directory.
*
* Uses the PHP 5.2.1 function sys_get_temp_dir().
*
* Note that the directory name returned will have a "slash" at the end
* ("/" for Linux and "\" for Windows).
*
* @return string
*/
public static function getTmpDir()
{
if ( self::$tmpDir === null )
{
self::$tmpDir = sys_get_temp_dir();
if ( substr( self::$tmpDir, strlen( self::$tmpDir ) - 1 ) !== DIRECTORY_SEPARATOR )
{
self::$tmpDir = self::$tmpDir . DIRECTORY_SEPARATOR;
}
}
return self::$tmpDir;
}
}
?>