diff options
Diffstat (limited to 'Postman/Postman-Mail/Zend-1.12.10/Mime/Message.php')
-rw-r--r-- | Postman/Postman-Mail/Zend-1.12.10/Mime/Message.php | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/Postman/Postman-Mail/Zend-1.12.10/Mime/Message.php b/Postman/Postman-Mail/Zend-1.12.10/Mime/Message.php new file mode 100644 index 0000000..e5783fb --- /dev/null +++ b/Postman/Postman-Mail/Zend-1.12.10/Mime/Message.php @@ -0,0 +1,305 @@ +<?php +/** + * Zend Framework + * + * LICENSE + * + * This source file is subject to the new BSD license that is bundled + * with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://framework.zend.com/license/new-bsd + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@zend.com so we can send you a copy immediately. + * + * @category Zend + * @package Postman_Zend_Mime + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ + +/** + * Postman_Zend_Mime + */ +// require_once 'Zend/Mime.php'; + +/** + * Postman_Zend_Mime_Part + */ +// require_once 'Zend/Mime/Part.php'; + +/** + * @category Zend + * @package Postman_Zend_Mime + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Postman_Zend_Mime_Message +{ + /** + * The Postman_Zend_Mime_Parts of the message + * + * @var array + */ + protected $_parts = array(); + + /** + * The Postman_Zend_Mime object for the message + * + * @var Postman_Zend_Mime|null + */ + protected $_mime = null; + + /** + * Returns the list of all Postman_Zend_Mime_Parts in the message + * + * @return array of Postman_Zend_Mime_Part + */ + public function getParts() + { + return $this->_parts; + } + + /** + * Sets the given array of Postman_Zend_Mime_Parts as the array for the message + * + * @param array $parts + */ + public function setParts($parts) + { + $this->_parts = $parts; + } + + /** + * Append a new Postman_Zend_Mime_Part to the current message + * + * @param Postman_Zend_Mime_Part $part + */ + public function addPart(Postman_Zend_Mime_Part $part) + { + /** + * @todo check for duplicate object handle + */ + $this->_parts[] = $part; + } + + /** + * Check if message needs to be sent as multipart + * MIME message or if it has only one part. + * + * @return boolean + */ + public function isMultiPart() + { + return (count($this->_parts) > 1); + } + + /** + * Set Postman_Zend_Mime object for the message + * + * This can be used to set the boundary specifically or to use a subclass of + * Postman_Zend_Mime for generating the boundary. + * + * @param Postman_Zend_Mime $mime + */ + public function setMime(Postman_Zend_Mime $mime) + { + $this->_mime = $mime; + } + + /** + * Returns the Postman_Zend_Mime object in use by the message + * + * If the object was not present, it is created and returned. Can be used to + * determine the boundary used in this message. + * + * @return Postman_Zend_Mime + */ + public function getMime() + { + if ($this->_mime === null) { + $this->_mime = new Postman_Zend_Mime(); + } + + return $this->_mime; + } + + /** + * Generate MIME-compliant message from the current configuration + * + * This can be a multipart message if more than one MIME part was added. If + * only one part is present, the content of this part is returned. If no + * part had been added, an empty string is returned. + * + * Parts are seperated by the mime boundary as defined in Postman_Zend_Mime. If + * {@link setMime()} has been called before this method, the Postman_Zend_Mime + * object set by this call will be used. Otherwise, a new Postman_Zend_Mime object + * is generated and used. + * + * @param string $EOL EOL string; defaults to {@link Postman_Zend_Mime::LINEEND} + * @return string + */ + public function generateMessage($EOL = Postman_Zend_Mime::LINEEND) + { + if (!$this->isMultiPart()) { + $body = array_shift($this->_parts); + $body = $body->getContent($EOL); + } else { + $mime = $this->getMime(); + + $boundaryLine = $mime->boundaryLine($EOL); + $body = 'This is a message in Mime Format. If you see this, ' + . "your mail reader does not support this format." . $EOL; + + foreach (array_keys($this->_parts) as $p) { + $body .= $boundaryLine + . $this->getPartHeaders($p, $EOL) + . $EOL + . $this->getPartContent($p, $EOL); + } + + $body .= $mime->mimeEnd($EOL); + } + + return trim($body); + } + + /** + * Get the headers of a given part as an array + * + * @param int $partnum + * @return array + */ + public function getPartHeadersArray($partnum) + { + return $this->_parts[$partnum]->getHeadersArray(); + } + + /** + * Get the headers of a given part as a string + * + * @param int $partnum + * @param string $EOL + * @return string + */ + public function getPartHeaders($partnum, $EOL = Postman_Zend_Mime::LINEEND) + { + return $this->_parts[$partnum]->getHeaders($EOL); + } + + /** + * Get the (encoded) content of a given part as a string + * + * @param int $partnum + * @param string $EOL + * @return string + */ + public function getPartContent($partnum, $EOL = Postman_Zend_Mime::LINEEND) + { + return $this->_parts[$partnum]->getContent($EOL); + } + + /** + * Explode MIME multipart string into seperate parts + * + * Parts consist of the header and the body of each MIME part. + * + * @param string $body + * @param string $boundary + * @throws Postman_Zend_Exception + * @return array + */ + protected static function _disassembleMime($body, $boundary) + { + $start = 0; + $res = array(); + // find every mime part limiter and cut out the + // string before it. + // the part before the first boundary string is discarded: + $p = strpos($body, '--' . $boundary . "\n", $start); + if ($p === false) { + // no parts found! + return array(); + } + + // position after first boundary line + $start = $p + 3 + strlen($boundary); + + while (($p = strpos($body, '--' . $boundary . "\n", $start)) + !== false) { + $res[] = substr($body, $start, $p - $start); + $start = $p + 3 + strlen($boundary); + } + + // no more parts, find end boundary + $p = strpos($body, '--' . $boundary . '--', $start); + if ($p === false) { + throw new Postman_Zend_Exception('Not a valid Mime Message: End Missing'); + } + + // the remaining part also needs to be parsed: + $res[] = substr($body, $start, $p - $start); + + return $res; + } + + /** + * Decodes a MIME encoded string and returns a Postman_Zend_Mime_Message object with + * all the MIME parts set according to the given string + * + * @param string $message + * @param string $boundary + * @param string $EOL EOL string; defaults to {@link Postman_Zend_Mime::LINEEND} + * @throws Postman_Zend_Exception + * @return Postman_Zend_Mime_Message + */ + public static function createFromMessage( + $message, $boundary, $EOL = Postman_Zend_Mime::LINEEND + ) + { + require_once 'Zend/Mime/Decode.php'; + $parts = Postman_Zend_Mime_Decode::splitMessageStruct($message, $boundary, $EOL); + + $res = new self(); + foreach ($parts as $part) { + // now we build a new MimePart for the current Message Part: + $newPart = new Postman_Zend_Mime_Part($part['body']); + foreach ($part['header'] as $key => $value) { + /** + * @todo check for characterset and filename + */ + switch (strtolower($key)) { + case 'content-type': + $newPart->type = $value; + break; + case 'content-transfer-encoding': + $newPart->encoding = $value; + break; + case 'content-id': + $newPart->id = trim($value, '<>'); + break; + case 'content-disposition': + $newPart->disposition = $value; + break; + case 'content-description': + $newPart->description = $value; + break; + case 'content-location': + $newPart->location = $value; + break; + case 'content-language': + $newPart->language = $value; + break; + default: + throw new Postman_Zend_Exception( + 'Unknown header ignored for MimePart:' . $key + ); + } + } + $res->addPart($newPart); + } + + return $res; + } +} |