summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Machniak <alec@alec.pl>2012-10-11 10:00:44 +0200
committerAleksander Machniak <alec@alec.pl>2012-10-11 10:00:44 +0200
commit00891e687b97b6eac7317970aeb0d49826d05d42 (patch)
treee58a7cac927d121b8b0df5d6f1b6b52e927cf29d
parent485f23b85970e8b3fb559e28a763915f41d4e0d6 (diff)
Support flags and date arguments in APPEND command
-rw-r--r--program/include/rcube_imap.php6
-rw-r--r--program/include/rcube_imap_generic.php47
2 files changed, 43 insertions, 10 deletions
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index ebf31d578..8a1c65bbe 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -2232,13 +2232,15 @@ class rcube_imap extends rcube_storage
return false;
}
+ $flags = array('SEEN');
+
// make sure folder exists
if ($this->folder_exists($folder)) {
if ($is_file) {
- $saved = $this->conn->appendFromFile($folder, $message, $headers);
+ $saved = $this->conn->appendFromFile($folder, $message, $headers, $flags);
}
else {
- $saved = $this->conn->append($folder, $message);
+ $saved = $this->conn->append($folder, $message, $flags);
}
}
diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php
index cce53aedc..ba640d359 100644
--- a/program/include/rcube_imap_generic.php
+++ b/program/include/rcube_imap_generic.php
@@ -2540,10 +2540,12 @@ class rcube_imap_generic
*
* @param string $mailbox Mailbox name
* @param string $message Message content
+ * @param array $flags Message flags
+ * @param string $date Message internal date
*
* @return string|bool On success APPENDUID response (if available) or True, False on failure
*/
- function append($mailbox, &$message)
+ function append($mailbox, &$message, $flags = array(), $date = null)
{
unset($this->data['APPENDUID']);
@@ -2559,12 +2561,17 @@ class rcube_imap_generic
return false;
}
+ // build APPEND command
$key = $this->nextTag();
- $request = sprintf("$key APPEND %s (\\Seen) {%d%s}", $this->escape($mailbox),
- $len, ($this->prefs['literal+'] ? '+' : ''));
+ $request = "$key APPEND " . $this->escape($mailbox) . ' (' . $this->flagsToStr($flags) . ')';
+ if (!empty($date)) {
+ $request .= ' ' . $this->escape($date);
+ }
+ $request .= ' {' . $len . ($this->prefs['literal+'] ? '+' : '') . '}';
+ // send APPEND command
if ($this->putLine($request)) {
- // Don't wait when LITERAL+ is supported
+ // Do not wait when LITERAL+ is supported
if (!$this->prefs['literal+']) {
$line = $this->readReply();
@@ -2605,10 +2612,12 @@ class rcube_imap_generic
* @param string $mailbox Mailbox name
* @param string $path Path to the file with message body
* @param string $headers Message headers
+ * @param array $flags Message flags
+ * @param string $date Message internal date
*
* @return string|bool On success APPENDUID response (if available) or True, False on failure
*/
- function appendFromFile($mailbox, $path, $headers=null)
+ function appendFromFile($mailbox, $path, $headers=null, $flags = array(), $date = null)
{
unset($this->data['APPENDUID']);
@@ -2639,11 +2648,15 @@ class rcube_imap_generic
$len += strlen($headers) + strlen($body_separator);
}
- // send APPEND command
+ // build APPEND command
$key = $this->nextTag();
- $request = sprintf("$key APPEND %s (\\Seen) {%d%s}", $this->escape($mailbox),
- $len, ($this->prefs['literal+'] ? '+' : ''));
+ $request = "$key APPEND " . $this->escape($mailbox) . ' (' . $this->flagsToStr($flags) . ')';
+ if (!empty($date)) {
+ $request .= ' ' . $this->escape($date);
+ }
+ $request .= ' {' . $len . ($this->prefs['literal+'] ? '+' : '') . '}';
+ // send APPEND command
if ($this->putLine($request)) {
// Don't wait when LITERAL+ is supported
if (!$this->prefs['literal+']) {
@@ -3546,6 +3559,24 @@ class rcube_imap_generic
}
/**
+ * Converts flags array into string for inclusion in IMAP command
+ *
+ * @param array $flags Flags (see self::flags)
+ *
+ * @return string Space-separated list of flags
+ */
+ private function flagsToStr($flags)
+ {
+ foreach ((array)$flags as $idx => $flag) {
+ if ($flag = $this->flags[strtoupper($flag)]) {
+ $flags[$idx] = $flag;
+ }
+ }
+
+ return implode(' ', (array)$flags);
+ }
+
+ /**
* Converts datetime string into unix timestamp
*
* @param string $date Date string