/** * 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()); }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; }