+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 ' . 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];
+}
+
+/*
+ * Returns the number of total/unseen/recent messages in this folder
+ */
+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);
+ $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 ' . sqimap_encode_mailbox_name($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;