/** * 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; }
/** * Returns an ezcMailAddress object parsed from the address string $address. * * You can set the encoding of the name part with the $encoding parameter. * If $encoding is omitted or set to "mime" parseEmailAddress will asume that * the name part is mime encoded. * * This method does not perform validation. It will also accept slightly * malformed addresses. * * If the mail address given can not be decoded null is returned. * * Example: * <code> * ezcMailTools::parseEmailAddress( 'John Doe <*****@*****.**>' ); * </code> * * @param string $address * @param string $encoding * @return ezcMailAddress */ public static function parseEmailAddress($address, $encoding = "mime") { // we don't care about the "group" part of the address since this is not used anywhere $matches = array(); $pattern = '/<?\\"?[a-zA-Z0-9!#\\$\\%\\&\'\\*\\+\\-\\/=\\?\\^_`{\\|}~\\.]+\\"?@[a-zA-Z0-9!#\\$\\%\\&\'\\*\\+\\-\\/=\\?\\^_`{\\|}~\\.]+>?$/'; if (preg_match(trim($pattern), $address, $matches, PREG_OFFSET_CAPTURE) != 1) { return null; } $name = substr($address, 0, $matches[0][1]); // trim <> from the address and "" from the name $name = trim($name, '" '); $mail = trim($matches[0][0], '<>'); // remove any quotes found in mail addresses like "bah,"@example.com $mail = str_replace('"', '', $mail); if ($encoding == 'mime') { // the name may contain interesting character encoding. We need to convert it. $name = ezcMailTools::mimeDecode($name); } else { $name = ezcMailCharsetConverter::convertToUTF8($name, $encoding); } $address = new ezcMailAddress($mail, $name, 'utf-8'); return $address; }
public function testMbstringCharsetConverter2() { if (ezcBaseFeatures::hasExtensionSupport('mbstring')) { ezcMailCharsetConverter::setConvertMethod(array('myConverter', 'convertToUTF8Mbstring')); $parser = new ezcMailParser(); $set = new SingleFileSet('various/test-broken-iconv-2'); $mail = $parser->parseMail($set); $mail = $mail[0]; $this->assertEquals(99, strlen($mail->body->text)); ezcMailCharsetConverter::setConvertMethod(array('ezcMailCharsetConverter', 'convertToUTF8Iconv')); } else { $this->markTestSkipped("This test doesn't work without the mbstring extension. PHP must be compiled with --enable-mbstring."); } }
/** * Sets the callback function used for character set conversion to UTF-8. * * Call this method before doing mail parsing if you need a special way * of converting the character set to UTF-8. * * @param callback $method */ public static function setConvertMethod($method) { self::$method = $method; }
/** * Returns the a ezcMailContentDispositionHeader for the parsed $header. * * If $cd is provided this object will be used to fill in the blanks. This function * will not clear out any old values in the object. * * @param string $header * @param ezcMailContentDispositionHeader $cd * @return ezcMailContentDispositionHeader */ public static function parseContentDisposition($header, ezcMailContentDispositionHeader $cd = null) { if ($cd === null) { $cd = new ezcMailContentDispositionHeader(); } $parsedHeader = self::parseHeader($header); $cd->disposition = $parsedHeader[0]; if (isset($parsedHeader[1])) { foreach ($parsedHeader[1] as $paramName => $data) { switch ($paramName) { case 'filename': $cd->fileName = $data['value']; $cd->displayFileName = trim($data['value'], '"'); if (isset($data['charset'])) { $cd->fileNameCharSet = $data['charset']; $cd->displayFileName = ezcMailCharsetConverter::convertToUTF8Iconv($cd->displayFileName, $cd->fileNameCharSet); } else { if (preg_match('@^=\\?[^?]+\\?[QqBb]\\?@', $cd->displayFileName)) { $cd->displayFileName = ezcMailTools::mimeDecode($cd->displayFileName); } } if (isset($data['language'])) { $cd->fileNameLanguage = $data['language']; } break; case 'creation-date': $cd->creationDate = $data['value']; break; case 'modification-date': $cd->modificationDate = $data['value']; break; case 'read-date': $cd->readDate = $data['value']; break; case 'size': $cd->size = $data['value']; break; default: $cd->additionalParameters[$paramName] = $data['value']; if (isset($data['charset'])) { $cd->additionalParametersMetaData[$paramName]['charSet'] = $data['charset']; } if (isset($data['language'])) { $cd->additionalParametersMetaData[$paramName]['language'] = $data['language']; } break; } } } return $cd; }