Better support for Courier IMAP

release-0.6
thomascube 19 years ago
parent 49afbf5d69
commit 520c36aa4c

@ -386,8 +386,13 @@ function show_message($message, $type='notice')
function console($msg, $type=1) function console($msg, $type=1)
{ {
print $msg; if ($GLOBALS['REMOTE_REQUEST'])
print "\n<hr>\n"; print "// $msg\n";
else
{
print $msg;
print "\n<hr>\n";
}
} }

@ -28,6 +28,7 @@ require_once('lib/mime.inc');
class rcube_imap class rcube_imap
{ {
var $conn; var $conn;
var $root_ns = '';
var $root_dir = ''; var $root_dir = '';
var $mailbox = 'INBOX'; var $mailbox = 'INBOX';
var $list_page = 1; var $list_page = 1;
@ -54,24 +55,6 @@ class rcube_imap
} }
function iloha_imap($connection='')
{
if ($connection)
{
$a_url = parse_url($connection);
$scheme = $a_url['scheme'] ? $a_url['scheme'] : 'imap';
$port = $a_url['port'] ? $a_url['port'] : ($scheme=='imaps' ? 993 : 143);
$host = $a_url['host'];
$user = $a_url['user'];
$pass = $a_url['pass'];
//var_dump($a_url);
$this->connect($host, $user, $pass, $port);
}
}
function connect($host, $user, $pass, $port=143, $use_ssl=FALSE) function connect($host, $user, $pass, $port=143, $use_ssl=FALSE)
{ {
global $ICL_PORT, $CONFIG; global $ICL_PORT, $CONFIG;
@ -79,16 +62,27 @@ class rcube_imap
// check for Open-SSL support in PHP build // check for Open-SSL support in PHP build
if ($use_ssl && in_array('openssl', get_loaded_extensions())) if ($use_ssl && in_array('openssl', get_loaded_extensions()))
$ICL_SSL = TRUE; $ICL_SSL = TRUE;
else if ($use_ssl)
{
raise_error(array('code' => 403,
'type' => 'imap',
'message' => 'Open SSL not available;'), TRUE, FALSE);
$port = 143;
}
$ICL_PORT = $port; $ICL_PORT = $port;
$this->conn = iil_Connect($host, $user, $pass, array('imap' => 'check')); $this->conn = iil_Connect($host, $user, $pass, array('imap' => 'check'));
$this->host = $host; $this->host = $host;
$this->user = $user; $this->user = $user;
$this->pass = $pass; $this->pass = $pass;
$this->port = $port;
$this->ssl = $use_ssl;
// print trace mesages
if ($this->conn && ($CONFIG['debug_level'] & 8)) if ($this->conn && ($CONFIG['debug_level'] & 8))
print $this->conn->message; console($this->conn->message);
// write error log
else if (!$this->conn && $GLOBALS['iil_error']) else if (!$this->conn && $GLOBALS['iil_error'])
{ {
raise_error(array('code' => 403, raise_error(array('code' => 403,
@ -96,6 +90,17 @@ class rcube_imap
'message' => $GLOBALS['iil_error']), TRUE, FALSE); 'message' => $GLOBALS['iil_error']), TRUE, FALSE);
} }
// get account namespace
if ($this->conn)
{
iil_C_NameSpace($this->conn);
if (!empty($this->conn->delimiter))
$this->delimiter = $this->conn->delimiter;
if (!empty($this->conn->rootdir))
$this->root_ns = $this->conn->rootdir;
}
return $this->conn ? TRUE : FALSE; return $this->conn ? TRUE : FALSE;
} }
@ -107,12 +112,22 @@ class rcube_imap
} }
function reconnect()
{
$this->close();
$this->connect($this->host, $this->user, $this->pass, $this->port, $this->ssl);
}
function set_rootdir($root) function set_rootdir($root)
{ {
if (substr($root, -1, 1)==='/') if (ereg('[\.\/]$', $root)) //(substr($root, -1, 1)==='/')
$root = substr($root, 0, -1); $root = substr($root, 0, -1);
$this->root_dir = $root; $this->root_dir = $root;
if (empty($this->delimiter))
$this->get_hierarchy_delimiter();
} }
@ -368,10 +383,10 @@ class rcube_imap
// return cached header // return cached header
if ($a_msg_headers[$uid]) if ($a_msg_headers[$uid])
return $a_msg_headers[$uid]; return $a_msg_headers[$uid];
$msg_id = $this->_uid2id($uid); $msg_id = $this->_uid2id($uid);
$header = iil_C_FetchHeader($this->conn, $mailbox, $msg_id); $header = iil_C_FetchHeader($this->conn, $mailbox, $msg_id);
// write headers cache // write headers cache
$a_msg_headers[$uid] = $header; $a_msg_headers[$uid] = $header;
$this->update_cache($mailbox.'.msg', $a_msg_headers); $this->update_cache($mailbox.'.msg', $a_msg_headers);
@ -427,11 +442,13 @@ class rcube_imap
else else
$result = iil_C_Flag($this->conn, $this->mailbox, join(',', $msg_ids), $flag); $result = iil_C_Flag($this->conn, $this->mailbox, join(',', $msg_ids), $flag);
// reload message headers if cached // reload message headers if cached
$cache_key = $this->mailbox.'.msg'; $cache_key = $this->mailbox.'.msg';
if ($result && ($a_cached_headers = $this->get_cache($cache_key))) if ($this->caching_enabled && $result && ($a_cached_headers = $this->get_cache($cache_key)))
{ {
// close and re-open connection
$this->reconnect();
foreach ($uids as $uid) foreach ($uids as $uid)
{ {
if (isset($a_cached_headers[$uid])) if (isset($a_cached_headers[$uid]))
@ -492,12 +509,12 @@ class rcube_imap
// exit if no message uids are specified // exit if no message uids are specified
if (!is_array($a_uids)) if (!is_array($a_uids))
return false; return false;
// convert uids to message ids // convert uids to message ids
$a_mids = array(); $a_mids = array();
foreach ($a_uids as $uid) foreach ($a_uids as $uid)
$a_mids[] = $this->_uid2id($uid, $from_mbox); $a_mids[] = $this->_uid2id($uid, $from_mbox);
$moved = iil_C_Move($this->conn, join(',', $a_mids), $from_mbox, $to_mbox); $moved = iil_C_Move($this->conn, join(',', $a_mids), $from_mbox, $to_mbox);
// send expunge command in order to have the moved message // send expunge command in order to have the moved message
@ -646,15 +663,18 @@ class rcube_imap
$result = FALSE; $result = FALSE;
$abs_name = $this->_mod_mailbox($name); $abs_name = $this->_mod_mailbox($name);
$a_mailbox_cache = $this->get_cache('mailboxes'); $a_mailbox_cache = $this->get_cache('mailboxes');
if (strlen($this->root_ns))
$abs_name = $this->root_ns.$abs_name;
if (strlen($abs_name) && (!is_array($a_mailbox_cache) || !in_array($abs_name, $a_mailbox_cache))) if (strlen($abs_name) && (!is_array($a_mailbox_cache) || !in_array($abs_name, $a_mailbox_cache)))
$result = iil_C_CreateFolder($this->conn, $abs_name); $result = iil_C_CreateFolder($this->conn, iil_utf7_encode($abs_name));
// update mailboxlist cache // update mailboxlist cache
if ($result && $subscribe) if ($result && $subscribe)
$this->subscribe($name); $this->subscribe($this->root_ns.$name);
return $result; return $result ? $this->root_ns.$name : FALSE;
} }
@ -911,9 +931,9 @@ class rcube_imap
function _mod_mailbox($mbox, $mode='in') function _mod_mailbox($mbox, $mode='in')
{ {
if ($this->root_dir && $mode=='in') if (!empty($this->root_dir) && $mode=='in')
$mbox = $this->root_dir.'/'.$mbox; $mbox = $this->root_dir.$this->delimiter.$mbox;
else if ($this->root_dir && $mode=='out') else if (strlen($this->root_dir) && $mode=='out')
$mbox = substr($mbox, strlen($this->root_dir)+1); $mbox = substr($mbox, strlen($this->root_dir)+1);
return $mbox; return $mbox;

@ -1,4 +1,4 @@
<? <?php
/* /*
+-----------------------------------------------------------------------+ +-----------------------------------------------------------------------+

@ -325,9 +325,9 @@ function iil_Connect($host, $user, $password){
} }
//open socket connection //open socket connection
$conn->fp = @fsockopen($host, $ICL_PORT); $conn->fp = @fsockopen($host, $ICL_PORT, &$errno, &$errstr, 10);
if (!$conn->fp){ if (!$conn->fp){
$iil_error = "Could not connect to $host at port $ICL_PORT"; $iil_error = "Could not connect to $host at port $ICL_PORT: $errstr";
$iil_errornum = -1; $iil_errornum = -1;
return false; return false;
} }
@ -1440,7 +1440,7 @@ function iil_C_ModFlag(&$conn, $mailbox, $messages, $flag, $mod){
$line=chop(iil_ReadLine($fp, 100)); $line=chop(iil_ReadLine($fp, 100));
if ($line[0]=="*") $c++; if ($line[0]=="*") $c++;
}while (!iil_StartsWith($line, "flg")); }while (!iil_StartsWith($line, "flg"));
if (iil_ParseResult($line) == 0){ if (iil_ParseResult($line) == 0){
iil_C_ExpireCachedItems($conn, $mailbox, $messages); iil_C_ExpireCachedItems($conn, $mailbox, $messages);
return $c; return $c;

@ -403,7 +403,12 @@ function rcmail_compose_subject($attrib)
// create a reply-subject // create a reply-subject
else if (isset($REPLY_MESSAGE['subject'])) else if (isset($REPLY_MESSAGE['subject']))
$subject = 'Re: '.$REPLY_MESSAGE['subject']; {
if (strpos($REPLY_MESSAGE['subject'], 'Re:')===0)
$subject = $REPLY_MESSAGE['subject'];
else
$subject = 'Re: '.$REPLY_MESSAGE['subject'];
}
// create a forward-subject // create a forward-subject
else if (isset($FORWARD_MESSAGE['subject'])) else if (isset($FORWARD_MESSAGE['subject']))

@ -216,10 +216,20 @@ if ($CONFIG['sent_mbox'])
// check if mailbox exists // check if mailbox exists
if (!in_array_nocase($CONFIG['sent_mbox'], $IMAP->list_mailboxes())) if (!in_array_nocase($CONFIG['sent_mbox'], $IMAP->list_mailboxes()))
$IMAP->create_mailbox($CONFIG['sent_mbox'], TRUE); $mbox = $IMAP->create_mailbox($CONFIG['sent_mbox'], TRUE);
else
$mbox = TRUE;
// append message to sent box // append message to sent box
$saved = $IMAP->save_message($CONFIG['sent_mbox'], $header_str."\r\n".$msg_body); if ($mbox)
$saved = $IMAP->save_message($CONFIG['sent_mbox'], $header_str."\r\n".$msg_body);
// raise error if saving failed
if (!$saved)
raise_error(array('code' => 800,
'type' => 'imap',
'file' => __FILE__,
'message' => "Could not save message in $CONFIG[sent_mbox]"), TRUE, FALSE);
} }

@ -51,7 +51,7 @@ else if ($_action=='create-folder')
if ($create && $_GET['_remote']) if ($create && $_GET['_remote'])
{ {
$commands = sprintf("this.add_folder_row('%s')", rep_specialchars_output($_GET['_name'], 'js')); $commands = sprintf("this.add_folder_row('%s')", rep_specialchars_output($create, 'js'));
rcube_remote_response($commands); rcube_remote_response($commands);
} }
else if (!$create && $_GET['_remote']) else if (!$create && $_GET['_remote'])

Loading…
Cancel
Save