* This implements functions that manipulate messages
* NOTE: Quite a few functions in this file are obsolete
*
- * @copyright © 1999-2006 The SquirrelMail Project Team
+ * @copyright © 1999-2007 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id$
* @package squirrelmail
// FIX ME, remove globals by introducing an associative array with properties
// as 4th argument as replacement for the bypass_trash var
global $move_to_trash, $trash_folder;
- $bRes = true;
if (($move_to_trash == true) && ($bypass_trash != true) &&
(sqimap_mailbox_exists($imap_stream, $trash_folder) && ($mailbox != $trash_folder)) ) {
- $bRes = sqimap_msgs_list_copy ($imap_stream, $id, $trash_folder);
- }
- if ($bRes) {
- return sqimap_toggle_flag($imap_stream, $id, '\\Deleted', true, true);
- } else {
- return false;
+ /**
+ * turn off internal error handling (fourth argument = false) and
+ * ignore copy to trash errors (allows to delete messages when overquota)
+ */
+ sqimap_msgs_list_copy ($imap_stream, $id, $trash_folder, false);
}
+ return sqimap_toggle_flag($imap_stream, $id, '\\Deleted', true, true);
}
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]));
}
}
}
} 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);
return $timepassed;
}
-
-/**
- * Normalise the different Priority headers into a uniform value,
- * namely that of the X-Priority header (1, 3, 5). Supports:
- * Prioirty, X-Priority, Importance.
- * X-MS-Mail-Priority is not parsed because it always coincides
- * with one of the other headers.
- *
- * FIXME: DUPLICATE CODE ALERT:
- * NOTE: this is actually a duplicate from the function in
- * class/mime/Rfc822Header.php.
- * @todo obsolate function or use it instead of code block in parseFetch()
- */
-function parsePriority($sValue) {
- $aValue = split('/\w/',trim($sValue));
- $value = strtolower(array_shift($aValue));
- if ( is_numeric($value) ) {
- return $value;
- }
- if ( $value == 'urgent' || $value == 'high' ) {
- return 1;
- } elseif ( $value == 'non-urgent' || $value == 'low' ) {
- return 5;
- }
- return 3;
-}
-
/**
* Parses a string in an imap response. String starts with " or { which means it
* can handle double quoted strings and literal strings
case 'x-priority': $aMsg['x-priority'] = ($value) ? (int) $value{0} : 3; break;
case 'priority':
case 'importance':
+ // duplicate code with Rfc822Header.cls:parsePriority()
if (!isset($aMsg['x-priority'])) {
- $aPrio = split('/\w/',trim($value));
+ $aPrio = preg_split('/\s/',trim($value));
$sPrio = strtolower(array_shift($aPrio));
if (is_numeric($sPrio)) {
$iPrio = (int) $sPrio;
* @param resource $imap_stream imap connection
* @param integer $id uid of the message
* @param string $mailbox used for error handling, can be removed because we should return an error code and generate the message elsewhere
- * @return Message Message object
+ * @param int $hide Indicates whether or not to hide any errors: 0 = don't hide, 1 = hide (just exit), 2 = hide (return FALSE), 3 = hide (return error string) (OPTIONAL; default don't hide)
+ * @return mixed Message object or FALSE/error string if error occurred and $hide is set to 2/3
*/
-function sqimap_get_message($imap_stream, $id, $mailbox) {
+function sqimap_get_message($imap_stream, $id, $mailbox, $hide=0) {
// typecast to int to prohibit 1:* msgs sets
$id = (int) $id;
$flags = array();
if ($read) {
if (preg_match('/.+FLAGS\s\((.*)\)\s/AUi',$read[0],$regs)) {
if (trim($regs[1])) {
- $flags = preg_split('/ /', $regs[1],-1,'PREG_SPLIT_NI_EMPTY');
+ $flags = preg_split('/ /', $regs[1],-1,PREG_SPLIT_NO_EMPTY);
}
}
} else {
+
+ if ($hide == 1) exit;
+ 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.");
+
+ if ($hide == 3) return $errmessage;
+
+ $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).");
- $errmessage = _("The server couldn't find the message you requested.") .
- '<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);
+ }
+ }
+}