Move & copy messages between different accounts
parent
009cfccb2c
commit
7130cec4d1
3
NEWS
3
NEWS
|
@ -1,4 +1,4 @@
|
|||
2.1.2 (2013-11-XX)
|
||||
2.1.2 (2014-01-XX)
|
||||
------------------
|
||||
|
||||
New features
|
||||
|
@ -7,6 +7,7 @@ New features
|
|||
- select multiple files to attach to a message or drag'n'drop files onto the
|
||||
mail editor; will also now display progress of uploads
|
||||
- new popup menu to download all attachments of a mail
|
||||
- move & copy messages between different accounts
|
||||
|
||||
Enhancements
|
||||
- we now automatically convert <img src=data...> into file attachments
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2009-2013 Inverse inc.
|
||||
Copyright (C) 2009-2014 Inverse inc.
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
|
||||
This file is part of SOGo.
|
||||
|
@ -614,20 +614,19 @@ static NSString *defaultUserID = @"anyone";
|
|||
if (max > 1)
|
||||
{
|
||||
currentAccountName = [[self mailAccountFolder] nameInContainer];
|
||||
if ([[folders objectAtIndex: 1] isEqualToString: currentAccountName])
|
||||
client = [[self imap4Connection] client];
|
||||
[imap4 selectFolder: [self imap4URL]];
|
||||
|
||||
for (count = 2; count < max; count++)
|
||||
{
|
||||
for (count = 2; count < max; count++)
|
||||
{
|
||||
currentFolderName
|
||||
= [[folders objectAtIndex: count] substringFromIndex: 6];
|
||||
[imapDestinationFolder appendFormat: @"/%@", currentFolderName];
|
||||
}
|
||||
currentFolderName = [[folders objectAtIndex: count] substringFromIndex: 6];
|
||||
[imapDestinationFolder appendFormat: @"/%@", currentFolderName];
|
||||
}
|
||||
|
||||
client = [[self imap4Connection] client];
|
||||
if (client)
|
||||
if (client)
|
||||
{
|
||||
if ([[folders objectAtIndex: 1] isEqualToString: currentAccountName])
|
||||
{
|
||||
[imap4 selectFolder: [self imap4URL]];
|
||||
|
||||
// We make sure the destination IMAP folder exist, if not, we create it.
|
||||
result = [[client status: imapDestinationFolder
|
||||
flags: [NSArray arrayWithObject: @"UIDVALIDITY"]]
|
||||
|
@ -647,13 +646,69 @@ static NSString *defaultUserID = @"anyone";
|
|||
objectForKey: @"description"]];
|
||||
}
|
||||
else
|
||||
result = [NSException exceptionWithName: @"SOGoMailException"
|
||||
reason: @"IMAP connection is invalid"
|
||||
userInfo: nil];
|
||||
{
|
||||
// Destination folder is in a different account
|
||||
SOGoMailAccounts *accounts;
|
||||
SOGoMailAccount *account;
|
||||
accounts = [[self container] container];
|
||||
account = [accounts lookupName: [folders objectAtIndex: 1] inContext: localContext acquire: NO];
|
||||
if ([account isKindOfClass: [NSException class]])
|
||||
{
|
||||
result = [NSException exceptionWithHTTPStatus: 500
|
||||
reason: @"Cannot copy messages to other account."];
|
||||
}
|
||||
else
|
||||
{
|
||||
NSEnumerator *messages;
|
||||
NSDictionary *message;
|
||||
NSData *content;
|
||||
NSArray *flags;
|
||||
|
||||
// Fetch messages
|
||||
result = [client fetchUids: uids parts: [NSArray arrayWithObjects: @"RFC822", @"FLAGS", nil]];
|
||||
if ([[result objectForKey: @"result"] boolValue])
|
||||
{
|
||||
result = [result valueForKey: @"fetch"];
|
||||
if ([result isKindOfClass: [NSArray class]] && [result count] > 0)
|
||||
{
|
||||
// Copy each message to the other account
|
||||
client = [[account imap4Connection] client];
|
||||
[[account imap4Connection] selectFolder: imapDestinationFolder];
|
||||
messages = [result objectEnumerator];
|
||||
result = nil;
|
||||
while (result == nil && (message = [messages nextObject]))
|
||||
{
|
||||
if ((content = [message valueForKey: @"message"]) != nil)
|
||||
{
|
||||
flags = [message valueForKey: @"flags"];
|
||||
result = [client append: content toFolder: imapDestinationFolder withFlags: flags];
|
||||
if ([[result objectForKey: @"result"] boolValue])
|
||||
result = nil;
|
||||
else
|
||||
[self logWithFormat: @"ERROR: Can't append message: %@", result];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
[self logWithFormat: @"ERROR: unexpected IMAP4 result (missing 'fetch'): %@", result];
|
||||
result = [NSException exceptionWithHTTPStatus: 500
|
||||
reason: @"Unexpected IMAP4 result"];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
[self logWithFormat: @"ERROR: Can't fetch messages: %@", result];
|
||||
result = [NSException exceptionWithHTTPStatus: 500
|
||||
reason: @"Can't fetch messages"];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
result = [NSException exceptionWithHTTPStatus: 500
|
||||
reason: @"Cannot copy messages across different accounts."];
|
||||
result = [NSException exceptionWithName: @"SOGoMailException"
|
||||
reason: @"IMAP connection is invalid"
|
||||
userInfo: nil];
|
||||
}
|
||||
else
|
||||
result = [NSException exceptionWithHTTPStatus: 500
|
||||
|
|
|
@ -118,6 +118,22 @@
|
|||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="menu" id="moveMailboxMenu">
|
||||
<ul>
|
||||
<var:foreach list="clientObject.mailAccounts" item="currentLabel">
|
||||
<li><img rsrc:src="tbtv_account_17x17.png"/> <var:string value="currentLabel.name"/></li>
|
||||
</var:foreach>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="menu" id="copyMailboxMenu">
|
||||
<ul>
|
||||
<var:foreach list="clientObject.mailAccounts" item="currentLabel">
|
||||
<li><img rsrc:src="tbtv_account_17x17.png"/> <var:string value="currentLabel.name"/></li>
|
||||
</var:foreach>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="menu" id="messageListMenu">
|
||||
<ul>
|
||||
<li><var:string label:value="Open Message In New Window"/></li>
|
||||
|
|
|
@ -2055,7 +2055,7 @@ function initMailboxTree() {
|
|||
node.parentNode.removeChild(node);
|
||||
mailboxTree = new dTree("mailboxTree");
|
||||
mailboxTree.config.hideRoot = true;
|
||||
mailboxTree.icon.root = ResourcesURL + "/tbtv_account_17x17.gif";
|
||||
mailboxTree.icon.root = ResourcesURL + "/tbtv_account_17x17.png";
|
||||
mailboxTree.icon.folder = ResourcesURL + "/tbtv_leaf_corner_17x17.png";
|
||||
mailboxTree.icon.folderOpen = ResourcesURL + "/tbtv_leaf_corner_17x17.png";
|
||||
mailboxTree.icon.node = ResourcesURL + "/tbtv_leaf_corner_17x17.png";
|
||||
|
@ -2257,12 +2257,15 @@ function generateMenuForMailbox(mailbox, prefix, callback) {
|
|||
function updateMailboxMenus() {
|
||||
var mailboxActions = { move: onMailboxMenuMove,
|
||||
copy: onMailboxMenuCopy };
|
||||
var accountsMenus = { move: $$('#moveMailboxMenu li'),
|
||||
copy: $$('#copyMailboxMenu li') };
|
||||
|
||||
for (var key in mailboxActions) {
|
||||
for (var i = 0; i < mailAccounts.length; i++) {
|
||||
var mailbox = accounts[i];
|
||||
generateMenuForMailbox(mailbox, key + "-" + i,
|
||||
mailboxActions[key]);
|
||||
var id = generateMenuForMailbox(mailbox, key + "-" + i,
|
||||
mailboxActions[key]);
|
||||
accountsMenus[key][i].submenu = id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2828,6 +2831,8 @@ function getMenus() {
|
|||
"-", null,
|
||||
onMenuSharing ],
|
||||
addressMenu: [ newContactFromEmail, newEmailTo ],
|
||||
moveMailboxMenu: mailAccounts.collect(function (account) { return account.asCSSIdentifier() }),
|
||||
copyMailboxMenu: mailAccounts.collect(function (account) { return account.asCSSIdentifier() }),
|
||||
messageListMenu: [ onMenuOpenMessage, "-",
|
||||
onMenuReplyToSender,
|
||||
onMenuReplyToAll,
|
||||
|
@ -2877,14 +2882,6 @@ function getMenus() {
|
|||
markMenu.prepareVisibility = onMarkMenuPrepareVisibility;
|
||||
}
|
||||
|
||||
var listMenus = [ "messageListMenu", "messagesListMenu", "messageContentMenu" ];
|
||||
for (var i = 0; i < listMenus.length; i++) {
|
||||
var menu = $(listMenus[i]);
|
||||
if (menu) {
|
||||
menu.prepareVisibility = onMessageListMenuPrepareVisibility;
|
||||
}
|
||||
}
|
||||
|
||||
var accountIconMenu = $("accountIconMenu");
|
||||
if (accountIconMenu) {
|
||||
accountIconMenu.prepareVisibility = onAccountIconMenuPrepareVisibility;
|
||||
|
@ -3018,20 +3015,14 @@ function stopDragging(event, ui) {
|
|||
|
||||
function dropAction(event, ui) {
|
||||
var destination = $(this).up("div.dTreeNode");
|
||||
|
||||
var sourceAct = Mailer.currentMailbox.split("/")[1];
|
||||
var destAct = destination.getAttribute("dataname").split("/")[1];
|
||||
if (sourceAct == destAct) {
|
||||
var f;
|
||||
if (ui.helper.hasClass("copy")) {
|
||||
// Message(s) copied
|
||||
f = onMailboxMenuCopy.bind(destination);
|
||||
}
|
||||
else {
|
||||
// Message(s) moved
|
||||
f = onMailboxMenuMove.bind(destination);
|
||||
}
|
||||
|
||||
f();
|
||||
var f;
|
||||
if (ui.helper.hasClass("copy")) {
|
||||
// Message(s) copied
|
||||
f = onMailboxMenuCopy.bind(destination);
|
||||
}
|
||||
else {
|
||||
// Message(s) moved
|
||||
f = onMailboxMenuMove.bind(destination);
|
||||
}
|
||||
f();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue