+/* Simply logs out the IMAP session */
+function sqimap_logout ($imap_stream) {
+ /* Logout is not valid until the server returns 'BYE'
+ * If we don't have an imap_ stream we're already logged out */
+ if(isset($imap_stream) && $imap_stream)
+ sqimap_run_command($imap_stream, 'LOGOUT', false, $response, $message);
+}
+
+function sqimap_capability($imap_stream, $capability='') {
+ global $sqimap_capabilities;
+ if (!is_array($sqimap_capabilities)) {
+ $read = sqimap_run_command($imap_stream, 'CAPABILITY', true, $a, $b);
+
+ $c = explode(' ', $read[0]);
+ for ($i=2; $i < count($c); $i++) {
+ $cap_list = explode('=', $c[$i]);
+ if (isset($cap_list[1])) {
+ $sqimap_capabilities[$cap_list[0]] = $cap_list[1];
+ } else {
+ $sqimap_capabilities[$cap_list[0]] = TRUE;
+ }
+ }
+ }
+ if ($capability) {
+ if (isset($sqimap_capabilities[$capability])) {
+ return $sqimap_capabilities[$capability];
+ } else {
+ return false;
+ }
+ }
+ return $sqimap_capabilities;
+}
+
+/* Returns the delimeter between mailboxes: INBOX/Test, or INBOX.Test */
+function sqimap_get_delimiter ($imap_stream = false) {
+ global $sqimap_delimiter, $optional_delimiter;
+
+ /* Use configured delimiter if set */
+ if((!empty($optional_delimiter)) && $optional_delimiter != 'detect') {
+ return $optional_delimiter;
+ }
+
+ /* Do some caching here */
+ if (!$sqimap_delimiter) {
+ if (sqimap_capability($imap_stream, 'NAMESPACE')) {
+ /*
+ * According to something that I can't find, this is supposed to work on all systems
+ * OS: This won't work in Courier IMAP.
+ * OS: According to rfc2342 response from NAMESPACE command is:
+ * OS: * NAMESPACE (PERSONAL NAMESPACES) (OTHER_USERS NAMESPACE) (SHARED NAMESPACES)
+ * OS: We want to lookup all personal NAMESPACES...
+ */
+ $read = sqimap_run_command($imap_stream, 'NAMESPACE', true, $a, $b);
+ if (eregi('\\* NAMESPACE +(\\( *\\(.+\\) *\\)|NIL) +(\\( *\\(.+\\) *\\)|NIL) +(\\( *\\(.+\\) *\\)|NIL)', $read[0], $data)) {
+ if (eregi('^\\( *\\((.*)\\) *\\)', $data[1], $data2)) {
+ $pn = $data2[1];
+ }
+ $pna = explode(')(', $pn);
+ while (list($k, $v) = each($pna)) {
+ $lst = explode('"', $v);
+ if (isset($lst[3])) {
+ $pn[$lst[1]] = $lst[3];
+ } else {
+ $pn[$lst[1]] = '';
+ }
+ }
+ }
+ $sqimap_delimiter = $pn[0];
+ } else {
+ fputs ($imap_stream, ". LIST \"INBOX\" \"\"\r\n");
+ $read = sqimap_read_data($imap_stream, '.', true, $a, $b);
+ $quote_position = strpos ($read[0], '"');
+ $sqimap_delimiter = substr ($read[0], $quote_position+1, 1);
+ }
+ }
+ return $sqimap_delimiter;
+}
+
+
+/* Gets the number of messages in the current mailbox. */
+function sqimap_get_num_messages ($imap_stream, $mailbox) {
+ $read_ary = sqimap_run_command ($imap_stream, "EXAMINE \"$mailbox\"", false, $result, $message);
+ for ($i = 0; $i < count($read_ary); $i++) {
+ if (ereg("[^ ]+ +([^ ]+) +EXISTS", $read_ary[$i], $regs)) {
+ return $regs[1];
+ }
+ }
+ return false; //"BUG! Couldn't get number of messages in $mailbox!";
+}
+
+
+function parseAddress($address, $max=0) {
+ $aTokens = array();
+ $aAddress = array();
+ $iCnt = strlen($address);
+ $aSpecials = array('(' ,'<' ,',' ,';' ,':');
+ $aReplace = array(' (',' <',' ,',' ;',' :');
+ $address = str_replace($aSpecials,$aReplace,$address);
+ $i = $iAddrFound = $bGroup = 0;
+ while ($i < $iCnt) {
+ $cChar = $address{$i};
+ switch($cChar)
+ {
+ case '<':
+ $iEnd = strpos($address,'>',$i+1);
+ if (!$iEnd) {
+ $sToken = substr($address,$i);
+ $i = $iCnt;
+ } else {
+ $sToken = substr($address,$i,$iEnd - $i +1);
+ $i = $iEnd;
+ }
+ $sToken = str_replace($aReplace, $aSpecials,$sToken);
+ $aTokens[] = $sToken;
+ break;
+ case '"':
+ $iEnd = strpos($address,$cChar,$i+1);
+ if ($iEnd) {
+ // skip escaped quotes
+ $prev_char = $address{$iEnd-1};
+ while ($prev_char === '\\' && substr($address,$iEnd-2,2) !== '\\\\') {
+ $iEnd = strpos($address,$cChar,$iEnd+1);
+ if ($iEnd) {
+ $prev_char = $address{$iEnd-1};
+ } else {
+ $prev_char = false;
+ }
+ }
+ }
+ if (!$iEnd) {
+ $sToken = substr($address,$i);
+ $i = $iCnt;
+ } else {
+ // also remove the surrounding quotes
+ $sToken = substr($address,$i+1,$iEnd - $i -1);
+ $i = $iEnd;
+ }
+ $sToken = str_replace($aReplace, $aSpecials,$sToken);
+ if ($sToken) $aTokens[] = $sToken;
+ break;
+ case '(':
+ $iEnd = strpos($address,')',$i);
+ if (!$iEnd) {
+ $sToken = substr($address,$i);
+ $i = $iCnt;
+ } else {
+ $sToken = substr($address,$i,$iEnd - $i + 1);
+ $i = $iEnd;
+ }
+ $sToken = str_replace($aReplace, $aSpecials,$sToken);
+ $aTokens[] = $sToken;
+ break;
+ case ',':
+ ++$iAddrFound;
+ case ';':
+ if (!$bGroup) {
+ ++$iAddrFound;
+ } else {
+ $bGroup = false;
+ }
+ if ($max && $max == $iAddrFound) {
+ break 2;
+ } else {
+ $aTokens[] = $cChar;
+ break;
+ }
+ case ':':
+ $bGroup = true;
+ case ' ':
+ $aTokens[] = $cChar;
+ break;
+ default:
+ $iEnd = strpos($address,' ',$i+1);
+ if ($iEnd) {
+ $sToken = trim(substr($address,$i,$iEnd - $i));
+ $i = $iEnd-1;
+ } else {
+ $sToken = trim(substr($address,$i));
+ $i = $iCnt;
+ }
+ if ($sToken) $aTokens[] = $sToken;
+ }
+ ++$i;
+ }
+ $sPersonal = $sEmail = $sComment = $sGroup = '';
+ $aStack = $aComment = array();
+ foreach ($aTokens as $sToken) {
+ if ($max && $max == count($aAddress)) {
+ return $aAddress;
+ }
+ $cChar = $sToken{0};
+ switch ($cChar)
+ {
+ case '=':
+ case '"':
+ case ' ':
+ $aStack[] = $sToken;
+ break;
+ case '(':
+ $aComment[] = substr($sToken,1,-1);
+ break;
+ case ';':
+ if ($sGroup) {
+ $sEmail = trim(implode(' ',$aStack));
+ $aAddress[] = array($sGroup,$sEmail);
+ $aStack = $aComment = array();
+ $sGroup = '';
+ break;
+ }
+ case ',':
+ if (!$sEmail) {
+ while (count($aStack) && !$sEmail) {
+ $sEmail = trim(array_pop($aStack));
+ }
+ }
+ if (count($aStack)) {
+ $sPersonal = trim(implode('',$aStack));
+ } else {
+ $sPersonal = '';
+ }
+ if (!$sPersonal && count($aComment)) {
+ $sComment = implode(' ',$aComment);
+ $sPersonal .= $sComment;
+ }
+ $aAddress[] = array($sEmail,$sPersonal);
+ $sPersonal = $sComment = $sEmail = '';
+ $aStack = $aComment = array();
+ break;
+ case ':':
+ $sGroup = implode(' ',$aStack); break;
+ $aStack = array();
+ break;
+ case '<':
+ $sEmail = trim(substr($sToken,1,-1));
+ break;
+ case '>':
+ /* skip */
+ break;
+ default: $aStack[] = $sToken; break;
+ }
+ }
+ /* now do the action again for the last address */
+ if (!$sEmail) {
+ while (count($aStack) && !$sEmail) {
+ $sEmail = trim(array_pop($aStack));
+ }
+ }
+ if (count($aStack)) {
+ $sPersonal = trim(implode('',$aStack));
+ } else {
+ $sPersonal = '';
+ }
+ if (!$sPersonal && count($aComment)) {
+ $sComment = implode(' ',$aComment);
+ $sPersonal .= $sComment;
+ }
+ $aAddress[] = array($sEmail,$sPersonal);
+ return $aAddress;
+}
+
+
+
+/*
+ * Returns the number of unseen messages in this folder
+ */
+function sqimap_unseen_messages ($imap_stream, $mailbox) {
+ $read_ary = sqimap_run_command ($imap_stream, "STATUS \"$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];
+}
+
+/*
+ * Returns the number of unseen/total messages in this folder
+ */
+function sqimap_status_messages ($imap_stream, $mailbox) {
+ $read_ary = sqimap_run_command ($imap_stream, "STATUS \"$mailbox\" (MESSAGES UNSEEN RECENT)", false, $result, $message);
+ $i = 0;
+ $messages = $unseen = $recent = false;
+ $regs = array(false,false);
+ while (isset($read_ary[$i])) {
+ if (preg_match('/UNSEEN\s+([0-9]+)/i', $read_ary[$i], $regs)) {
+ $unseen = $regs[1];
+ }
+ if (preg_match('/MESSAGES\s+([0-9]+)/i', $read_ary[$i], $regs)) {
+ $messages = $regs[1];
+ }
+ if (preg_match('/RECENT\s+([0-9]+)/i', $read_ary[$i], $regs)) {
+ $recent = $regs[1];
+ }
+ $i++;
+ }
+ return array('MESSAGES' => $messages, 'UNSEEN'=>$unseen, 'RECENT' => $recent);
+}
+
+
+/*
+ * Saves a message to a given folder -- used for saving sent messages
+ */
+function sqimap_append ($imap_stream, $sent_folder, $length) {
+ fputs ($imap_stream, sqimap_session_id() . " APPEND \"$sent_folder\" (\\Seen) \{$length}\r\n");
+ $tmp = fgets ($imap_stream, 1024);
+}
+
+function sqimap_append_done ($imap_stream, $folder='') {
+ global $squirrelmail_language, $color;
+ fputs ($imap_stream, "\r\n");
+ $tmp = fgets ($imap_stream, 1024);
+ if (preg_match("/(.*)(BAD|NO)(.*)$/", $tmp, $regs)) {
+ set_up_language($squirrelmail_language);
+ require_once(SM_PATH . 'functions/display_messages.php');
+ $reason = $regs[3];
+ if ($regs[2] == 'NO') {
+ $string = "<b><font color=$color[2]>\n" .
+ _("ERROR : Could not append message to") ." $folder." .
+ "</b><br>\n" .
+ _("Server responded: ") .
+ $reason . "<br>\n";
+ if (preg_match("/(.*)(quota)(.*)$/i", $reason, $regs)) {
+ $string .= _("Solution: ") .
+ _("Remove unneccessary messages from your folder and start with your Trash folder.")
+ ."<br>\n";
+ }
+ $string .= "</font>\n";
+ error_box($string,$color);
+ } else {
+ $string = "<b><font color=$color[2]>\n" .
+ _("ERROR : Bad or malformed request.") .
+ "</b><br>\n" .
+ _("Server responded: ") .
+ $tmp . "</font><br>\n";
+ error_box($string,$color);
+ exit;
+ }
+ }
+}
+
+function sqimap_get_user_server ($imap_server, $username) {
+ if (substr($imap_server, 0, 4) != "map:") {
+ return $imap_server;