/**
  * Returns the ezcMailText part corresponding to the parsed message.
  *
  * @return ezcMailText
  */
 public function finish()
 {
     $charset = "us-ascii";
     // RFC 2822 default
     if (isset($this->headers['Content-Type'])) {
         preg_match('/\\s*charset\\s?=\\s?"?([^;"\\s]*);?/', $this->headers['Content-Type'], $parameters);
         if (count($parameters) > 0) {
             $charset = strtolower(trim($parameters[1], '"'));
         }
     }
     $encoding = strtolower($this->headers['Content-Transfer-Encoding']);
     if ($encoding == ezcMail::QUOTED_PRINTABLE) {
         $this->text = quoted_printable_decode($this->text);
     } else {
         if ($encoding == ezcMail::BASE64) {
             $this->text = base64_decode($this->text);
         }
     }
     $this->text = ezcMailCharsetConverter::convertToUTF8($this->text, $charset);
     $part = new ezcMailText($this->text, 'utf-8', ezcMail::EIGHT_BIT, $charset);
     $part->subType = $this->subType;
     $part->setHeaders($this->headers->getCaseSensitiveArray());
     ezcMailPartParser::parsePartHeaders($this->headers, $part);
     $part->size = strlen($this->text);
     return $part;
 }
 public function testUnset()
 {
     $reference = array();
     $map = new ezcMailHeadersHolder();
     $map['Subject'] = 1;
     $map['suBject'] = 2;
     unset($map['subject']);
     $this->assertEquals($reference, $map->getCaseSensitiveArray());
 }
Exemple #3
0
 /**
  * Return the result of the parsed file part.
  *
  * This method is called automatically by the parent part.
  *
  * @return ezcMailFile
  */
 public function finish()
 {
     fclose($this->fp);
     $this->fp = null;
     // FIXME: DIRTY PGP HACK
     // When we have PGP support these lines should be removed. They are here now to hide
     // PGP parts since they will show up as file attachments if not.
     if ($this->mainType == "application" && ($this->subType == 'pgp-signature' || $this->subType == 'pgp-keys' || $this->subType == 'pgp-encrypted')) {
         return null;
     }
     // END DIRTY PGP HACK
     $filePart = new self::$fileClass($this->fileName);
     // set content type
     $filePart->setHeaders($this->headers->getCaseSensitiveArray());
     ezcMailPartParser::parsePartHeaders($this->headers, $filePart);
     switch (strtolower($this->mainType)) {
         case 'image':
             $filePart->contentType = ezcMailFile::CONTENT_TYPE_IMAGE;
             break;
         case 'audio':
             $filePart->contentType = ezcMailFile::CONTENT_TYPE_AUDIO;
             break;
         case 'video':
             $filePart->contentType = ezcMailFile::CONTENT_TYPE_VIDEO;
             break;
         case 'application':
             $filePart->contentType = ezcMailFile::CONTENT_TYPE_APPLICATION;
             break;
     }
     // set mime type
     $filePart->mimeType = $this->subType;
     // set inline disposition mode if set.
     $matches = array();
     if (preg_match('/^\\s*inline;?/i', $this->headers['Content-Disposition'], $matches)) {
         $filePart->dispositionType = ezcMailFile::DISPLAY_INLINE;
     }
     if (preg_match('/^\\s*attachment;?/i', $this->headers['Content-Disposition'], $matches)) {
         $filePart->dispositionType = ezcMailFile::DISPLAY_ATTACHMENT;
     }
     $filePart->size = filesize($this->fileName);
     return $filePart;
 }
 /**
  * Returns an ezcMail corresponding to the parsed message.
  * You can specify an alternate class using the $class parameter, if you
  * extended ezcMail.
  *
  * @param string $class Class to instanciate instead of ezcMail.
  * @return ezcMail
  */
 public function finish($class = "ezcMail")
 {
     $mail = new $class();
     $mail->setHeaders($this->headers->getCaseSensitiveArray());
     ezcMailPartParser::parsePartHeaders($this->headers, $mail);
     // from
     if (isset($this->headers['From'])) {
         $mail->from = ezcMailTools::parseEmailAddress($this->headers['From']);
     }
     // to
     if (isset($this->headers['To'])) {
         $mail->to = ezcMailTools::parseEmailAddresses($this->headers['To']);
     }
     // cc
     if (isset($this->headers['Cc'])) {
         $mail->cc = ezcMailTools::parseEmailAddresses($this->headers['Cc']);
     }
     // bcc
     if (isset($this->headers['Bcc'])) {
         $mail->bcc = ezcMailTools::parseEmailAddresses($this->headers['Bcc']);
     }
     // subject
     if (isset($this->headers['Subject'])) {
         $mail->subject = ezcMailTools::mimeDecode($this->headers['Subject']);
         $mail->subjectCharset = 'utf-8';
     }
     // message ID
     if (isset($this->headers['Message-Id'])) {
         $mail->messageID = $this->headers['Message-Id'];
     }
     // Return-Path
     if (isset($this->headers['Return-Path'])) {
         $mail->returnPath = ezcMailTools::parseEmailAddress($this->headers['Return-Path']);
     }
     if ($this->bodyParser !== null) {
         $mail->body = $this->bodyParser->finish();
     }
     return $mail;
 }
Exemple #5
0
 /**
  * Returns the headers set for this part as a RFC 822 string.
  *
  * Each header is separated by a line break.
  * This method does not add the required two lines of space
  * to separate the headers from the body of the part.
  *
  * It also encodes the headers (with the 'Q' encoding) if the charset
  * associated with the header is different than 'us-ascii' or if it
  * contains characters not allowed in mail headers.
  *
  * This function is called automatically by generate() and
  * subclasses can override this method if they wish to set additional
  * headers when the mail is generated.
  *
  * @see setHeader()
  *
  * @return string
  */
 public function generateHeaders()
 {
     // set content disposition header
     if ($this->contentDisposition !== null && $this->contentDisposition instanceof ezcMailContentDispositionHeader) {
         $cdHeader = $this->contentDisposition;
         $cd = "{$cdHeader->disposition}";
         if ($cdHeader->fileName !== null) {
             $fileInfo = null;
             if ($cdHeader->fileNameCharSet !== null) {
                 $fileInfo .= "*0*=\"{$cdHeader->fileNameCharSet}";
                 if ($cdHeader->fileNameLanguage !== null) {
                     $fileInfo .= "'{$cdHeader->fileNameLanguage}'";
                 } else {
                     // RFC 2184: the single quote delimiters MUST be present
                     // even when one of the field values is omitted
                     $fileInfo .= "''";
                 }
             }
             if ($fileInfo !== null) {
                 $cd .= "; filename{$fileInfo}{$cdHeader->fileName}\"";
             } else {
                 $cd .= "; filename=\"{$cdHeader->fileName}\"";
             }
         }
         if ($cdHeader->creationDate !== null) {
             $cd .= "; creation-date=\"{$cdHeader->creationDate}\"";
         }
         if ($cdHeader->modificationDate !== null) {
             $cd .= "; modification-date=\"{$cdHeader->modificationDate}\"";
         }
         if ($cdHeader->readDate !== null) {
             $cd .= "; read-date=\"{$cdHeader->readDate}\"";
         }
         if ($cdHeader->size !== null) {
             $cd .= "; size={$cdHeader->size}";
         }
         foreach ($cdHeader->additionalParameters as $addKey => $addValue) {
             $cd .= "; {$addKey}=\"{$addValue}\"";
         }
         $this->setHeader('Content-Disposition', $cd);
     }
     // generate headers
     $text = "";
     foreach ($this->headers->getCaseSensitiveArray() as $header => $value) {
         if (is_array($value)) {
             $value = $value[0];
         }
         // here we encode every header, even the ones that we don't add to
         // the header set directly. We do that so that transports sill see
         // all the encoded headers which they then can use accordingly.
         $charset = $this->getHeaderCharset($header);
         switch (strtolower($charset)) {
             case 'us-ascii':
                 $value = ezcMailHeaderFolder::foldAny($value);
                 break;
             case 'iso-8859-1':
             case 'iso-8859-2':
             case 'iso-8859-3':
             case 'iso-8859-4':
             case 'iso-8859-5':
             case 'iso-8859-6':
             case 'iso-8859-7':
             case 'iso-8859-8':
             case 'iso-8859-9':
             case 'iso-8859-10':
             case 'iso-8859-11':
             case 'iso-8859-12':
             case 'iso-8859-13':
             case 'iso-8859-14':
             case 'iso-8859-15':
             case 'iso-8859-16':
             case 'windows-1250':
             case 'windows-1251':
             case 'windows-1252':
             case 'utf-8':
                 if (strpbrk($value, "€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�") === false) {
                     $value = ezcMailHeaderFolder::foldAny($value);
                     break;
                 }
                 // break intentionally missing
             // break intentionally missing
             default:
                 $preferences = array('input-charset' => $charset, 'output-charset' => $charset, 'line-length' => ezcMailHeaderFolder::getLimit(), 'scheme' => 'Q', 'line-break-chars' => ezcMailTools::lineBreak());
                 $value = iconv_mime_encode('dummy', $value, $preferences);
                 $value = substr($value, 7);
                 // "dummy: " + 1
                 // just to keep compatibility with code which might read
                 // the headers after generateHeaders() has been called
                 $this->setHeader($header, $value, $charset);
                 break;
         }
         if (in_array(strtolower($header), $this->excludeHeaders) === false) {
             $text .= "{$header}: {$value}" . ezcMailTools::lineBreak();
         }
     }
     return $text;
 }
Exemple #6
0
 /**
  * Returns the generated text for a section of the delivery-status part.
  *
  * @param ezcMailHeadersHolder $headers
  * @return string
  */
 private function addHeadersSection(ezcMailHeadersHolder $headers)
 {
     $result = "";
     foreach ($headers->getCaseSensitiveArray() as $header => $value) {
         $result .= $header . ": " . $value . ezcMailTools::lineBreak();
     }
     return $result;
 }
Exemple #7
0
    /**
     * Returns the headers set for this part as a RFC 822 string.
     *
     * Each header is separated by a line break.
     * This method does not add the required two lines of space
     * to separate the headers from the body of the part.
     *
     * It also encodes the headers (with the 'Q' encoding) if the charset
     * associated with the header is different than 'us-ascii' or if it
     * contains characters not allowed in mail headers.
     *
     * This function is called automatically by generate() and
     * subclasses can override this method if they wish to set additional
     * headers when the mail is generated.
     *
     * @see setHeader()
     *
     * @return string
     */
    public function generateHeaders()
    {
        // set content disposition header
        if ( $this->contentDisposition !== null &&
            ( $this->contentDisposition instanceof ezcMailContentDispositionHeader ) )
        {
            $cdHeader = $this->contentDisposition;
            $cd = "{$cdHeader->disposition}";
            if ( $cdHeader->fileName !== null )
            {
                $fileInfo = null;
                if ( $cdHeader->fileNameCharSet !== null )
                {
                    $fileInfo .= "*0*=\"{$cdHeader->fileNameCharSet}";
                    if ( $cdHeader->fileNameLanguage !== null )
                    {
                        $fileInfo .= "'{$cdHeader->fileNameLanguage}'";
                    }
                    else
                    {
                        // RFC 2184: the single quote delimiters MUST be present
                        // even when one of the field values is omitted
                        $fileInfo .= "''";
                    }
                }
                if ( $fileInfo !== null )
                {
                    $cd .= "; filename{$fileInfo}{$cdHeader->fileName}\"";
                }
                else
                {
                    $cd .= "; filename=\"{$cdHeader->fileName}\"";
                }
            }

            if ( $cdHeader->creationDate !== null )
            {
                $cd .= "; creation-date=\"{$cdHeader->creationDate}\"";
            }

            if ( $cdHeader->modificationDate !== null )
            {
                $cd .= "; modification-date=\"{$cdHeader->modificationDate}\"";
            }

            if ( $cdHeader->readDate !== null )
            {
                $cd .= "; read-date=\"{$cdHeader->readDate}\"";
            }

            if ( $cdHeader->size !== null )
            {
                $cd .= "; size={$cdHeader->size}";
            }

            foreach ( $cdHeader->additionalParameters as $addKey => $addValue )
            {
                $cd .="; {$addKey}=\"{$addValue}\"";
            }

            $this->setHeader( 'Content-Disposition', $cd );
        }

        // generate headers
        $text = "";
        foreach ( $this->headers->getCaseSensitiveArray() as $header => $value )
        {
            if ( is_array( $value ) )
            {
                $value = $value[0];
            }

            // here we encode every header, even the ones that we don't add to
            // the header set directly. We do that so that transports sill see
            // all the encoded headers which they then can use accordingly.
            $charset = $this->getHeaderCharset( $header );
            switch ( strtolower( $charset ) )
            {
                case 'us-ascii':
                    $value = ezcMailHeaderFolder::foldAny( $value );
                    break;

                case 'iso-8859-1': case 'iso-8859-2': case 'iso-8859-3': case 'iso-8859-4':
                case 'iso-8859-5': case 'iso-8859-6': case 'iso-8859-7': case 'iso-8859-8':
                case 'iso-8859-9': case 'iso-8859-10': case 'iso-8859-11': case 'iso-8859-12':
                case 'iso-8859-13': case 'iso-8859-14': case 'iso-8859-15' :case 'iso-8859-16':
                case 'windows-1250': case 'windows-1251': case 'windows-1252':
                case 'utf-8':
                    if ( strpbrk( $value, "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" ) === false )
                    {
                        $value = ezcMailHeaderFolder::foldAny( $value );
                        break;
                    }
                    // break intentionally missing

                default:
                    $preferences = array(
                        'input-charset' => $charset,
                        'output-charset' => $charset,
                        'line-length' => ezcMailHeaderFolder::getLimit(),
                        'scheme' => 'Q',
                        'line-break-chars' => ezcMailTools::lineBreak()
                    );
                    $value = iconv_mime_encode( 'dummy', $value, $preferences );
                    $value = substr( $value, 7 ); // "dummy: " + 1

                    // just to keep compatibility with code which might read
                    // the headers after generateHeaders() has been called
                    $this->setHeader( $header, $value, $charset );
                    break;
            }

            if ( in_array( strtolower( $header ), $this->excludeHeaders ) === false )
            {
                 $text .= "$header: $value" . ezcMailTools::lineBreak();
            }
        }

        return $text;
    }