Esempio n. 1
0
 /**
  * Decodes a MIME encoded string and returns a 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 Zend_Mime::LINEEND}
  * @return Zend_Mime_Message
  */
 public static function createFromMessage($message, $boundary, $EOL = Zend_Mime::LINEEND)
 {
     require_once 'Zend/Mime/Decode.php';
     $parts = 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 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 Zend_Exception('Unknown header ignored for MimePart:' . $key);
             }
         }
         $res->addPart($newPart);
     }
     return $res;
 }
Esempio n. 2
0
 /**
  * Cache content and split in parts if multipart
  *
  * @return null
  * @throws Zend_Mail_Exception
  */
 protected function _cacheContent()
 {
     // caching content if we can't fetch parts
     if ($this->_content === null && $this->_mail) {
         $this->_content = $this->_mail->getRawContent($this->_messageNum);
     }
     if (!$this->isMultipart()) {
         return;
     }
     // split content in parts
     $boundary = $this->getHeaderField('content-type', 'boundary');
     if (!$boundary) {
         /**
          * @see Zend_Mail_Exception
          */
         require_once 'Zend/Mail/Exception.php';
         throw new Zend_Mail_Exception('no boundary found in content type to split message');
     }
     $parts = Zend_Mime_Decode::splitMessageStruct($this->_content, $boundary);
     if ($parts === null) {
         return;
     }
     $partClass = $this->getPartClass();
     $counter = 1;
     foreach ($parts as $part) {
         $this->_parts[$counter++] = new $partClass(array('headers' => $part['header'], 'content' => $part['body']));
     }
 }
Esempio n. 3
0
 /**
  * Cache content and split in parts if multipart
  *
  * @return null
  * @throws Zend_Mail_Exception
  */
 protected function _cacheContent()
 {
     // caching content if we can't fetch parts
     if ($this->_content === null && $this->_mail) {
         $this->_content = $this->_mail->getRawContent($this->_messageNum);
     }
     if (!$this->isMultipart()) {
         return;
     }
     // split content in parts
     $boundary = Zend_Mime_Decode::splitContentType($this->contentType, 'boundary');
     if (!$boundary) {
         throw new Zend_Mail_Exception('no boundary found in content type to split message');
     }
     $parts = Zend_Mime_Decode::splitMessageStruct($this->_content, $boundary);
     $counter = 1;
     foreach ($parts as $part) {
         $this->_parts[$counter++] = new self(array('headers' => $part['header'], 'content' => $part['body']));
     }
 }
Esempio n. 4
0
 public function testSplitInvalidMessage()
 {
     try {
         Zend_Mime_Decode::splitMessageStruct("--xxx\n", 'xxx');
     } catch (Zend_Exception $e) {
         return;
         // ok
     }
     $this->fail('no exception raised while decoding invalid message');
 }
 /**
  * recover html body and atachment data from rfc822 mime
  *
  * @param string $mime
  * @return array
  */
 public function getHtmlBodyAndAttachmentData($mime, $onlyInline = FALSE)
 {
     //$filepath = '../tests/tine20/Expressomail/Frontend/files/mime/';
     //$filename = microtime();
     //file_put_contents($filepath.$filename.'.eml', $mime);
     preg_match('/.*boundary="(.*)"/', $mime, $matches);
     if (count($matches) === 0) {
         Zend_Mime_Decode::splitMessage($mime, $headers, $body);
         $body = base64_decode($body);
         if (strpos($headers['content-type'], 'text/plain') !== FALSE) {
             $body = $this->convertPlainTextToHtml($body);
         }
         $result = array('body' => $body);
         //file_put_contents($filename.'.json', json_encode($result));
         return $result;
     }
     $struct = Zend_Mime_Decode::splitMessageStruct($mime, $matches[1]);
     $result = array();
     $result['attachmentData'] = array();
     $multipartContent = $this->getMultipartPart($struct, 'multipart');
     if ($multipartContent) {
         preg_match('/.*boundary="(.*)"/', $multipartContent['header']['content-type'], $matches);
         $bodyBoundary = $matches[1];
         $bodyStruct = Zend_Mime_Decode::splitMessageStruct($multipartContent['body'], $bodyBoundary);
         $bodyContent = $this->getMultipartPart($bodyStruct, 'text/html');
         if ($bodyContent) {
             $bodyHtml = $this->extractBodyTagContent($bodyContent['body']);
             if (strpos($bodyContent['header']['content-transfer-encoding'], 'base64') !== FALSE) {
                 $bodyHtml = base64_decode($bodyHtml);
             }
         } else {
             $bodyHtml = '';
         }
         $result['attachmentData'] = $this->getAttachmentParts($bodyStruct, $onlyInline);
     } else {
         $bodyContent = $this->getMultipartPart($struct, 'text/html');
         if ($bodyContent) {
             if (strpos($bodyContent['header']['content-transfer-encoding'], 'base64') !== FALSE) {
                 $bodyHtml = base64_decode($bodyContent['body']);
             } else {
                 $bodyHtml = $this->extractBodyTagContent($bodyContent['body']);
             }
         } else {
             $bodyContent = $this->getMultipartPart($struct, 'text');
             $bodyHtml = $bodyContent['body'];
             if (strpos($bodyContent['header']['content-transfer-encoding'], 'base64') !== FALSE) {
                 $bodyHtml = base64_decode($bodyHtml);
             }
             if (strpos($bodyContent['header']['content-type'], 'text/plain') !== FALSE) {
                 $bodyHtml = $this->convertPlainTextToHtml($bodyHtml);
             }
         }
     }
     $result['body'] = quoted_printable_decode($bodyHtml);
     $result['attachmentData'] = array_merge($result['attachmentData'], $this->getAttachmentParts($struct, $onlyInline));
     //$filepath = '../tests/tine20/Expressomail/Frontend/files/result/';
     //file_put_contents($filepath.$filename.'.json', json_encode($result));
     return $result;
 }