Пример #1
0
 /**
  * メール読み取り
  */
 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;
 }
Пример #2
0
 public function testIsMultipart()
 {
     $message = new Zend_Mail_Message(array('file' => $this->_file));
     $this->assertTrue($message->isMultipart());
 }
Пример #3
0
 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;
 }
Пример #5
0
 /**
  * @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;
 }