for ($i=0,$iCnt=count($aData);$i<$iCnt;++$i) {
for ($j=0,$jCnt=count($aData[$i]);$j<$jCnt;++$j) {
if (preg_match("/^\* $sCommand (.+)$/", $aData[$i][$j], $aMatch)) {
- $aUid += preg_split("/ /", trim($aMatch[1]));
+ $aUid += explode(' ', trim($aMatch[1]));
}
}
}
$msgs = sqimap_get_small_header_list($imap_stream, $aUid,
array(), array($sSortField));
}
+
+ // sqimap_get_small_header (see above) returns fields in lower case,
+ // but the code below uses all upper case
+ foreach ($msgs as $k => $v) $msgs[$k][strtoupper($sSortField)] = $msgs[$k][strtolower($sSortField)];
+
$aUid = array();
$walk = false;
switch ($sSortField) {
$sEmail = ($addr[SQM_ADDR_HOST]) ?
$addr[SQM_ADDR_MAILBOX] . "@".$addr[SQM_ADDR_HOST] :
$addr[SQM_ADDR_HOST];
- $v[$f] = ($sPersonal) ? decodeHeader($sPersonal):$sEmail;'),$sSortField);
+ $v[$f] = ($sPersonal) ? decodeHeader($sPersonal, true, false):$sEmail;'),$sSortField);
$walk = true;
}
// nobreak
if(!$walk) {
array_walk($msgs, create_function('&$v,&$k,$f',
'$v[$f] = (isset($v[$f])) ? $v[$f] : "";
- $v[$f] = strtolower(decodeHeader(trim($v[$f])));
- $v[$f] = (preg_match("/^(vedr|sv|re|aw|\[\w\]):\s*(.*)$/si", $v[$f], $matches)) ?
- $matches[2] : $v[$f];'),$sSortField);
+ $v[$f] = strtolower(decodeHeader(trim($v[$f]), true, false));
+ $v[$f] = (preg_match("/^(?:(?:vedr|sv|re|aw|fw|fwd|\[\w\]):\s*)*\s*(.*)$/si", $v[$f], $matches)) ?
+ $matches[1] : $v[$f];'),$sSortField);
$walk = true;
}
foreach ($msgs as $item) {
} elseif ($response == 'BAD') {
sqm_trigger_imap_error('SQM_IMAP_NO_THREAD',$query, $response, $message);
}
+ $sThreadResponse = '';
if (isset($sRead[0])) {
for ($i=0,$iCnt=count($sRead);$i<$iCnt;++$i) {
if (preg_match("/^\* THREAD (.+)$/", $sRead[$i], $aMatch)) {
break;
}
}
- } else {
- $sThreadResponse = "";
}
unset($sRead);
if ($hide == 2) return FALSE;
/* the message was not found, maybe the mailbox was modified? */
- global $sort, $startMessage, $color;
+ global $sort, $startMessage;
$errmessage = _("The server couldn't find the message you requested.");
$errmessage .= '<p>'._("Most probably your message list was out of date and the message has been moved away or deleted (perhaps by another program accessing the same mailbox).");
/* this will include a link back to the message list */
- error_message($errmessage, $mailbox, $sort, (int) $startMessage, $color);
+ error_message($errmessage, $mailbox, $sort, (int) $startMessage);
exit;
}
$bodystructure = implode('',$read);
$rfc822_header = new Rfc822Header();
$rfc822_header->parseHeader($read);
$msg->rfc822_header = $rfc822_header;
+
+ parse_message_entities($msg, $id, $imap_stream);
return $msg;
+ }
+
+
+/**
+ * Recursively parse embedded messages (if any) in the given
+ * message, building correct rfc822 headers for each one
+ *
+ * @param object $msg The message object to scan for attached messages
+ * NOTE: this is passed by reference! Changes made
+ * within will affect the caller's copy of $msg!
+ * @param int $id The top-level message UID on the IMAP server, even
+ * if the $msg being passed in is only an attached entity
+ * thereof.
+ * @param resource $imap_stream A live connection to the IMAP server.
+ *
+ * @return void
+ *
+ * @since 1.5.2
+ *
+ */
+function parse_message_entities(&$msg, $id, $imap_stream) {
+ global $uid_support;
+ if (!empty($msg->entities)) foreach ($msg->entities as $i => $entity) {
+ if (is_object($entity) && get_class($entity) == 'Message') {
+ if (!empty($entity->rfc822_header)) {
+ $read = sqimap_run_command($imap_stream, "FETCH $id BODY[". $entity->entity_id .".HEADER]", true, $response, $message, $uid_support);
+ $rfc822_header = new Rfc822Header();
+ $rfc822_header->parseHeader($read);
+ $msg->entities[$i]->rfc822_header = $rfc822_header;
+ }
+ parse_message_entities($msg->entities[$i], $id, $imap_stream);
+ }
+ }
}