?? mailcommands.js
字號:
{preselectedURI:preselectedURI, okCallback:SubscribeOKCallback});}function SubscribeOKCallback(changeTable){ for (var serverURI in changeTable) { var folder = GetMsgFolderFromUri(serverURI, true); var server = folder.server; var subscribableServer = server.QueryInterface(Components.interfaces.nsISubscribableServer); for (var name in changeTable[serverURI]) { if (changeTable[serverURI][name] == true) { try { subscribableServer.subscribe(name); } catch (ex) { dump("failed to subscribe to " + name + ": " + ex + "\n"); } } else if (changeTable[serverURI][name] == false) { try { subscribableServer.unsubscribe(name); } catch (ex) { dump("failed to unsubscribe to " + name + ": " + ex + "\n"); } } else { // no change } } try { subscribableServer.commitSubscribeChanges(); } catch (ex) { dump("failed to commit the changes: " + ex + "\n"); } }}function SaveAsFile(uri){ if (uri) { var filename = null; try { var subject = messenger.messageServiceFromURI(uri) .messageURIToMsgHdr(uri).mime2DecodedSubject; filename = GenerateValidFilename(subject, ".eml"); } catch (ex) {} messenger.saveAs(uri, true, null, filename); }}function SaveAsTemplate(uri, folder){ if (uri) { var identity = getIdentityForServer(folder.server); messenger.saveAs(uri, false, identity, null); }}function MarkSelectedMessagesRead(markRead){ ClearPendingReadTimer(); gDBView.doCommand(markRead ? nsMsgViewCommandType.markMessagesRead : nsMsgViewCommandType.markMessagesUnread);}function MarkSelectedMessagesFlagged(markFlagged){ gDBView.doCommand(markFlagged ? nsMsgViewCommandType.flagMessages : nsMsgViewCommandType.unflagMessages);}function MarkAllMessagesRead(compositeDataSource, folder){ var folderResource = folder.QueryInterface(Components.interfaces.nsIRDFResource); var folderArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray); folderArray.AppendElement(folderResource); DoRDFCommand(compositeDataSource, "http://home.netscape.com/NC-rdf#MarkAllMessagesRead", folderArray, null);}function DownloadFlaggedMessages(compositeDataSource, folder){ dump("fix DownloadFlaggedMessages()\n");}function DownloadSelectedMessages(compositeDataSource, messages, markFlagged){ dump("fix DownloadSelectedMessages()\n");}function ViewPageSource(messages){ var numMessages = messages.length; if (numMessages == 0) { dump("MsgViewPageSource(): No messages selected.\n"); return false; } try { // First, get the mail session const mailSessionContractID = "@mozilla.org/messenger/services/session;1"; const nsIMsgMailSession = Components.interfaces.nsIMsgMailSession; var mailSession = Components.classes[mailSessionContractID].getService(nsIMsgMailSession); var mailCharacterSet = "charset=" + msgWindow.mailCharacterSet; for (var i = 0; i < numMessages; i++) { // Now, we need to get a URL from a URI var url = mailSession.ConvertMsgURIToMsgURL(messages[i], msgWindow); window.openDialog( "chrome://global/content/viewSource.xul", "_blank", "scrollbars,resizable,chrome,dialog=no", url, mailCharacterSet); } return true; } catch (e) { // Couldn't get mail session return false; }}function doHelpButton(){ openHelp("mail-offline-items");}// XXX The following junkmail code might be going away or changingconst NS_BAYESIANFILTER_CONTRACTID = "@mozilla.org/messenger/filter-plugin;1?name=bayesianfilter";const nsIJunkMailPlugin = Components.interfaces.nsIJunkMailPlugin;const nsIMsgDBHdr = Components.interfaces.nsIMsgDBHdr;var gJunkmailComponent;var gJunkKeys = [];var gJunkTargetFolder;function saveJunkMsgForAction(aServer, aMsgURI, aClassification){ // we only care when the message gets marked as junk if (aClassification == nsIJunkMailPlugin.GOOD) return; var spamSettings = aServer.spamSettings // if the spam feature is disabled, // or if the move functionality is turned off, bail out. // the user could still run the JMC manually, // but let's not move in that scenario if (!spamSettings.level || !spamSettings.moveOnSpam) return; var msgHdr = messenger.messageServiceFromURI(aMsgURI).messageURIToMsgHdr(aMsgURI); // don't move if we are already in the junk folder if (msgHdr.folder.flags & MSG_FOLDER_FLAG_JUNK) return; var spamFolderURI = spamSettings.spamFolderURI; if (!spamFolderURI) return; var spamFolder = GetMsgFolderFromUri(spamFolderURI); if (spamFolder) { gJunkKeys[gJunkKeys.length] = msgHdr.messageKey; gJunkTargetFolder = spamFolder; }}function performActionOnJunkMsgs(){ if (!gJunkKeys.length) { gJunkTargetFolder = []; return; } var indices = new Array(gJunkKeys.length); for (var i=0;i<gJunkKeys.length;i++) indices[i] = gDBView.findIndexFromKey(gJunkKeys[i], true /* expand */); var treeView = gDBView.QueryInterface(Components.interfaces.nsITreeView); var treeSelection = treeView.selection; treeSelection.clearSelection(); // select the messages for (i=0;i<indices.length;i++) treeSelection.rangedSelect(indices[i], indices[i], true /* augment */); SetNextMessageAfterDelete(); gDBView.doCommandWithFolder(nsMsgViewCommandType.moveMessages, gJunkTargetFolder); gJunkKeys = []; gJunkTargetFolder = null;}function getJunkmailComponent(){ if (!gJunkmailComponent) { gJunkmailComponent = Components.classes[NS_BAYESIANFILTER_CONTRACTID].getService(nsIJunkMailPlugin); }}function analyze(aMsgHdr, aNextFunction){ var listener = { onMessageClassified: function(aMsgURI, aClassification) { // XXX TODO // update status bar, or a progress dialog // running junk mail controls manually, on a large folder // can take a while, and the user doesn't know when we are done. dump(aMsgURI + ' is ' + (aClassification == nsIJunkMailPlugin.JUNK ? 'JUNK' : 'GOOD') + '\n'); // XXX TODO, make the cut off 50, like in nsMsgSearchTerm.cpp var score = aClassification == nsIJunkMailPlugin.JUNK ? "100" : "0"; // set these props via the db (instead of the message header // directly) so that the nsMsgDBView knows to update the UI // var db = aMsgHdr.folder.getMsgDatabase(msgWindow); db.setStringProperty(aMsgHdr.messageKey, "junkscore", score); db.setStringProperty(aMsgHdr.messageKey, "junkscoreorigin", "plugin"); saveJunkMsgForAction(aMsgHdr.folder.server, aMsgURI, aClassification); aNextFunction(); } }; // if we are whitelisting, check if the email address is in the whitelist addressbook. var spamSettings = aMsgHdr.folder.server.spamSettings; if (spamSettings.useWhiteList && spamSettings.whiteListAbURI) { var whiteListDirectory = RDF.GetResource(spamSettings.whiteListAbURI).QueryInterface(Components.interfaces.nsIAbMDBDirectory); var headerParser = Components.classes["@mozilla.org/messenger/headerparser;1"].getService(Components.interfaces.nsIMsgHeaderParser); var authorEmailAddress = headerParser.extractHeaderAddressMailboxes(null, aMsgHdr.author); if (whiteListDirectory.hasCardForEmailAddress(authorEmailAddress)) { // skip over this message, like we do on incoming mail // the difference is it could be marked as junk from previous analysis // or from being manually marked by the user. aNextFunction(); return; } } var messageURI = aMsgHdr.folder.generateMessageURI(aMsgHdr.messageKey) + "?fetchCompleteMessage=true"; gJunkmailComponent.classifyMessage(messageURI, msgWindow, listener);}function analyzeFolderForJunk(){ MsgJunkMailInfo(true); var view = GetDBView(); // need to expand all threads, so we analyze everything view.doCommand(nsMsgViewCommandType.expandAll); var treeView = view.QueryInterface(Components.interfaces.nsITreeView); var count = treeView.rowCount; if (!count) return; var messages = new Array(count) for (var i = 0; i < count; i++) { try { messages[i] = view.getURIForViewIndex(i); } catch (ex) {} // blow off errors here - dummy headers will fail } analyzeMessages(messages);}// not used yet, but soonfunction analyzeMessagesForJunk(){ var messages = GetSelectedMessages(); analyzeMessages(messages);}function analyzeMessages(messages){ function processNext() { if (counter < messages.length) { var messageUri = messages[counter]; var message = messenger.messageServiceFromURI(messageUri).messageURIToMsgHdr(messageUri); ++counter; analyze(message, processNext); } else performActionOnJunkMsgs(); } getJunkmailComponent(); var counter = 0; processNext();}function JunkSelectedMessages(setAsJunk){ MsgJunkMailInfo(true); // When the user explicitly marks a message as junk, we can mark it as read, // too. This is independent of the "markAsReadOnSpam" pref, which applies // only to automatically-classified messages. // Note that this behaviour should match the one in the back end for marking // as junk via clicking the 'junk' column. if (setAsJunk && pref.getBoolPref("mailnews.ui.junk.manualMarkAsJunkMarksRead")) MarkSelectedMessagesRead(true); gDBView.doCommand(setAsJunk ? nsMsgViewCommandType.junk : nsMsgViewCommandType.unjunk);}function deleteJunkInFolder(){ MsgJunkMailInfo(true); var view = GetDBView(); // need to expand all threads, so we find everything view.doCommand(nsMsgViewCommandType.expandAll); var treeView = view.QueryInterface(Components.interfaces.nsITreeView); var count = treeView.rowCount; if (!count) return; var treeSelection = treeView.selection; var clearedSelection = false; // select the junk messages var messageUri; for (var i = 0; i < count; ++i) { try { messageUri = view.getURIForViewIndex(i); } catch (ex) {continue;} // blow off errors for dummy rows var msgHdr = messenger.messageServiceFromURI(messageUri).messageURIToMsgHdr(messageUri); var junkScore = msgHdr.getStringProperty("junkscore"); var isJunk = ((junkScore != "") && (junkScore != "0")); // if the message is junk, select it. if (isJunk) { // only do this once if (!clearedSelection) { // clear the current selection // since we will be deleting all selected messages treeSelection.clearSelection(); clearedSelection = true; treeSelection.selectEventsSuppressed = true; } treeSelection.rangedSelect(i, i, true /* augment */); } } // if we didn't clear the selection // there was no junk, so bail. if (!clearedSelection) return; treeSelection.selectEventsSuppressed = false; // delete the selected messages // // XXX todo // Should we try to set next message after delete // to the message selected before we did all this, if it was not junk? SetNextMessageAfterDelete(); view.doCommand(nsMsgViewCommandType.deleteMsg); treeSelection.clearSelection();}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -