/** * メール読み取り */ public static function readMail() { // 標準入力から読み取り $message = new Zend_Mail_Message(array('file' => 'php://stdin')); $obj = array(); // 差出人 $obj['from'] = self::getMailAddress($message->from); // 宛先 $obj['to'] = self::getMailAddress($message->to); // 件名 if ($message->getHeader('subject')) { $obj['subject'] = $message->subject; } else { $obj['subject'] = ''; } // 本文 $obj['body'] = $message->getContent(); // 不正なメールアドレスなので無視 if (preg_match("/^MAILER\\-DAEMON\\@/i", $obj['from']) || preg_match("/^postmaster\\@/i", $obj['from']) || $obj['from'] === '*****@*****.**' || strlen($obj['from']) === 0 || !preg_match("/.+\\@[a-zA-Z0-9][a-zA-Z0-9\\-\\.]+\\.[a-zA-Z]+\$/", $obj['from'])) { exit; } // 添付ファイル処理 if ($message->isMultipart()) { // 添付ファイル数 $obj['files'] = $message->countParts() - 1; // 添付ファイル for ($i = 2; $i <= $message->countParts(); $i++) { $obj['files_type_' . ($i - 2)] = $message->getPart($i)->getHeader('content-type'); $obj['files_body_' . ($i - 2)] = $message->getPart($i)->getContent(); } } else { // 添付ファイル数 $obj['files'] = 0; } return $obj; }
public function testIsMultipart() { $message = new Zend_Mail_Message(array('file' => $this->_file)); $this->assertTrue($message->isMultipart()); }
public function testCaseInsensitiveMultipart() { $message = new Zend_Mail_Message(array('raw' => "coNTent-TYpe: muLTIpaRT/x-empty\r\n\r\n")); $this->assertTrue($message->isMultipart()); }
/** * Статический метод производящий декодировку письма * * @param string $input полный оригинальный текст email с заголовками * @return array|false, в случае неверного формата входящих данных (отсутствует заголовок или часть заголовка) */ public static function getEmailData($input) { // подключить ZF autoloader ProjectConfiguration::registerZend(); $message = new Zend_Mail_Message(array('raw' => $input)); $headers = $message->getHeaders(); if (!count($headers)) { return false; } if (!isset($headers['subject']) || !isset($headers['from']) || !isset($headers['to'])) { return false; } // выдергиваем текстовое тело письма, если можем $body = null; if ($message->isMultipart()) { foreach (new RecursiveIteratorIterator($message) as $part) { try { if (strtok($part->contentType, ';') == 'text/plain') { $body = trim($part); $partHeaders = $part->getHeaders(); break; } } catch (Zend_Mail_Exception $e) { } } // в письме нет текстового варианта // FIXME как-то по человечески обрабатывать if (!$body) { throw new Exception(); } } else { $body = trim($message->getContent()); $partHeaders = $message->getHeaders(); } if (isset($partHeaders['content-transfer-encoding'])) { switch ($partHeaders['content-transfer-encoding']) { // FIXME хз нужно ли нам оно, на локалке не стоит imap_* // м.б. есть альтернативные варианты /* case '7bit': break; case '8bit': $body = quoted_printable_decode(imap_8bit($body)); break; case 'binary': $body = imap_base64(imap_binary($body)); break; case 'base64': $body = imap_base64($body); break; */ case 'quoted-printable': $body = quoted_printable_decode($body); break; case 'base64': $body = base64_decode($body); break; } } if (isset($partHeaders['content-type']) && preg_match("/^(?:.+?);\\scharset=(.+)\$/", $partHeaders['content-type'], $matches)) { $charset = trim($matches['1']); if (!preg_match("/^(utf-8|utf8)\$/i", $charset)) { $body = iconv($charset, "UTF-8//IGNORE", $body); } } $data = array('from' => self::_cleanEmail($headers['from']), 'to' => self::_cleanEmail($headers['to']), 'subject' => $headers['subject'], 'body' => $body); return $data; }
/** * @param Zend_Mail_Message $message * * @return array('filename' => $filename, 'content' => $content) | false */ protected function _getMessageAttachment($message) { $data = array(); // Get first flat part if ($message->isMultipart()) { $parts = $message; foreach (new RecursiveIteratorIterator($parts) as $part) { $attach = $this->_getMessageAttachment($part); if ($attach) { $data[] = $attach; } } } else { $headers = $message->getHeaders(); $isAttachment = null; foreach ($headers as $value) { if (is_array($value)) { $value = implode(";", $value); } if ($isAttachment = preg_match('/(name|filename)="{0,1}([^;\\"]*)"{0,1}/si', $value, $matches)) { break; } } if ($isAttachment) { $filename = $matches[2]; $encodedContent = $message->getContent(); // Decoding transfer-encoding switch ($transferEncoding = @$headers['content-transfer-encoding']) { case Zend_Mime::ENCODING_QUOTEDPRINTABLE: $content = quoted_printable_decode($encodedContent); break; case Zend_Mime::ENCODING_BASE64: $content = base64_decode($encodedContent); break; default: $content = $encodedContent; } $filename = iconv_mime_decode($filename, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8'); return array('filename' => $filename, 'content' => $content); } return false; } return $data; }