* @license PHP License * @package Wombat * @subpackage MailMime */ WBClass::load('WBMail_Mime_Parser'); /** * Wombat Mail Mime Parser PECL * * Utilize PHP Extension mailparse * * @see https://www.php.net/manual/en/book.mailparse.php * @version 0.1.3 * @package Wombat * @subpackage MailMime */ class WBMail_Mime_Parser_PECL extends WBMail_Mime_Parser { /** * Concstrutor * */ public function __construct() { } /** * Convert Base64 Encoding and Charset * * @param string|array header line * @return string|array */ private function decodeHeader($header) { $array2String = false; if (!is_array($header)) { $array2String = true; $header = array($header); } foreach ($header as &$line) { if (preg_match('/=\?(.+)\?(.)\?/U', $line, $matches)) { $line = explode(' ', $line); foreach ($line as &$l) { preg_match('/=\?(.+)\?(.)\?(.*)/', $l, $m); switch (strtolower($m[2])) { case 'b': $l = base64_decode($m[3]); break; case 'q': $l = quoted_printable_decode($m[3]); break; default: break; } } $line = implode(' ', $line); $line = mb_convert_encoding($line, 'UTF-8', strtoupper($matches[1])); } } if ($array2String) { $header = array_shift($header); } return $header; } /** * Set Raw MIME Mail String * * @param string */ public function doSetRaw($str) { $mp = mailparse_msg_create(); mailparse_msg_parse($mp, $str); $struct = mailparse_msg_get_structure($mp); foreach ($struct as $st) { $part = mailparse_msg_get_part($mp, $st); $meta = mailparse_msg_get_part_data($part); $content = mailparse_msg_extract_part($part, $str, null); // copy headers foreach ($meta['headers'] as $k => $v) { $k = strtolower($k); if (!empty($this->header[$k])) { continue; } $v = $this->decodeHeader($v); switch ($k) { case 'date': $this->header['date'] = date( 'Y-m-d H:i:s', strtotime($meta['headers']['date'])); break; case 'from': case 'to': case 'subject': $this->header[$k] = $v; break; default: $this->header[$k] = $v; break; } } switch ($meta['content-type']) { case 'multipart/alternative': case 'multipart/mixed': case 'multipart/signed': break; case 'text/plain': if (!empty($meta['content-charset']) && 'utf-8' != strtolower($meta['content-charset'])) { $content = mb_convert_encoding($content, 'UTF-8', $meta['content-charset']); } $this->bodyPlain = $content; break; case 'text/html': if (!empty($meta['content-charset']) && 'utf-8' != strtolower($meta['content-charset'])) { $content = mb_convert_encoding($content, 'UTF-8', $meta['content-charset']); } $this->bodyHtml = $content; break; default: $this->addAttachment($content, $meta); break; } } mailparse_msg_free($mp); } /** * Create and Add Attachment * * Create and populate attachment object * * @param string content * @param array meta data * @return WBMail_Mime_Part_Attachment|null */ protected function addAttachment($content, $meta) { $att = WBClass::create('WBMail_Mime_Part_Attachment'); $att->setId(); $att->setData($content); $att->setMime($meta['content-type']); if (!empty($meta['content-name'])) { $att->setName($meta['content-name']); } if (!empty($meta['disposition-filename'])) { $att->setName($meta['disposition-filename']); } if (!empty($meta['content-id'])) { $cId = trim($meta['content-id']); if (!empty($cId)) { $att->setCid($cId); } } $this->attachment[] = $att; } }