@ -6,7 +6,7 @@
* Plugin that adds a new button to the mailbox toolbar
* to move messages to a (user selectable) archive folder.
*
* @version 2.2
* @version 2.3
* @license GNU GPLv3+
* @author Andre Rodier, Thomas Bruederli, Aleksander Machniak
*/
@ -111,8 +111,7 @@ class archive extends rcube_plugin
$delimiter = $storage->get_hierarchy_delimiter();
$archive_folder = $rcmail->config->get('archive_mbox');
$archive_type = $rcmail->config->get('archive_type', '');
$storage->set_folder(($current_mbox = rcube_utils::get_input_value('_mbox', RCUBE_INPUT_POST)));
$current_mbox = rcube_utils::get_input_value('_mbox', RCUBE_INPUT_POST);
$result = array('reload' => false, 'update' => false, 'errors' => array());
$folders = array();
@ -121,84 +120,88 @@ class archive extends rcube_plugin
if ($uids == '*') {
$index = $storage->index(null, rcmail_sort_column(), rcmail_sort_order());
$uids = $index->get( );
$messageset = array($current_mbox => $index->get() );
}
else {
$uids = explode(',', $uids );
$messageset = rcmail::get_uids( );
}
foreach ($uids as $uid) {
if (!$archive_folder || !($message = $rcmail->storage->get_message($uid))) {
continue;
}
$subfolder = null;
switch ($archive_type) {
case 'year':
$subfolder = $rcmail->format_date($message->timestamp, 'Y');
break;
foreach ($messageset as $mbox => $uids) {
$storage->set_folder(($current_mbox = $mbox));
case 'month':
$subfolder = $rcmail->format_date($message->timestamp, 'Y') . $delimiter . $rcmail->format_date($message->timestamp, 'm');
break;
foreach ($uids as $uid) {
if (!$archive_folder || !($message = $rcmail->storage->get_message($uid))) {
continue;
}
case 'folder':
$subfolder = $current_mbox;
break;
$subfolder = null;
switch ($archive_type) {
case 'year':
$subfolder = $rcmail->format_date($message->timestamp, 'Y');
break;
case 'sender':
$from = $message->get('from');
if (preg_match('/[\b< ](.+@.+)[\b>]/i', $from, $m)) {
$subfolder = $m[1];
}
else {
$subfolder = $this->gettext('unkownsender');
}
case 'month':
$subfolder = $rcmail->format_date($message->timestamp, 'Y') . $delimiter . $rcmail->format_date($message->timestamp, 'm');
break;
// replace reserved characters in folder name
$repl = $delimiter == '-' ? '_' : '-';
$replacements[$delimiter] = $repl;
$replacements['.'] = $repl; // some IMAP server do not allow . characters
$subfolder = strtr($subfolder, $replacements);
break;
case 'folder':
$subfolder = $current_mbox;
break;
default:
$subfolder = '';
break;
}
case 'sender':
$from = $message->get('from');
if (preg_match('/[\b< ](.+@.+)[\b>]/i', $from, $m)) {
$subfolder = $m[1];
}
else {
$subfolder = $this->gettext('unkownsender');
}
// compose full folder path
$folder = $archive_folder . ($subfolder ? $delimiter . $subfolder : '');
// replace reserved characters in folder name
$repl = $delimiter == '-' ? '_' : '-';
$replacements[$delimiter] = $repl;
$replacements['.'] = $repl; // some IMAP server do not allow . characters
$subfolder = strtr($subfolder, $replacements);
break;
// create archive subfolder if it doesn't yet exist
// we'll create all folders in the path
if (!in_array($folder, $folders)) {
if (empty($list)) {
$list = $storage->list_folders('', $archive_folder . '*', 'mail', null, true);
default:
$subfolder = '';
break;
}
$path = explode($delimiter, $folder);
for ($i=0; $i< count ( $ path ) ; $ i + + ) {
$_folder = implode($delimiter, array_slice($path, 0, $i+1));
if (!in_array($_folder, $list)) {
if ($storage->create_folder($_folder, true)) {
$result['reload'] = true;
$list[] = $_folder;
// compose full folder path
$folder = $archive_folder . ($subfolder ? $delimiter . $subfolder : '');
// create archive subfolder if it doesn't yet exist
// we'll create all folders in the path
if (!in_array($folder, $folders)) {
if (empty($list)) {
$list = $storage->list_folders('', $archive_folder . '*', 'mail', null, true);
}
$path = explode($delimiter, $folder);
for ($i=0; $i< count ( $ path ) ; $ i + + ) {
$_folder = implode($delimiter, array_slice($path, 0, $i+1));
if (!in_array($_folder, $list)) {
if ($storage->create_folder($_folder, true)) {
$result['reload'] = true;
$list[] = $_folder;
}
}
}
}
$folders[] = $folder;
}
$folders[] = $folder;
}
// move message to target folder
if ($storage->move_message(array($uid), $folder)) {
$result['update'] = true;
}
else {
$result['errors'][] = $uid;
}
} // end for
// move message to target folder
if ($storage->move_message(array($uid), $folder)) {
$result['update'] = true;
}
else {
$result['errors'][] = $uid;
}
} // end for
}
// send response
if ($result['errors']) {