/**
* imap_general.php
*
- * Copyright (c) 1999-2003 The SquirrelMail Project Team
+ * Copyright (c) 1999-2004 The SquirrelMail Project Team
* Licensed under the GNU GPL. For full terms see the file COPYING.
*
* This implements all functions that do general imap functions.
*
- * $Id$
+ * @version $Id$
* @package squirrelmail
+ * @subpackage imap
*/
/** Includes.. */
require_once(SM_PATH . 'functions/auth.php');
-global $sqimap_session_id;
-$sqimap_session_id = 1;
-
/**
* Generates a new session ID by incrementing the last one used;
* this ensures that each command has a unique ID.
* @param bool unique_id
* @return string IMAP session id of the form 'A000'.
*/
-function sqimap_session_id($unique_id = false) {
- global $data_dir, $username, $sqimap_session_id;
+function sqimap_session_id($unique_id = FALSE) {
+ static $sqimap_session_id = 1;
+
if (!$unique_id) {
return( sprintf("A%03d", $sqimap_session_id++) );
} else {
$read = sqimap_read_data ($imap_stream, $tag, $handle_errors, $response,
$message, $query,$filter,$outputstream,$no_return);
+ if (empty($read)) { //Imap server dropped its connection
+ $response = '';
+ $message = '';
+ return false;
+ }
/* retrieve the response and the message */
$response = $response[$tag];
$message = $message[$tag];
-
+
if (!empty($read[$tag])) {
return $read[$tag][0];
} else {
if ($iSize < $iBufferSize) {
$iBufferSize = $iSize;
}
+
$iRetrieved = 0;
$results = '';
$sRead = $sReadRem = '';
$sRead = $sReadRem . $sRead;
$sReadRem = '';
}
- if (substr($sRead,-1) !== "\n") {
- $i = strrpos($sRead,"\n");
- if ($i !== false && $iRetrieved<$iSize) {
- ++$i;
- $sReadRem = substr($sRead,$i);
- $sRead = substr($sRead,0,$i);
- } else if ($iLength && $iRetrieved<$iSize) { // linelength > received buffer
- $sReadRem = $sRead;
- $sRead = '';
- }
- }
+
if ($filter && $sRead) {
- $filter($sRead);
+ // in case the filter is base64 decoding we return a remainder
+ $sReadRem = $filter($sRead);
}
if ($outputstream && $sRead) {
if (is_resource($outputstream)) {
return $results;
}
+
/**
* Obsolete function, inform plugins that use it
* @deprecated use sqimap_run_command or sqimap_run_command_list instead
* Function to display an error related to an IMAP-query.
* @param string title the caption of the error box
* @param string query the query that went wrong
- * @param string message_title
- * @param string message the error message
+ * @param string message_title optional message title
+ * @param string message optional error message
+ * @param string $link an optional link to try again
* @return void
*/
-function sqimap_error_box($title, $query = '', $message_title = '', $message = '')
+function sqimap_error_box($title, $query = '', $message_title = '', $message = '', $link = '')
{
global $color, $squirrelmail_language;
if ($message != '')
$string .= htmlspecialchars($message);
$string .= "</font><br>\n";
+ if ($link != '')
+ $string .= $link;
error_box($string,$color);
}
$read = '';
if (!is_array($message)) $message = array();
if (!is_array($response)) $response = array();
+ $aResponse = '';
$resultlist = array();
$data = array();
$read = sqimap_fgets($imap_stream);
/* error processing in case $read is false */
if ($read === false) {
- unset($data);
- sqimap_error_box(_("ERROR : Connection dropped by imap-server."), $query);
- exit;
+ // try to retrieve an untagged bye respons from the results
+ $sResponse = array_pop($data);
+ if ($sResponse !== NULL && strpos($sResponse,'* BYE') !== false) {
+ if (!$handle_errors) {
+ $query = '';
+ }
+ sqimap_error_box(_("ERROR : Imap server closed the connection."), $query, _("Server responded:"),$sResponse);
+ echo '</body></html>';
+ exit;
+ } else if ($handle_errors) {
+ unset($data);
+ sqimap_error_box(_("ERROR : Connection dropped by imap-server."), $query);
+ exit;
+ }
}
/* Set $resultlist array */
/* Return result or handle errors */
if ($handle_errors == false) {
return $aResponse;
- return( $resultlist ); //?? Why this?
}
switch ($response[$tag]) {
case 'OK':
function sqimap_create_stream($server,$port,$tls=false) {
global $username, $use_imap_tls;
- if ($use_imap_tls == true) {
+ if ($tls == true) {
if ((check_php_version(4,3)) and (extension_loaded('openssl'))) {
/* Use TLS by prefixing "tls://" to the hostname */
- $server = 'tls://' . $imap_server_address;
+ $server = 'tls://' . $server;
} else {
require_once(SM_PATH . 'functions/display_messages.php');
$string = "Unable to connect to IMAP server!<br>TLS is enabled, but this " .
for ($i=2; $i < count($c); $i++) {
$cap_list = explode('=', $c[$i]);
if (isset($cap_list[1])) {
+ // FIX ME. capabilities can occure multiple times.
+ // THREAD=REFERENCES THREAD=ORDEREDSUBJECT
$sqimap_capabilities[$cap_list[0]] = $cap_list[1];
} else {
$sqimap_capabilities[$cap_list[0]] = TRUE;
/**
* Returns the number of unseen messages in this folder.
+ * obsoleted by sqimap_status_messages !
*/
function sqimap_unseen_messages ($imap_stream, $mailbox) {
- $read_ary = sqimap_run_command ($imap_stream, 'STATUS ' . sqimap_encode_mailbox_name($mailbox) . ' (UNSEEN)', false, $result, $message);
- $i = 0;
- $regs = array(false, false);
- while (isset($read_ary[$i])) {
- if (ereg("UNSEEN ([0-9]+)", $read_ary[$i], $regs)) {
- break;
- }
- $i++;
- }
- return $regs[1];
+ $aStatus = sqimap_status_messages($imap_stream,$mailbox,array('UNSEEN'));
+ return $aStatus['UNSEEN'];
}
/**
- * Returns the number of total/unseen/recent messages in this folder
+ * Returns the status items of a mailbox.
+ * Default it returns MESSAGES,UNSEEN and RECENT
+ * Supported status items are MESSAGES, UNSEEN, RECENT, UIDNEXT and UIDVALIDITY
*/
-function sqimap_status_messages ($imap_stream, $mailbox) {
- $read_ary = sqimap_run_command ($imap_stream, 'STATUS ' . sqimap_encode_mailbox_name($mailbox) . ' (MESSAGES UNSEEN RECENT)', false, $result, $message);
+function sqimap_status_messages ($imap_stream, $mailbox,
+ $aStatusItems = array('MESSAGES','UNSEEN','RECENT')) {
+
+ $aStatusItems = implode(' ',$aStatusItems);
+ $read_ary = sqimap_run_command ($imap_stream, 'STATUS ' . sqimap_encode_mailbox_name($mailbox) .
+ " ($aStatusItems)", false, $result, $message);
$i = 0;
- $messages = $unseen = $recent = false;
+ $messages = $unseen = $recent = $uidnext = $uidvalidity = false;
$regs = array(false,false);
while (isset($read_ary[$i])) {
if (preg_match('/UNSEEN\s+([0-9]+)/i', $read_ary[$i], $regs)) {
if (preg_match('/RECENT\s+([0-9]+)/i', $read_ary[$i], $regs)) {
$recent = $regs[1];
}
+ if (preg_match('/UIDNEXT\s+([0-9]+)/i', $read_ary[$i], $regs)) {
+ $uidnext = $regs[1];
+ }
+ if (preg_match('/UIDVALIDITY\s+([0-9]+)/i', $read_ary[$i], $regs)) {
+ $uidvalidity = $regs[1];
+ }
$i++;
}
- return array('MESSAGES' => $messages, 'UNSEEN'=>$unseen, 'RECENT' => $recent);
+ return array('MESSAGES' => $messages,
+ 'UNSEEN'=>$unseen,
+ 'RECENT' => $recent,
+ 'UIDNEXT' => $uidnext,
+ 'UIDVALIDITY' => $uidvalidity);
}