| | |
| | | |
| | | do { |
| | | $buffer = fgets($fp, $size); |
| | | |
| | | if ($buffer === false) { |
| | | break; |
| | | } |
| | |
| | | write_log('imap', 'S: '. chop($buffer)); |
| | | $line .= $buffer; |
| | | } while ($buffer[strlen($buffer)-1] != "\n"); |
| | | |
| | | |
| | | return $line; |
| | | } |
| | | |
| | |
| | | return $data; |
| | | } |
| | | |
| | | // don't use it in loops, until you exactly know what you're doing |
| | | function iil_ReadReply($fp) { |
| | | do { |
| | | $line = trim(iil_ReadLine($fp, 1024)); |
| | | } while ($line[0] == '*'); |
| | | |
| | | |
| | | return $line; |
| | | } |
| | | |
| | | function iil_ParseResult($string) { |
| | | $a = explode(' ', $string); |
| | | if (count($a) > 2) { |
| | | $a = explode(' ', trim($string)); |
| | | if (count($a) >= 2) { |
| | | if (strcasecmp($a[1], 'OK') == 0) { |
| | | return 0; |
| | | } else if (strcasecmp($a[1], 'NO') == 0) { |
| | |
| | | return -2; |
| | | } else if (strcasecmp($a[1], 'BYE') == 0) { |
| | | return -3; |
| | | } |
| | | } |
| | | } |
| | | return -4; |
| | | } |
| | |
| | | |
| | | iil_PutLine($conn->fp, 'a001 LOGIN "'.iil_Escape($user).'" "'.iil_Escape($password).'"'); |
| | | |
| | | do { |
| | | $line = iil_ReadReply($conn->fp); |
| | | if ($line === false) { |
| | | break; |
| | | } |
| | | } while (!iil_StartsWith($line, 'a001 ', true)); |
| | | |
| | | $line = iil_ReadReply($conn->fp); |
| | | |
| | | // process result |
| | | $result = iil_ParseResult($line); |
| | | |
| | |
| | | } else if ($my_prefs['sort_field'] == 'DATE') { |
| | | $IMAP_USE_INTERNAL_DATE = false; |
| | | } |
| | | //echo '<!-- conn sort_field: '.$my_prefs['sort_field'].' //-->'; |
| | | |
| | | //check input |
| | | if (empty($host)) { |
| | |
| | | } |
| | | |
| | | stream_set_timeout($conn->fp, 10); |
| | | $line = stream_get_line($conn->fp, 8192, "\r\n"); |
| | | $line = stream_get_line($conn->fp, 8192, "\n"); |
| | | |
| | | if ($my_prefs['debug_mode'] && $line) |
| | | write_log('imap', 'S: '. $line); |
| | | |
| | | // Connected to wrong port or connection error? |
| | | if (!preg_match('/^\* (OK|PREAUTH)/i', $line)) { |
| | |
| | | $iil_errornum = -2; |
| | | return false; |
| | | } |
| | | |
| | | |
| | | // RFC3501 [7.1] optional CAPABILITY response |
| | | if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) { |
| | | $conn->capability = explode(' ', strtoupper($matches[1])); |
| | |
| | | return false; |
| | | } |
| | | do { |
| | | $line = chop(iil_ReadLine($conn->fp, 1024)); |
| | | $line = chop(iil_ReadLine($conn->fp)); |
| | | if (iil_StartsWith($line, '* SORT')) { |
| | | $data .= ($data ? ' ' : '') . substr($line, 7); |
| | | $data .= substr($line, 7); |
| | | } else if (preg_match('/^[0-9 ]+$/', $line)) { |
| | | $data .= $line; |
| | | } |
| | |
| | | return false; |
| | | } |
| | | |
| | | $out = explode(' ',$data); |
| | | return $out; |
| | | return preg_split('/\s+/', $data, -1, PREG_SPLIT_NO_EMPTY); |
| | | } |
| | | |
| | | function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field='', $skip_deleted=true) { |
| | |
| | | } |
| | | |
| | | if ($mode == 1) { |
| | | if (preg_match('/BODY\[HEADER\.FIELDS \((DATE|FROM|REPLY-TO|SENDER|TO|SUBJECT)\)\] (.*)/', $line, $matches)) { |
| | | if (preg_match('/BODY\[HEADER\.FIELDS \("?(DATE|FROM|REPLY-TO|SENDER|TO|SUBJECT)"?\)\] (.*)/', $line, $matches)) { |
| | | $value = preg_replace(array('/^"*[a-z]+:/i', '/\s+$/sm'), array('', ''), $matches[2]); |
| | | $value = trim($value); |
| | | if ($index_field == 'DATE') { |
| | |
| | | if($bodystr) { |
| | | while (!preg_match('/ BODYSTRUCTURE (.*) BODY\[HEADER.FIELDS/s', $line, $m)) { |
| | | $line2 = iil_ReadLine($fp, 1024); |
| | | $line .= iil_MultLine($fp, $line2); |
| | | $line .= iil_MultLine($fp, $line2, true); |
| | | } |
| | | $result[$id]->body_structure = $m[1]; |
| | | } |
| | |
| | | return iil_C_ModFlag($conn, $mailbox, $messages, 'DELETED', '+'); |
| | | } |
| | | |
| | | function iil_C_Undelete(&$conn, $mailbox, $messages) { |
| | | return iil_C_ModFlag($conn, $mailbox, $messages, 'DELETED', '-'); |
| | | } |
| | | |
| | | function iil_C_Unseen(&$conn, $mailbox, $messages) { |
| | | return iil_C_ModFlag($conn, $mailbox, $messages, 'SEEN', '-'); |
| | | } |
| | | |
| | | function iil_C_Copy(&$conn, $messages, $from, $to) { |
| | | $fp = $conn->fp; |
| | | |
| | |
| | | $c=0; |
| | | |
| | | iil_PutLine($fp, "cpy1 UID COPY $messages \"".iil_Escape($to)."\""); |
| | | $line=iil_ReadReply($fp); |
| | | $line = iil_ReadReply($fp); |
| | | return iil_ParseResult($line); |
| | | } else { |
| | | return -1; |
| | |
| | | } |
| | | |
| | | function iil_C_CountUnseen(&$conn, $folder) { |
| | | $index = iil_C_Search($conn, $folder, 'ALL UNSEEN'); |
| | | if (is_array($index)) { |
| | | if (($cnt = count($index)) && $index[0] != '') { |
| | | return $cnt; |
| | | } |
| | | } |
| | | return false; |
| | | $index = iil_C_Search($conn, $folder, 'ALL UNSEEN'); |
| | | if (is_array($index)) |
| | | return count($index); |
| | | return false; |
| | | } |
| | | |
| | | function iil_C_UID2ID(&$conn, $folder, $uid) { |
| | |
| | | } |
| | | |
| | | function iil_C_ID2UID(&$conn, $folder, $id) { |
| | | $fp = $conn->fp; |
| | | |
| | | if ($id == 0) { |
| | | return -1; |
| | | } |
| | | $result = -1; |
| | | if (iil_C_Select($conn, $folder)) { |
| | | $key = 'FUID'; |
| | | if (iil_PutLine($fp, "$key FETCH $id (UID)")) { |
| | | $key = 'fuid'; |
| | | if (iil_PutLine($conn->fp, "$key FETCH $id (UID)")) { |
| | | do { |
| | | $line=chop(iil_ReadLine($fp, 1024)); |
| | | $line = chop(iil_ReadLine($conn->fp, 1024)); |
| | | if (preg_match("/^\* $id FETCH \(UID (.*)\)/i", $line, $r)) { |
| | | $result = $r[1]; |
| | | } |
| | | } while (!preg_match("/^$key/", $line)); |
| | | } while (!iil_StartsWith($line, $key, true)); |
| | | } |
| | | } |
| | | return $result; |
| | | } |
| | | |
| | | function iil_C_Search(&$conn, $folder, $criteria) { |
| | | $fp = $conn->fp; |
| | | |
| | | if (iil_C_Select($conn, $folder)) { |
| | | $c = 0; |
| | | $data = ''; |
| | | |
| | | $query = 'srch1 SEARCH ' . chop($criteria); |
| | | if (!iil_PutLineC($fp, $query)) { |
| | | if (!iil_PutLineC($conn->fp, $query)) { |
| | | return false; |
| | | } |
| | | do { |
| | | $line=trim(iil_ReadLine($fp, 10000)); |
| | | if (preg_match('/^\* SEARCH/i', $line)) { |
| | | $str = trim(substr($line, 8)); |
| | | $messages = explode(' ', $str); |
| | | $line = trim(iil_ReadLine($conn->fp)); |
| | | if (iil_StartsWith($line, '* SEARCH')) { |
| | | $data .= substr($line, 8); |
| | | } else if (preg_match('/^[0-9 ]+$/', $line)) { |
| | | $data .= $line; |
| | | } |
| | | } while (!iil_StartsWith($line, 'srch1', true)); |
| | | |
| | | $result_code = iil_ParseResult($line); |
| | | if ($result_code == 0) { |
| | | return $messages; |
| | | return preg_split('/\s+/', $data, -1, PREG_SPLIT_NO_EMPTY); |
| | | } |
| | | $conn->error = 'iil_C_Search: ' . $line . "\n"; |
| | | return false; |
| | |
| | | $query = 'sub1 SUBSCRIBE "' . iil_Escape($folder). '"'; |
| | | iil_PutLine($fp, $query); |
| | | |
| | | $line = trim(iil_ReadLine($fp, 10000)); |
| | | return iil_ParseResult($line); |
| | | $line = trim(iil_ReadLine($fp, 512)); |
| | | return (iil_ParseResult($line) == 0); |
| | | } |
| | | |
| | | function iil_C_UnSubscribe(&$conn, $folder) { |
| | |
| | | $query = 'usub1 UNSUBSCRIBE "' . iil_Escape($folder) . '"'; |
| | | iil_PutLine($fp, $query); |
| | | |
| | | $line = trim(iil_ReadLine($fp, 10000)); |
| | | return iil_ParseResult($line); |
| | | $line = trim(iil_ReadLine($fp, 512)); |
| | | return (iil_ParseResult($line) == 0); |
| | | } |
| | | |
| | | function iil_C_FetchMIMEHeaders(&$conn, $mailbox, $id, $parts) { |
| | |
| | | if (iil_PutLine($fp, 'c CREATE "' . iil_Escape($folder) . '"')) { |
| | | do { |
| | | $line=iil_ReadLine($fp, 300); |
| | | } while ($line[0] != 'c'); |
| | | } while (!iil_StartsWith($line, 'c ', true)); |
| | | return (iil_ParseResult($line) == 0); |
| | | } |
| | | return false; |
| | |
| | | if (iil_PutLine($fp, 'r RENAME "' . iil_Escape($from) . '" "' . iil_Escape($to) . '"')) { |
| | | do { |
| | | $line = iil_ReadLine($fp, 300); |
| | | } while ($line[0] != 'r'); |
| | | } while (!iil_StartsWith($line, 'r ', true)); |
| | | return (iil_ParseResult($line) == 0); |
| | | } |
| | | return false; |
| | |
| | | if (iil_PutLine($fp, 'd DELETE "' . iil_Escape($folder). '"')) { |
| | | do { |
| | | $line=iil_ReadLine($fp, 300); |
| | | } while ($line[0] != 'd'); |
| | | } while (!iil_StartsWith($line, 'd ', true)); |
| | | return (iil_ParseResult($line) == 0); |
| | | } |
| | | return false; |
| | |
| | | |
| | | function iil_C_Append(&$conn, $folder, &$message) { |
| | | if (!$folder) { |
| | | return false; |
| | | return false; |
| | | } |
| | | $fp = $conn->fp; |
| | | |
| | | $message = str_replace("\r", '', $message); |
| | | $message = str_replace("\n", "\r\n", $message); |
| | | $message = str_replace("\n", "\r\n", $message); |
| | | |
| | | $len = strlen($message); |
| | | if (!$len) { |
| | | return false; |
| | | return false; |
| | | } |
| | | |
| | | $request = 'A APPEND "' . iil_Escape($folder) .'" (\\Seen) {' . $len . '}'; |
| | | |
| | | $request = 'a APPEND "' . iil_Escape($folder) .'" (\\Seen) {' . $len . '}'; |
| | | |
| | | if (iil_PutLine($fp, $request)) { |
| | | $line=iil_ReadLine($fp, 100); |
| | | $sent = fwrite($fp, $message."\r\n"); |
| | | $line = iil_ReadLine($fp, 512); |
| | | |
| | | if ($line[0] != '+') { |
| | | // $errornum = iil_ParseResult($line); |
| | | $conn->error .= "Cannot write to folder: $line\n"; |
| | | return false; |
| | | } |
| | | |
| | | iil_PutLine($fp, $message); |
| | | |
| | | do { |
| | | $line=iil_ReadLine($fp, 1000); |
| | | } while ($line[0] != 'A'); |
| | | $line = iil_ReadLine($fp); |
| | | } while (!iil_StartsWith($line, 'a ', true)); |
| | | |
| | | $result = (iil_ParseResult($line) == 0); |
| | | if (!$result) { |
| | | $conn->error .= $line . "\n"; |
| | | } |
| | | } |
| | | return $result; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | //open message file |
| | | $in_fp = false; |
| | | $in_fp = false; |
| | | if (file_exists(realpath($path))) { |
| | | $in_fp = fopen($path, 'r'); |
| | | } |
| | |
| | | } |
| | | |
| | | //send APPEND command |
| | | $request = 'A APPEND "' . iil_Escape($folder) . '" (\\Seen) {' . $len . '}'; |
| | | $bytes_sent = 0; |
| | | $request = 'a APPEND "' . iil_Escape($folder) . '" (\\Seen) {' . $len . '}'; |
| | | if (iil_PutLine($fp, $request)) { |
| | | $line = iil_ReadLine($fp, 100); |
| | | |
| | | $line = iil_ReadLine($fp, 512); |
| | | |
| | | if ($line[0] != '+') { |
| | | //$errornum = iil_ParseResult($line); |
| | | $conn->error .= "Cannot write to folder: $line\n"; |
| | | return false; |
| | | } |
| | | |
| | | //send file |
| | | while (!feof($in_fp)) { |
| | | $buffer = fgets($in_fp, 4096); |
| | | $bytes_sent += strlen($buffer); |
| | | iil_PutLine($fp, $buffer, false); |
| | | } |
| | | fclose($in_fp); |
| | | |
| | | iil_PutLine($fp, ''); |
| | | iil_PutLine($fp, ''); // \r\n |
| | | |
| | | //read response |
| | | do { |
| | | $line = iil_ReadLine($fp, 1000); |
| | | } while ($line[0] != 'A'); |
| | | |
| | | $line = iil_ReadLine($fp); |
| | | } while (!iil_StartsWith($line, 'a ', true)); |
| | | |
| | | $result = (iil_ParseResult($line) == 0); |
| | | if (!$result) { |
| | | $conn->error .= $line . "\n"; |
| | | } |
| | | |
| | | |
| | | return $result; |
| | | } |
| | | |
| | |
| | | if (iil_PutLine($fp, $key . ($is_uid ? ' UID' : '') ." FETCH $id (BODYSTRUCTURE)")) { |
| | | do { |
| | | $line = iil_ReadLine($fp, 5000); |
| | | $line = iil_MultLine($fp, $line); |
| | | $line = iil_MultLine($fp, $line, true); |
| | | if (!preg_match("/^$key/", $line)) |
| | | $result .= $line; |
| | | } while (!preg_match("/^$key/", $line)); |
| | | } while (!iil_StartsWith($line, $key, true)); |
| | | |
| | | $result = trim(substr($result, strpos($result, 'BODYSTRUCTURE')+13, -1)); |
| | | } |