mailcommands.js

来自「现在很火的邮件客户端软件thunderbird的源码」· JavaScript 代码 · 共 785 行 · 第 1/2 页

JS
785
字号
                    {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 + =
减小字号Ctrl + -
显示快捷键?