* @license PHP License * @package Wombat * @subpackage MailMime */ WBClass::load('WBMail_Mime_Parser'); /** * Wombat Mail Mime Parser PEAR * * @todo This class is probably outdated * @see https://pear.php.net/package/Mail_mimeDecode/ * @version 0.1.0 * @package Wombat * @subpackage MailMime */ class WBMail_Mime_Parser_PEAR extends WBMail_Mime_Parser { /** * Concstrutor * */ public function __construct() { } /** * Set Raw MIME Mail String * * @param string */ public function doSetRaw($str) { $params = array( 'include_bodies' => true , 'decode_headers' => true , 'decode_bodies' => true ); WBClass::load('Mail_mimeDecode'); $decoder = new Mail_mimeDecode($str); $mime = $decoder->decode($params); $charset = null; // guess charset from subject encoding $head = explode("\n", $str, 100); foreach ($head as $h){ if (preg_match('/^Subject:\s+=\?(.+)\?/', $h, $matches)) { $charset = $matches[1]; break; } } if ($charset) { foreach (array('subject', 'from', 'to') as $hdr) { $mime->headers[$hdr] = mb_convert_encoding($mime->headers[$hdr], 'UTF-8', $charset); } } $this->header['date'] = date( 'Y-m-d H:i:s', strtotime($mime->headers['date'])); $this->header['from'] = $mime->headers['from']; $this->header['to'] = $mime->headers['to']; $this->header['subject']= $mime->headers['subject']; $this->parseParts($mime); } /** * Recursively parses the mail party * * @param object $part to parse * @param int $level level of nesting */ private function parseParts($part, $level = 0) { $primary = strtolower($part->ctype_primary); $secondary = strtolower($part->ctype_secondary); if ('multipart' == $primary && is_array($part->parts)) { foreach ($part->parts as $i => $part) { $this->parseParts($part, $level+1); } return; } $disposition = null; if (isset($part->disposition)) { $disposition = $part->disposition; } $name = null; if (isset($part->ctype_parameters) && isset($part->ctype_parameters['name'])) { $name = $part->ctype_parameters['name']; } $isAttachment = false; $isAttachment |= !empty($name); $isAttachment |= isset($part->headers) && isset($part->headers['content-id']); $isAttachment |= !empty($disposition) && in_array($disposition, array('attachment', 'inline')); if ($isAttachment) { $this->attachment[] = $this->createPartAttachment($part); return; } $this->handleMailText($part); } /** * This message should be called if a mail MESSAGE part was encountered * * @param object $part the mail part to be considered as mail text content * @return void */ private function handleMailText($part) { $bodyDecoded = $part->body; $primary = $part->ctype_primary; if (empty($primary)) { $primary = ''; } $primary = strtolower($primary); $secondary = $part->ctype_secondary; if (empty($secondary)) { $secondary = ''; } $secondary = strtolower($secondary); echo "mime " . $primary . '/' . $secondary . "
\n"; // force UTF-8 if ('text' == $primary) { if (isset($part->ctype_parameters) && isset($part->ctype_parameters['charset']) && 'utf-8' != strtolower($part->ctype_parameters['charset'])) { $charset = $part->ctype_parameters['charset']; $bodyDecoded = mb_convert_encoding($part->body, 'UTF-8', $charset); } } if ('text' == $primary && 'plain' == $secondary) { $this->bodyPlain = $bodyDecoded; return; } if ('text' == $primary && 'html' == $secondary) { $this->bodyHtml = $bodyDecoded; return; } $ex = array( 'msg' => 'Cannot handle message part of type: "'.$primary . '/' . $secondary.'"', 'code' => 1, 'class' => __CLASS__ ); throw WBClass::create('WBException_Type', $ex); } /** * create attachment * * Validate body part. Create and populate attachment object * * @param stdClass $part * @return WBMail_Mime_Part_Attachment|null */ protected function createPartAttachment($part) { $att = WBClass::create( 'WBMail_Mime_Part_Attachment' ); $att->setId(); $att->setData($part->body); $att->setMime($part->ctype_primary . '/' . $part->ctype_secondary); $att->setName($part->ctype_parameters['name']); if (!isset($part->headers['content-id']) || empty($part->headers['content-id'])) { return $att; } $cid = trim($part->headers['content-id'], "<> \n\r"); if (empty($cid)) { return $att; } $att->setCid( $cid ); return $att; } }