|
|
|
@ -60,6 +60,8 @@
|
|
|
|
|
- fixed iil_MultLine(): use iil_ReadBytes() instead of iil_ReadLine()
|
|
|
|
|
- fixed iil_C_FetchStructureString() to handle many literal strings in response
|
|
|
|
|
- removed hardcoded data size in iil_ReadLine()
|
|
|
|
|
- added iil_PutLine() wrapper for fputs()
|
|
|
|
|
- code cleanup and identation fixes
|
|
|
|
|
|
|
|
|
|
********************************************************/
|
|
|
|
|
|
|
|
|
@ -159,7 +161,6 @@ class iilThreadHeader
|
|
|
|
|
var $mid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_xor($string, $string2) {
|
|
|
|
|
$result = '';
|
|
|
|
|
$size = strlen($string);
|
|
|
|
@ -169,8 +170,14 @@ function iil_xor($string, $string2) {
|
|
|
|
|
return $result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function iil_PutLine($fp, $string, $endln=true) {
|
|
|
|
|
// console('C: '. $string);
|
|
|
|
|
return fputs($fp, $string . ($endln ? "\r\n" : ''));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function iil_ReadLine($fp, $size) {
|
|
|
|
|
$line = '';
|
|
|
|
|
|
|
|
|
|
if (!$fp) {
|
|
|
|
|
return $line;
|
|
|
|
|
}
|
|
|
|
@ -184,8 +191,10 @@ function iil_ReadLine($fp, $size) {
|
|
|
|
|
if ($buffer === false) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
// console('S: '. chop($buffer));
|
|
|
|
|
$line .= $buffer;
|
|
|
|
|
} while ($buffer[strlen($buffer)-1] != "\n");
|
|
|
|
|
|
|
|
|
|
return $line;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -201,6 +210,7 @@ function iil_MultLine($fp, $line) {
|
|
|
|
|
$out .= $line;
|
|
|
|
|
}
|
|
|
|
|
$line = $a[1][0] . "\"$out\"";
|
|
|
|
|
// console('[...] '. $out);
|
|
|
|
|
}
|
|
|
|
|
return $line;
|
|
|
|
|
}
|
|
|
|
@ -215,6 +225,7 @@ function iil_ReadBytes($fp, $bytes) {
|
|
|
|
|
}
|
|
|
|
|
$len = strlen($data);
|
|
|
|
|
} while ($len < $bytes);
|
|
|
|
|
|
|
|
|
|
return $data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -263,7 +274,6 @@ function iil_StartsWithI($string, $match) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_Escape($string)
|
|
|
|
|
{
|
|
|
|
|
return strtr($string, array('"'=>'\\"', '\\' => '\\\\'));
|
|
|
|
@ -279,6 +289,7 @@ function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) {
|
|
|
|
|
$ipad .= chr(0x36);
|
|
|
|
|
$opad .= chr(0x5C);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// pad $pass so it's 64 bytes
|
|
|
|
|
$padLen = 64 - strlen($pass);
|
|
|
|
|
for ($i=0;$i<$padLen;$i++) {
|
|
|
|
@ -294,7 +305,7 @@ function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) {
|
|
|
|
|
$reply = base64_encode('"' . $user . '" "' . $hash . '"');
|
|
|
|
|
|
|
|
|
|
// send result, get reply
|
|
|
|
|
fputs($conn->fp, $reply . "\r\n");
|
|
|
|
|
iil_PutLine($conn->fp, $reply);
|
|
|
|
|
$line = iil_ReadLine($conn->fp, 1024);
|
|
|
|
|
|
|
|
|
|
// process result
|
|
|
|
@ -311,7 +322,7 @@ function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) {
|
|
|
|
|
|
|
|
|
|
function iil_C_Login(&$conn, $user, $password) {
|
|
|
|
|
|
|
|
|
|
fputs($conn->fp, 'a001 LOGIN "'.iil_Escape($user).'" "'.iil_Escape($password)."\"\r\n");
|
|
|
|
|
iil_PutLine($conn->fp, 'a001 LOGIN "'.iil_Escape($user).'" "'.iil_Escape($password).'"');
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
$line = iil_ReadReply($conn->fp);
|
|
|
|
@ -382,7 +393,7 @@ function iil_C_NameSpace(&$conn) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fputs($conn->fp, "ns1 NAMESPACE\r\n");
|
|
|
|
|
iil_PutLine($conn->fp, "ns1 NAMESPACE");
|
|
|
|
|
do {
|
|
|
|
|
$line = iil_ReadLine($conn->fp, 1024);
|
|
|
|
|
if (iil_StartsWith($line, '* NAMESPACE')) {
|
|
|
|
@ -410,7 +421,6 @@ function iil_C_NameSpace(&$conn) {
|
|
|
|
|
$my_prefs["rootdir"] = substr($conn->rootdir, 0, -1);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function iil_Connect($host, $user, $password) {
|
|
|
|
@ -497,9 +507,9 @@ function iil_Connect($host, $user, $password) {
|
|
|
|
|
// if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) {
|
|
|
|
|
// $conn->capability = explode(' ', $matches[1]);
|
|
|
|
|
// } else {
|
|
|
|
|
fputs($conn->fp, "cp01 CAPABILITY\r\n");
|
|
|
|
|
iil_PutLine($conn->fp, "cp01 CAPABILITY");
|
|
|
|
|
do {
|
|
|
|
|
$line = trim(iil_ReadLine($conn->fp, 100));
|
|
|
|
|
$line = trim(iil_ReadLine($conn->fp, 1024));
|
|
|
|
|
|
|
|
|
|
$conn->message .= "$line\n";
|
|
|
|
|
|
|
|
|
@ -532,7 +542,7 @@ function iil_Connect($host, $user, $password) {
|
|
|
|
|
$conn->message .= "Trying CRAM-MD5\n";
|
|
|
|
|
|
|
|
|
|
//do CRAM-MD5 authentication
|
|
|
|
|
fputs($conn->fp, "a000 AUTHENTICATE CRAM-MD5\r\n");
|
|
|
|
|
iil_PutLine($conn->fp, "a000 AUTHENTICATE CRAM-MD5");
|
|
|
|
|
$line = trim(iil_ReadLine($conn->fp, 1024));
|
|
|
|
|
|
|
|
|
|
$conn->message .= "$line\n";
|
|
|
|
@ -546,7 +556,6 @@ function iil_Connect($host, $user, $password) {
|
|
|
|
|
$conn->message .= "Tried CRAM-MD5: $result \n";
|
|
|
|
|
} else {
|
|
|
|
|
$conn->message .='No challenge ('.htmlspecialchars($line)."), try plain\n";
|
|
|
|
|
|
|
|
|
|
$auth = 'plain';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -571,7 +580,7 @@ function iil_Connect($host, $user, $password) {
|
|
|
|
|
|
|
|
|
|
function iil_Close(&$conn) {
|
|
|
|
|
iil_C_WriteCache($conn);
|
|
|
|
|
if (fputs($conn->fp, "I LOGOUT\r\n")) {
|
|
|
|
|
if (iil_PutLine($conn->fp, "I LOGOUT")) {
|
|
|
|
|
fgets($conn->fp, 1024);
|
|
|
|
|
fclose($conn->fp);
|
|
|
|
|
$conn->fp = false;
|
|
|
|
@ -581,7 +590,6 @@ function iil_Close(&$conn) {
|
|
|
|
|
function iil_ClearCache($user, $host) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_C_WriteCache(&$conn) {
|
|
|
|
|
//echo "<!-- doing iil_C_WriteCache //-->\n";
|
|
|
|
|
if (!$conn->do_cache) return false;
|
|
|
|
@ -684,7 +692,7 @@ function iil_CheckForRecent($host, $user, $password, $mailbox) {
|
|
|
|
|
$conn = iil_Connect($host, $user, $password, 'plain');
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
if ($fp) {
|
|
|
|
|
fputs($fp, "a002 EXAMINE \"".iil_Escape($mailbox)."\"\r\n");
|
|
|
|
|
iil_PutLine($fp, "a002 EXAMINE \"".iil_Escape($mailbox)."\"");
|
|
|
|
|
do {
|
|
|
|
|
$line=chop(iil_ReadLine($fp, 300));
|
|
|
|
|
$a=explode(' ', $line);
|
|
|
|
@ -693,7 +701,7 @@ function iil_CheckForRecent($host, $user, $password, $mailbox) {
|
|
|
|
|
}
|
|
|
|
|
} while (!iil_StartsWith($a[0], 'a002'));
|
|
|
|
|
|
|
|
|
|
fputs($fp, "a003 LOGOUT\r\n");
|
|
|
|
|
iil_PutLine($fp, "a003 LOGOUT");
|
|
|
|
|
fclose($fp);
|
|
|
|
|
} else {
|
|
|
|
|
$result = -2;
|
|
|
|
@ -703,7 +711,6 @@ function iil_CheckForRecent($host, $user, $password, $mailbox) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function iil_C_Select(&$conn, $mailbox) {
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
|
|
|
|
|
if (empty($mailbox)) {
|
|
|
|
|
return false;
|
|
|
|
@ -714,9 +721,9 @@ function iil_C_Select(&$conn, $mailbox) {
|
|
|
|
|
|
|
|
|
|
iil_C_LoadCache($conn, $mailbox);
|
|
|
|
|
|
|
|
|
|
if (fputs($fp, "sel1 SELECT \"".iil_Escape($mailbox)."\"\r\n")) {
|
|
|
|
|
if (iil_PutLine($conn->fp, "sel1 SELECT \"".iil_Escape($mailbox).'"')) {
|
|
|
|
|
do {
|
|
|
|
|
$line=chop(iil_ReadLine($fp, 300));
|
|
|
|
|
$line = chop(iil_ReadLine($conn->fp, 300));
|
|
|
|
|
$a = explode(' ', $line);
|
|
|
|
|
if (count($a) == 3) {
|
|
|
|
|
if (strcasecmp($a[2], 'EXISTS') == 0) {
|
|
|
|
@ -754,6 +761,7 @@ function iil_C_CountMessages(&$conn, $mailbox, $refresh = false) {
|
|
|
|
|
if ($refresh) {
|
|
|
|
|
$conn->selected= '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
iil_C_Select($conn, $mailbox);
|
|
|
|
|
if ($conn->selected == $mailbox) {
|
|
|
|
|
return $conn->exists;
|
|
|
|
@ -823,6 +831,7 @@ function iil_C_Sort(&$conn, $mailbox, $field, $add='', $is_uid=FALSE,
|
|
|
|
|
if ($field == 'INTERNALDATE') {
|
|
|
|
|
$field = 'ARRIVAL';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$fields = array('ARRIVAL' => 1,'CC' => 1,'DATE' => 1,
|
|
|
|
|
'FROM' => 1, 'SIZE' => 1, 'SUBJECT' => 1, 'TO' => 1);
|
|
|
|
|
|
|
|
|
@ -838,10 +847,10 @@ function iil_C_Sort(&$conn, $mailbox, $field, $add='', $is_uid=FALSE,
|
|
|
|
|
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
$command = 's ' . $is_uid . 'SORT (' . $field . ') ';
|
|
|
|
|
$command .= $encoding . ' ALL' . "$add\r\n";
|
|
|
|
|
$command .= $encoding . ' ALL' . $add;
|
|
|
|
|
$line = $data = '';
|
|
|
|
|
|
|
|
|
|
if (!fputs($fp, $command)) {
|
|
|
|
|
if (!iil_PutLine($fp, $command)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
do {
|
|
|
|
@ -906,8 +915,8 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
|
|
|
|
|
/* FETCH date,from,subject headers */
|
|
|
|
|
if ($mode == 1) {
|
|
|
|
|
$key = 'fhi' . ($c++);
|
|
|
|
|
$request = $key . " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)])\r\n";
|
|
|
|
|
if (!fputs($fp, $request)) {
|
|
|
|
|
$request = $key . " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)])";
|
|
|
|
|
if (!iil_PutLine($fp, $request)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
do {
|
|
|
|
@ -976,8 +985,8 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
|
|
|
|
|
}else if ($mode == 6) {
|
|
|
|
|
|
|
|
|
|
$key = 'fhi' . ($c++);
|
|
|
|
|
$request = $key . " FETCH $message_set (INTERNALDATE)\r\n";
|
|
|
|
|
if (!fputs($fp, $request)) {
|
|
|
|
|
$request = $key . " FETCH $message_set (INTERNALDATE)";
|
|
|
|
|
if (!iil_PutLine($fp, $request)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
do {
|
|
|
|
@ -1014,9 +1023,9 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
|
|
|
|
|
|
|
|
|
|
/* FETCH uid, size, flags */
|
|
|
|
|
$key = 'fhi' .($c++);
|
|
|
|
|
$request = $key . " FETCH $message_set ($field_name)\r\n";
|
|
|
|
|
$request = $key . " FETCH $message_set ($field_name)";
|
|
|
|
|
|
|
|
|
|
if (!fputs($fp, $request)) {
|
|
|
|
|
if (!iil_PutLine($fp, $request)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
do {
|
|
|
|
@ -1098,6 +1107,7 @@ function iil_CompressMessageSet($message_set) {
|
|
|
|
|
}
|
|
|
|
|
$prev = $id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//handle the last sequence/id
|
|
|
|
|
if ($start==$prev) {
|
|
|
|
|
$result[] = $prev;
|
|
|
|
@ -1234,9 +1244,9 @@ function iil_C_FetchThreadHeaders(&$conn, $mailbox, $message_set) {
|
|
|
|
|
$key = 'fh';
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
$request = $key . " FETCH $message_set ";
|
|
|
|
|
$request .= "(BODY.PEEK[HEADER.FIELDS (SUBJECT MESSAGE-ID IN-REPLY-TO)])\r\n";
|
|
|
|
|
$request .= "(BODY.PEEK[HEADER.FIELDS (SUBJECT MESSAGE-ID IN-REPLY-TO)])";
|
|
|
|
|
$mid_to_id = array();
|
|
|
|
|
if (!fputs($fp, $request)) {
|
|
|
|
|
if (!iil_PutLine($fp, $request)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
do {
|
|
|
|
@ -1417,7 +1427,6 @@ function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
|
|
|
|
|
echo $new['MESSAGE-ID'] . "\t" . $sbj . "\n";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//now that we've gone through all the messages,
|
|
|
|
@ -1440,11 +1449,10 @@ function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
|
|
|
|
|
if ($debug) {
|
|
|
|
|
print_r($roots);
|
|
|
|
|
}
|
|
|
|
|
//print_r($result);
|
|
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_SortThreads(&$tree, $index, $sort_order = 'ASC') {
|
|
|
|
|
if (!is_array($tree) || !is_array($index)) {
|
|
|
|
|
return false;
|
|
|
|
@ -1485,7 +1493,6 @@ function iil_SortThreads(&$tree, $index, $sort_order = 'ASC') {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//sort by key, this basically sorts all threads
|
|
|
|
|
ksort($itree);
|
|
|
|
|
$i = 0;
|
|
|
|
@ -1495,7 +1502,6 @@ function iil_SortThreads(&$tree, $index, $sort_order = 'ASC') {
|
|
|
|
|
$i++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//return
|
|
|
|
|
return $out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1563,9 +1569,9 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false)
|
|
|
|
|
$request .= " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ";
|
|
|
|
|
$request .= "(DATE FROM TO SUBJECT REPLY-TO IN-REPLY-TO CC BCC ";
|
|
|
|
|
$request .= "CONTENT-TRANSFER-ENCODING CONTENT-TYPE MESSAGE-ID ";
|
|
|
|
|
$request .= "REFERENCES DISPOSITION-NOTIFICATION-TO X-PRIORITY)])\r\n";
|
|
|
|
|
$request .= "REFERENCES DISPOSITION-NOTIFICATION-TO X-PRIORITY)])";
|
|
|
|
|
|
|
|
|
|
if (!fputs($fp, $request)) {
|
|
|
|
|
if (!iil_PutLine($fp, $request)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
do {
|
|
|
|
@ -1696,9 +1702,9 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false)
|
|
|
|
|
*/
|
|
|
|
|
$command_key = 'fh' . ($c++);
|
|
|
|
|
$request = $command_key . $prefix;
|
|
|
|
|
$request .= " FETCH $message_set (UID RFC822.SIZE FLAGS INTERNALDATE)\r\n";
|
|
|
|
|
$request .= " FETCH $message_set (UID RFC822.SIZE FLAGS INTERNALDATE)";
|
|
|
|
|
|
|
|
|
|
if (!fputs($fp, $request)) {
|
|
|
|
|
if (!iil_PutLine($fp, $request)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
do {
|
|
|
|
@ -1812,7 +1818,6 @@ function iil_C_FetchHeader(&$conn, $mailbox, $id, $uidfetch=false) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_SortHeaders($a, $field, $flag) {
|
|
|
|
|
if (empty($field)) {
|
|
|
|
|
$field = 'uid';
|
|
|
|
@ -1877,12 +1882,12 @@ function iil_SortHeaders($a, $field, $flag) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function iil_C_Expunge(&$conn, $mailbox) {
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
|
|
|
|
|
if (iil_C_Select($conn, $mailbox)) {
|
|
|
|
|
$c = 0;
|
|
|
|
|
fputs($fp, "exp1 EXPUNGE\r\n");
|
|
|
|
|
iil_PutLine($conn->fp, "exp1 EXPUNGE");
|
|
|
|
|
do {
|
|
|
|
|
$line=chop(iil_ReadLine($fp, 100));
|
|
|
|
|
$line=chop(iil_ReadLine($conn->fp, 100));
|
|
|
|
|
if ($line[0] == '*') {
|
|
|
|
|
$c++;
|
|
|
|
|
}
|
|
|
|
@ -1919,7 +1924,7 @@ function iil_C_ModFlag(&$conn, $mailbox, $messages, $flag, $mod) {
|
|
|
|
|
|
|
|
|
|
if (iil_C_Select($conn, $mailbox)) {
|
|
|
|
|
$c = 0;
|
|
|
|
|
fputs($fp, "flg STORE $messages " . $mod . "FLAGS (" . $flag . ")\r\n");
|
|
|
|
|
iil_PutLine($fp, "flg STORE $messages " . $mod . "FLAGS (" . $flag . ")");
|
|
|
|
|
do {
|
|
|
|
|
$line=chop(iil_ReadLine($fp, 100));
|
|
|
|
|
if ($line[0] == '*') {
|
|
|
|
@ -1958,7 +1963,6 @@ 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;
|
|
|
|
|
|
|
|
|
@ -1969,7 +1973,7 @@ function iil_C_Copy(&$conn, $messages, $from, $to) {
|
|
|
|
|
if (iil_C_Select($conn, $from)) {
|
|
|
|
|
$c=0;
|
|
|
|
|
|
|
|
|
|
fputs($fp, "cpy1 COPY $messages \"".iil_Escape($to)."\"\r\n");
|
|
|
|
|
iil_PutLine($fp, "cpy1 COPY $messages \"".iil_Escape($to)."\"");
|
|
|
|
|
$line=iil_ReadReply($fp);
|
|
|
|
|
return iil_ParseResult($line);
|
|
|
|
|
} else {
|
|
|
|
@ -2017,7 +2021,7 @@ function iil_C_ID2UID(&$conn, $folder, $id) {
|
|
|
|
|
$result = -1;
|
|
|
|
|
if (iil_C_Select($conn, $folder)) {
|
|
|
|
|
$key = 'FUID';
|
|
|
|
|
if (fputs($fp, "$key FETCH $id (UID)\r\n")) {
|
|
|
|
|
if (iil_PutLine($fp, "$key FETCH $id (UID)")) {
|
|
|
|
|
do {
|
|
|
|
|
$line=chop(iil_ReadLine($fp, 1024));
|
|
|
|
|
if (eregi("^\* $id FETCH \(UID (.*)\)", $line, $r)) {
|
|
|
|
@ -2034,8 +2038,8 @@ function iil_C_Search(&$conn, $folder, $criteria) {
|
|
|
|
|
if (iil_C_Select($conn, $folder)) {
|
|
|
|
|
$c = 0;
|
|
|
|
|
|
|
|
|
|
$query = 'srch1 SEARCH ' . chop($criteria) . "\r\n";
|
|
|
|
|
fputs($fp, $query);
|
|
|
|
|
$query = 'srch1 SEARCH ' . chop($criteria);
|
|
|
|
|
iil_PutLine($fp, $query);
|
|
|
|
|
do {
|
|
|
|
|
$line=trim(iil_ReadLine($fp, 10000));
|
|
|
|
|
if (eregi("^\* SEARCH", $line)) {
|
|
|
|
@ -2050,7 +2054,6 @@ function iil_C_Search(&$conn, $folder, $criteria) {
|
|
|
|
|
}
|
|
|
|
|
$conn->error = 'iil_C_Search: ' . $line . "\n";
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
$conn->error = "iil_C_Search: Couldn't select \"$folder\"\n";
|
|
|
|
|
return false;
|
|
|
|
@ -2088,7 +2091,7 @@ function iil_C_GetHierarchyDelimiter(&$conn) {
|
|
|
|
|
$delimiter = false;
|
|
|
|
|
|
|
|
|
|
//try (LIST "" ""), should return delimiter (RFC2060 Sec 6.3.8)
|
|
|
|
|
if (!fputs($fp, 'ghd LIST "" ""' . "\r\n")) {
|
|
|
|
|
if (!iil_PutLine($fp, 'ghd LIST "" ""')) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2109,7 +2112,7 @@ function iil_C_GetHierarchyDelimiter(&$conn) {
|
|
|
|
|
|
|
|
|
|
//if that fails, try namespace extension
|
|
|
|
|
//try to fetch namespace data
|
|
|
|
|
fputs($conn->fp, "ns1 NAMESPACE\r\n");
|
|
|
|
|
iil_PutLine($conn->fp, "ns1 NAMESPACE");
|
|
|
|
|
do {
|
|
|
|
|
$line = iil_ReadLine($conn->fp, 1024);
|
|
|
|
|
if (iil_StartsWith($line, '* NAMESPACE')) {
|
|
|
|
@ -2156,7 +2159,7 @@ function iil_C_ListMailboxes(&$conn, $ref, $mailbox) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// send command
|
|
|
|
|
if (!fputs($fp, "lmb LIST \"".$ref."\" \"".iil_Escape($mailbox)."\"\r\n")) {
|
|
|
|
|
if (!iil_PutLine($fp, "lmb LIST \"".$ref."\" \"".iil_Escape($mailbox)."\"")) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2204,7 +2207,6 @@ function iil_C_ListMailboxes(&$conn, $ref, $mailbox) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
|
|
|
|
|
global $IGNORE_FOLDERS;
|
|
|
|
|
|
|
|
|
@ -2220,7 +2222,7 @@ function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
|
|
|
|
|
$folders = array();
|
|
|
|
|
|
|
|
|
|
// send command
|
|
|
|
|
if (!fputs($fp, 'lsb LSUB "' . $ref . '" "' . iil_Escape($mailbox).'"' . "\r\n")) {
|
|
|
|
|
if (!iil_PutLine($fp, 'lsb LSUB "' . $ref . '" "' . iil_Escape($mailbox).'"')) {
|
|
|
|
|
$conn->error = "Couldn't send LSUB command\n";
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
@ -2273,29 +2275,26 @@ function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_C_Subscribe(&$conn, $folder) {
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
|
|
|
|
|
$query = 'sub1 SUBSCRIBE "' . iil_Escape($folder). '"' . "\r\n";
|
|
|
|
|
fputs($fp, $query);
|
|
|
|
|
$query = 'sub1 SUBSCRIBE "' . iil_Escape($folder). '"';
|
|
|
|
|
iil_PutLine($fp, $query);
|
|
|
|
|
|
|
|
|
|
$line = trim(iil_ReadLine($fp, 10000));
|
|
|
|
|
return iil_ParseResult($line);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_C_UnSubscribe(&$conn, $folder) {
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
|
|
|
|
|
$query = 'usub1 UNSUBSCRIBE "' . iil_Escape($folder) . '"' . "\r\n";
|
|
|
|
|
fputs($fp, $query);
|
|
|
|
|
$query = 'usub1 UNSUBSCRIBE "' . iil_Escape($folder) . '"';
|
|
|
|
|
iil_PutLine($fp, $query);
|
|
|
|
|
|
|
|
|
|
$line = trim(iil_ReadLine($fp, 10000));
|
|
|
|
|
return iil_ParseResult($line);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $part) {
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
$result = false;
|
|
|
|
@ -2307,8 +2306,8 @@ function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $part) {
|
|
|
|
|
|
|
|
|
|
if (iil_C_Select($conn, $mailbox)) {
|
|
|
|
|
$key = 'fh' . ($c++);
|
|
|
|
|
$request = $key . " FETCH $id (BODY.PEEK[$part])\r\n";
|
|
|
|
|
if (!fputs($fp, $request)) return false;
|
|
|
|
|
$request = $key . " FETCH $id (BODY.PEEK[$part])";
|
|
|
|
|
if (!iil_PutLine($fp, $request)) return false;
|
|
|
|
|
do {
|
|
|
|
|
$line = chop(iil_ReadLine($fp, 200));
|
|
|
|
|
$a = explode(' ', $line);
|
|
|
|
@ -2326,13 +2325,13 @@ function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $part) {
|
|
|
|
|
return $result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
|
|
|
|
|
/* modes:
|
|
|
|
|
1: return string
|
|
|
|
|
2: print
|
|
|
|
|
3: base64 and print
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
$result = false;
|
|
|
|
|
if (($part == 0) || empty($part)) {
|
|
|
|
@ -2344,9 +2343,9 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
|
|
|
|
|
|
|
|
|
|
// format request
|
|
|
|
|
$key = 'ftch' . ($c++) . ' ';
|
|
|
|
|
$request = $key . "FETCH $id (BODY.PEEK[$part])\r\n";
|
|
|
|
|
$request = $key . "FETCH $id (BODY.PEEK[$part])";
|
|
|
|
|
// send request
|
|
|
|
|
if (!fputs($fp, $request)) {
|
|
|
|
|
if (!iil_PutLine($fp, $request)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2356,6 +2355,7 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
|
|
|
|
|
$a = explode(' ', $line);
|
|
|
|
|
} while ($a[2] != 'FETCH');
|
|
|
|
|
$len = strlen($line);
|
|
|
|
|
|
|
|
|
|
if ($line[$len-1] == ')') {
|
|
|
|
|
// one line response, get everything between first and last quotes
|
|
|
|
|
if (substr($line, -4, 3) == 'NIL') {
|
|
|
|
@ -2381,6 +2381,7 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
|
|
|
|
|
$sizeStr = substr($line, $from, $len);
|
|
|
|
|
$bytes = (int)$sizeStr;
|
|
|
|
|
$received = 0;
|
|
|
|
|
|
|
|
|
|
while ($received < $bytes) {
|
|
|
|
|
$remaining = $bytes - $received;
|
|
|
|
|
$line = iil_ReadLine($fp, 1024);
|
|
|
|
@ -2408,6 +2409,7 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
|
|
|
|
|
$result = rtrim($result, "\t\r\n\0\x0B");
|
|
|
|
|
return $result; // substr($result, 0, strlen($result)-1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
echo 'Select failed.';
|
|
|
|
@ -2433,7 +2435,7 @@ function iil_C_PrintBase64Body(&$conn, $mailbox, $id, $part) {
|
|
|
|
|
|
|
|
|
|
function iil_C_CreateFolder(&$conn, $folder) {
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
if (fputs($fp, 'c CREATE "' . iil_Escape($folder) . '"' . "\r\n")) {
|
|
|
|
|
if (iil_PutLine($fp, 'c CREATE "' . iil_Escape($folder) . '"')) {
|
|
|
|
|
do {
|
|
|
|
|
$line=iil_ReadLine($fp, 300);
|
|
|
|
|
} while ($line[0] != 'c');
|
|
|
|
@ -2445,7 +2447,7 @@ function iil_C_CreateFolder(&$conn, $folder) {
|
|
|
|
|
|
|
|
|
|
function iil_C_RenameFolder(&$conn, $from, $to) {
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
if (fputs($fp, 'r RENAME "' . iil_Escape($from) . '" "' . iil_Escape($to) . '"' . "\r\n")) {
|
|
|
|
|
if (iil_PutLine($fp, 'r RENAME "' . iil_Escape($from) . '" "' . iil_Escape($to) . '"')) {
|
|
|
|
|
do {
|
|
|
|
|
$line = iil_ReadLine($fp, 300);
|
|
|
|
|
} while ($line[0] != 'r');
|
|
|
|
@ -2456,7 +2458,7 @@ function iil_C_RenameFolder(&$conn, $from, $to) {
|
|
|
|
|
|
|
|
|
|
function iil_C_DeleteFolder(&$conn, $folder) {
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
if (fputs($fp, 'd DELETE "' . iil_Escape($folder). '"' . "\r\n")) {
|
|
|
|
|
if (iil_PutLine($fp, 'd DELETE "' . iil_Escape($folder). '"')) {
|
|
|
|
|
do {
|
|
|
|
|
$line=iil_ReadLine($fp, 300);
|
|
|
|
|
} while ($line[0] != 'd');
|
|
|
|
@ -2479,9 +2481,10 @@ function iil_C_Append(&$conn, $folder, &$message) {
|
|
|
|
|
if (!$len) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
$request = 'A APPEND "' . iil_Escape($folder) .'" (\\Seen) {' . $len . "}\r\n";
|
|
|
|
|
|
|
|
|
|
if (fputs($fp, $request)) {
|
|
|
|
|
$request = 'A APPEND "' . iil_Escape($folder) .'" (\\Seen) {' . $len . '}';
|
|
|
|
|
|
|
|
|
|
if (iil_PutLine($fp, $request)) {
|
|
|
|
|
$line=iil_ReadLine($fp, 100);
|
|
|
|
|
$sent = fwrite($fp, $message."\r\n");
|
|
|
|
|
do {
|
|
|
|
@ -2493,13 +2496,12 @@ function iil_C_Append(&$conn, $folder, &$message) {
|
|
|
|
|
$conn->error .= $line . "\n";
|
|
|
|
|
}
|
|
|
|
|
return $result;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$conn->error .= "Couldn't send command \"$request\"\n";
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_C_AppendFromFile(&$conn, $folder, $path) {
|
|
|
|
|
if (!$folder) {
|
|
|
|
|
return false;
|
|
|
|
@ -2522,20 +2524,20 @@ function iil_C_AppendFromFile(&$conn, $folder, $path) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//send APPEND command
|
|
|
|
|
$request = 'A APPEND "' . iil_Escape($folder) . '" (\\Seen) {' . $len . "}\r\n";
|
|
|
|
|
$request = 'A APPEND "' . iil_Escape($folder) . '" (\\Seen) {' . $len . '}';
|
|
|
|
|
$bytes_sent = 0;
|
|
|
|
|
if (fputs($fp, $request)) {
|
|
|
|
|
if (iil_PutLine($fp, $request)) {
|
|
|
|
|
$line = iil_ReadLine($fp, 100);
|
|
|
|
|
|
|
|
|
|
//send file
|
|
|
|
|
while (!feof($in_fp)) {
|
|
|
|
|
$buffer = fgets($in_fp, 4096);
|
|
|
|
|
$bytes_sent += strlen($buffer);
|
|
|
|
|
fputs($fp, $buffer);
|
|
|
|
|
iil_PutLine($fp, $buffer, false);
|
|
|
|
|
}
|
|
|
|
|
fclose($in_fp);
|
|
|
|
|
|
|
|
|
|
fputs($fp, "\r\n");
|
|
|
|
|
iil_PutLine($fp, '');
|
|
|
|
|
|
|
|
|
|
//read response
|
|
|
|
|
do {
|
|
|
|
@ -2546,14 +2548,14 @@ function iil_C_AppendFromFile(&$conn, $folder, $path) {
|
|
|
|
|
if (!$result) {
|
|
|
|
|
$conn->error .= $line . "\n";
|
|
|
|
|
}
|
|
|
|
|
return $result;
|
|
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$conn->error .= "Couldn't send command \"$request\"\n";
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_C_FetchStructureString(&$conn, $folder, $id) {
|
|
|
|
|
$fp = $conn->fp;
|
|
|
|
|
$result = false;
|
|
|
|
@ -2561,14 +2563,15 @@ function iil_C_FetchStructureString(&$conn, $folder, $id) {
|
|
|
|
|
if (iil_C_Select($conn, $folder)) {
|
|
|
|
|
$key = 'F1247';
|
|
|
|
|
|
|
|
|
|
if (fputs($fp, "$key FETCH $id (BODYSTRUCTURE)\r\n")) {
|
|
|
|
|
if (iil_PutLine($fp, "$key FETCH $id (BODYSTRUCTURE)")) {
|
|
|
|
|
do {
|
|
|
|
|
$line = iil_ReadLine($fp, 5000);
|
|
|
|
|
$line = iil_MultLine($fp, $line);
|
|
|
|
|
$result .= $line;
|
|
|
|
|
} while (!preg_match("/^$key/", $line));
|
|
|
|
|
|
|
|
|
|
$result = trim(substr($result, strpos($result, 'BODYSTRUCTURE')+13, -(strlen($result)-strrpos($result, $key)-2)));
|
|
|
|
|
$result = trim(substr($result, strpos($result, 'BODYSTRUCTURE')+13,
|
|
|
|
|
-(strlen($result)-strrpos($result, $key)-2)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $result;
|
|
|
|
@ -2593,7 +2596,7 @@ function iil_C_GetQuota(&$conn) {
|
|
|
|
|
$quota_line = '';
|
|
|
|
|
|
|
|
|
|
//get line containing quota info
|
|
|
|
|
if (fputs($fp, 'QUOT1 GETQUOTAROOT "INBOX"' . "\r\n")) {
|
|
|
|
|
if (iil_PutLine($fp, 'QUOT1 GETQUOTAROOT "INBOX"')) {
|
|
|
|
|
do {
|
|
|
|
|
$line=chop(iil_ReadLine($fp, 5000));
|
|
|
|
|
if (iil_StartsWith($line, '* QUOTA ')) {
|
|
|
|
@ -2621,7 +2624,6 @@ function iil_C_GetQuota(&$conn) {
|
|
|
|
|
return $result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function iil_C_ClearFolder(&$conn, $folder) {
|
|
|
|
|
$num_in_trash = iil_C_CountMessages($conn, $folder);
|
|
|
|
|
if ($num_in_trash > 0) {
|
|
|
|
|