+ }
+ }
+ return false; //"BUG! Couldn't get number of messages in $mailbox!";
+}
+
+
+function parseAddress($address, $max=0, $addr_ar = array(), $group = '', $host='', $limit=0) {
+ $pos = 0;
+ $j = strlen($address);
+ $personal = '';
+ $addr = '';
+ $comment = '';
+ if ($max && $max == count($addr_ar)) {
+ return $addr_ar;
+ }
+ while ($pos < $j) {
+ if ($max && $max == count($addr_ar)) {
+ return $addr_ar;
+ }
+ $char = $address{$pos};
+ switch ($char) {
+ case '=':
+ /* check if it is an encoded string */
+ if (preg_match('/^(=\?([^?]*)\?(Q|B)\?([^?]*)\?=)(.*)/Ui',substr($address,$pos),$reg)) {
+ /* add stringpart before the encoded string to the personal var */
+ if (!$personal) {
+ $personal = substr($address,0,$pos);
+ }
+ $personal .= $reg[1];
+ $pos += strlen($reg[1]);
+ } else {
+ ++$pos;
+ }
+ break;
+ case '"': /* get the personal name */
+ ++$pos;
+ if ($address{$pos} == '"') {
+ ++$pos;
+ } else {
+ $personal_start = $personal_end = $pos;
+ while ($pos < $j) {
+ $personal_end = strpos($address,'"',$pos);
+ if (($personal_end-2)>0 && (substr($address,$personal_end-2,2) === '\\"' ||
+ substr($address,$personal_end-2,2) === '\\\\')) {
+ $pos = $personal_end+1;
+ } else {
+ $personal = substr($address,$personal_start,$personal_end-$personal_start);
+ break;
+ }
+ }
+ if ($personal_end) { /* prohibit endless loops due to very wrong addresses */
+ $pos = $personal_end+1;
+ } else {
+ $pos = $j;
+ }
+ }
+ break;
+ case '<': /* get email address */
+ $addr_start = $pos;
+ $addr_end = strpos($address,'>',$addr_start);
+ if($addr_end === FALSE) {
+ // in case the address doesn't end, prevent loop
+ $pos++;
+ } else {
+ $addr = substr($address,$addr_start+1,$addr_end-$addr_start-1);
+ $pos = $addr_end+1;
+ }
+ break;
+ case '(': /* rip off comments */
+ $addr_start = $pos;
+ $pos = strpos($address,')');
+ if ($pos !== false) {
+ $comment = substr($address, $addr_start+1,($pos-$addr_start-1));
+ $address_start = substr($address, 0, $addr_start);
+ $address_end = substr($address, $pos + 1);
+ $address = $address_start . $address_end;
+ }
+ $j = strlen($address);
+ $pos = $addr_start + 1;
+ break;
+ case ';': /* we reached a non rfc2822 compliant delimiter */
+ if ($group) {
+ $address = substr($address, 0, $pos - 1);
+ ++$pos;
+ break;
+ }
+ case ',': /* we reached a delimiter */
+ if ($addr == '') {
+ $addr = substr($address, 0, $pos);
+ } else if ($personal == '') {
+ $personal = trim(substr($address, 0, $addr_start));
+ }
+ if (!$personal && $comment) $personal = $comment;
+ if ($personal) $personal = decodeHeader($personal);
+ $addr_ar[] = array($addr,$personal);
+ $address = trim(substr($address, $pos+1));
+ $j = strlen($address);
+ $pos = 0;
+ $personal = '';
+ $addr = '';
+ break;
+ case ':': /* process the group addresses */
+ /* group marker */
+ $group = substr($address, 0, $pos);
+ $address = substr($address, $pos+1);
+ $result = parseAddress($address, $max, $addr_ar, $group);
+ $addr_ar = $result[0];
+ $pos = $result[1];
+ $address = substr($address, $pos++);
+ $j = strlen($address);
+ $group = '';
+ break;
+ default:
+ ++$pos;
+ break;
+ }
+ }
+ if ($addr == '') {
+ $addr = substr($address, 0, $pos);
+ } else if ($personal == '') {
+ $personal = trim(substr($address, 0, $addr_start));
+ }
+ if (!$personal && $comment) $personal = $comment;
+ $email = $addr;
+ if ($group && $addr == '') { /* no addresses found in group */
+ $personal = $group;
+ $addr_ar[] = array('',$personal);
+ return (array($addr_ar,$pos+1 ));
+ } elseif ($group) {
+ $addr_ar[] = array($addr,$personal);
+ return (array($addr_ar,$pos+1 ));
+ } else {
+ if ($personal || $addr) {
+ $addr_ar[] = array($addr, $personal);
+ }
+ }
+ return ($addr_ar);
+}
+
+/*
+ * 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;
+ }
+ }
+}