Moving messages to trash TB 45.1.0

Talk about add-ons and extension development.
Post Reply
RaymondNL
Posts: 3
Joined: May 29th, 2016, 2:18 pm

Moving messages to trash TB 45.1.0

Post by RaymondNL »

Hello all,

I'm trying to write an extension for thunderbird, the version i use is 45.1.0.

The extension needs to do the following: I select x messages from the threadpane, those are streamed. After some checks i add the message headers of messages that can be deleted to an array. After finishing some tasks on those messages i want these messages to be moved into the trash folder.

I use this code:

Code: Select all

function procesmessages() {
	// build the hdrarray
	var hdrarray = [];
	for (var x = 0; x < gFolderDisplay.selectedCount; x++ ) {
		var MessageURI = gFolderDisplay.selectedMessageUris[x];
		// Stream email and do some checks. If msg can be moved to trash:
		if (move == true) hdrarray.push(gFolderDisplay.selectedMessages[x]);
	}
	// perform some tasks and move to trash:
	var srcfolder = gFolderDisplay.displayedFolder;
	var destfolder = "imap://username%40gmail.com@imap.gmail.com/%5BGmail%5D/Prullenbak";

	var messages = Cc["@mozilla.org/array;1"].createInstance(Components.interfaces.nsIMutableArray);
	for each (var msgHdr in fixIterator(hdrarray, Components.interfaces.nsIMsgDBHdr)) {
		messages.appendElement(msgHdr, false);
	}

	var copyService = Components.classes["@mozilla.org/messenger/messagecopyservice;1"]  
				.getService(Components.interfaces.nsIMsgCopyService); 
	copyService.CopyMessages(srcfolder, messages, destfolder, true, false, msgWindow, false);
}
I get this error on copyService.CopyMessages in the console:

Code: Select all

NS_ERROR_XPC_BAD_CONVERT_JS: Could not convert JavaScript argument arg 2 [nsIMsgCopyService.CopyMessages]
I also tried to convert the headers array this way but it tells me hdrarray.queryElementAt is not a function:

Code: Select all

for (var index = 0; index < hdrarray.length; index++){
	var srcfolder = gFolderDisplay.displayedFolder;
	var destfolder = "imap://username%40gmail.com@imap.gmail.com/%5BGmail%5D/Prullenbak";
	var hdr = hdrarray.queryElementAt(index, Components.interfaces.nsIMsgDBHdr);
	var messages = Components.classes["@mozilla.org/array;1"]
				.createInstance(Components.interfaces.nsIMutableArray);
	messages.appendElement(hdr, false);
	copyService.CopyMessages(srcfolder, messages, destfolder, true, true, msgWindow, false);
}
How do i delete the messages from hdrarray the correct way????

Thanx in advance,

Greets Raymond.
morat
Posts: 6404
Joined: February 3rd, 2009, 6:29 pm

Re: Moving messages to trash TB 45.1.0

Post by morat »

Try something like:

Code: Select all

var folder = GetFirstSelectedMsgFolder();
var msgHdrs = gFolderDisplay.selectedMessages;
var mutableArray = Components.classes["@mozilla.org/array;1"].
  createInstance(Components.interfaces.nsIMutableArray);
for (var i = 0; i < msgHdrs.length; i++) {
  var msgHdr = msgHdrs[i];
  // var msgHdr = msgHdrs.queryElementAt(i, Components.interfaces.nsIMsgDBHdr);
  mutableArray.appendElement(msgHdr, false /*weak*/);
}
var cs = Components.classes["@mozilla.org/messenger/messagecopyservice;1"].
  getService(Components.interfaces.nsIMsgCopyService);
var trashFolder = folder.rootFolder.
  getFolderWithFlags(Components.interfaces.nsMsgFolderFlags.Trash);
cs.CopyMessages(folder, mutableArray, trashFolder,
  true /*isMove*/, null /*listener*/, msgWindow, true /*allowUndo*/);
Noitidart
Posts: 1168
Joined: September 16th, 2007, 8:01 am

Re: Moving messages to trash TB 45.1.0

Post by Noitidart »

Is trash folder specific to thunderbird, or the operating system trash folder? Just curious
morat
Posts: 6404
Joined: February 3rd, 2009, 6:29 pm

Re: Moving messages to trash TB 45.1.0

Post by morat »

@Noitidart

The trash folder is specific to Thunderbird.

The trash folder is called "Trash" for English users.
The trash folder is called "Prullenbak" for Dutch users.

imap://username%40gmail.com@imap.gmail.com/[Gmail]/Trash
imap://username%40gmail.com@imap.gmail.com/[Gmail]/Prullenbak

Code: Select all

// show the selected folder uri
alert(GetFirstSelectedMsgFolder().URI);

Code: Select all

// show the trash folder uri for the selected account
alert(GetFirstSelectedMsgFolder().rootFolder.
  getFolderWithFlags(Components.interfaces.nsMsgFolderFlags.Trash).URI);
Last edited by morat on May 31st, 2016, 10:37 pm, edited 3 times in total.
RaymondNL
Posts: 3
Joined: May 29th, 2016, 2:18 pm

Re: Moving messages to trash TB 45.1.0

Post by RaymondNL »

@morat:

Thanx this sollution works!!! Thought i tried something like that...

@Noitidart:
My trash folder is : var destfolder = "imap://username%40gmail.com@imap.gmail.com/%5BGmail%5D/Prullenbak";
Prullenbak is Dutch for trash/recyclebin. It is on the imap.
morat
Posts: 6404
Joined: February 3rd, 2009, 6:29 pm

Re: Moving messages to trash TB 45.1.0

Post by morat »

@RaymondNL

I believe the queryElementAt() method only works with nsIArray, not with an array of nsIMsgDBHdr objects.

Code: Select all

alert(msgHdrs); // [xpconnect wrapped nsIArray]
for (var i = 0; i < msgHdrs.length; i++) {
  var msgHdr = msgHdrs.queryElementAt(i, Components.interfaces.nsIMsgDBHdr);
}
http://developer.mozilla.org/en-US/docs ... e/nsIArray

Also,

My trash folder uri has "[Gmail]", not "%5BGmail%5D".
Noitidart
Posts: 1168
Joined: September 16th, 2007, 8:01 am

Re: Moving messages to trash TB 45.1.0

Post by Noitidart »

Ooo I see thanks morat and op!
Post Reply