+/**
+ * OBSOLETE FUNCTION should be removed after mailbox_display,
+ * printMessage function is adapted
+ * $addr_ar = array(), $group = '' and $host='' arguments are used in 1.4.0
+ * @param string $address
+ * @param integer $max
+ * @since 1.4.0
+ * @deprecated See Rfc822Address.php
+ */
+function parseAddress($address, $max=0) {
+ $aAddress = parseRFC822Address($address,array('limit'=> $max));
+ /*
+ * Because the expected format of the array element is changed we adapt it now.
+ * This also implies that this function is obsolete and should be removed after the
+ * rest of the source is adapted. See Rfc822Address.php for the new function.
+ */
+ array_walk($aAddress, '_adaptAddress');
+ return $aAddress;
+}
+
+/**
+ * OBSOLETE FUNCTION should be removed after mailbox_display,
+ * printMessage function is adapted
+ *
+ * callback function used for formating of addresses array in
+ * parseAddress() function
+ * @param array $aAddr
+ * @param integer $k array key
+ * @since 1.5.1
+ * @deprecated
+ */
+function _adaptAddress(&$aAddr,$k) {
+ $sPersonal = (isset($aAddr[SQM_ADDR_PERSONAL]) && $aAddr[SQM_ADDR_PERSONAL]) ?
+ $aAddr[SQM_ADDR_PERSONAL] : '';
+ $sEmail = ($aAddr[SQM_ADDR_HOST]) ?
+ $aAddr[SQM_ADDR_MAILBOX] . '@'.$aAddr[SQM_ADDR_HOST] :
+ $aAddr[SQM_ADDR_MAILBOX];
+ $aAddr = array($sEmail,$sPersonal);
+}
+
+/**
+ * Returns the number of unseen messages in this folder.
+ * obsoleted by sqimap_status_messages !
+ * Arguments differ in 1.0.x
+ * @param stream $imap_stream
+ * @param string $mailbox
+ * @return integer
+ * @deprecated
+ */
+function sqimap_unseen_messages ($imap_stream, $mailbox) {
+ $aStatus = sqimap_status_messages($imap_stream,$mailbox,array('UNSEEN'));
+ return $aStatus['UNSEEN'];
+}
+
+/**
+ * Returns the status items of a mailbox.
+ * Default it returns MESSAGES,UNSEEN and RECENT
+ * Supported status items are MESSAGES, UNSEEN, RECENT (since 1.4.0),
+ * UIDNEXT (since 1.5.1) and UIDVALIDITY (since 1.5.1)
+ * @param stream $imap_stream imap stream
+ * @param string $mailbox mail folder
+ * @param array $aStatusItems status items
+ * @return array
+ * @since 1.3.2
+ */
+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 = $uidnext = $uidvalidity = 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];
+ }
+ 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++;
+ }
+
+ $status=array('MESSAGES' => $messages,
+ 'UNSEEN'=>$unseen,
+ 'RECENT' => $recent,
+ 'UIDNEXT' => $uidnext,
+ 'UIDVALIDITY' => $uidvalidity);
+
+ if (!empty($messages)) { $hook_status['MESSAGES']=$messages; }
+ if (!empty($unseen)) { $hook_status['UNSEEN']=$unseen; }
+ if (!empty($recent)) { $hook_status['RECENT']=$recent; }
+ if (!empty($hook_status)) {
+ $hook_status['MAILBOX']=$mailbox;
+ $hook_status['CALLER']='sqimap_status_messages';
+ do_hook('folder_status', $hook_status);
+ }
+ return $status;
+}
+
+
+/**
+ * Saves a message to a given folder -- used for saving sent messages
+ * @param stream $imap_stream
+ * @param string $sent_folder
+ * @param $length
+ * @return string $sid
+ */
+function sqimap_append ($imap_stream, $sMailbox, $length) {
+ $sid = sqimap_session_id();
+ $query = $sid . ' APPEND ' . sqimap_encode_mailbox_name($sMailbox) . " (\\Seen) {".$length."}";
+ fputs ($imap_stream, "$query\r\n");
+ $tmp = fgets ($imap_stream, 1024);
+ sqimap_append_checkresponse($tmp, $sMailbox,$sid, $query);
+ return $sid;
+}
+
+/**
+ * @param stream imap_stream
+ * @param string $folder (since 1.3.2)
+ */
+function sqimap_append_done ($imap_stream, $sMailbox='') {
+ fputs ($imap_stream, "\r\n");
+ $tmp = fgets ($imap_stream, 1024);
+ while (!sqimap_append_checkresponse($tmp, $sMailbox)) {
+ $tmp = fgets ($imap_stream, 1024);
+ }
+}
+
+/**
+ * Displays error messages, if there are errors in responses to
+ * commands issues by sqimap_append() and sqimap_append_done() functions.
+ * @param string $response
+ * @param string $sMailbox
+ * @return bool $bDone
+ * @since 1.5.1 and 1.4.5
+ */
+function sqimap_append_checkresponse($response, $sMailbox, $sid='', $query='') {
+ // static vars to keep them available when sqimap_append_done calls this function.
+ static $imapquery, $imapsid;
+
+ $bDone = false;
+
+ if ($query) {
+ $imapquery = $query;
+ }
+ if ($sid) {
+ $imapsid = $sid;
+ }
+ if ($response{0} == '+') {
+ // continuation request triggerd by sqimap_append()
+ $bDone = true;
+ } else {
+ $i = strpos($response, ' ');
+ $sRsp = substr($response,0,$i);
+ $sMsg = substr($response,$i+1);
+ $aExtra = array('MAILBOX' => $sMailbox);
+ switch ($sRsp) {
+ case '*': //untagged response
+ $i = strpos($sMsg, ' ');
+ $sRsp = strtoupper(substr($sMsg,0,$i));
+ $sMsg = substr($sMsg,$i+1);
+ if ($sRsp == 'NO' || $sRsp == 'BAD') {
+ // for the moment disabled. Enable after 1.5.1 release.
+ // Notices could give valueable information about the mailbox
+ // sqm_trigger_imap_error('SQM_IMAP_APPEND_NOTICE',$imapquery,$sRsp,$sMsg);
+ }
+ $bDone = false;
+ case $imapsid:
+ // A001 OK message
+ // $imapsid<space>$sRsp<space>$sMsg
+ $bDone = true;
+ $i = strpos($sMsg, ' ');
+ $sRsp = strtoupper(substr($sMsg,0,$i));
+ $sMsg = substr($sMsg,$i+1);
+ switch ($sRsp) {
+ case 'NO':
+ if (preg_match("/(.*)(quota)(.*)$/i", $sMsg, $aMatch)) {
+ sqm_trigger_imap_error('SQM_IMAP_APPEND_QUOTA_ERROR',$imapquery,$sRsp,$sMsg,$aExtra);
+ } else {
+ sqm_trigger_imap_error('SQM_IMAP_APPEND_ERROR',$imapquery,$sRsp,$sMsg,$aExtra);
+ }
+ break;
+ case 'BAD':
+ sqm_trigger_imap_error('SQM_IMAP_ERROR',$imapquery,$sRsp,$sMsg,$aExtra);
+ break;
+ case 'BYE':
+ sqm_trigger_imap_error('SQM_IMAP_BYE',$imapquery,$sRsp,$sMsg,$aExtra);
+ break;
+ case 'OK':
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ // should be false because of the unexpected response but i'm not sure if
+ // that will cause an endless loop in sqimap_append_done
+ $bDone = true;
+ }
+ }
+ return $bDone;
+}
+
+/**
+ * Allows mapping of IMAP server address with custom function
+ * see map_yp_alias()
+ * @param string $imap_server imap server address or mapping
+ * @param string $username
+ * @return string
+ * @since 1.3.0
+ */
+function sqimap_get_user_server ($imap_server, $username) {
+ if (substr($imap_server, 0, 4) != "map:") {
+ return $imap_server;