专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » thunderbird:基于Mozilla Thunderbird的扩展开发( 4)---修改Thunderbird源代码实现自动保存附件 »正文

thunderbird:基于Mozilla Thunderbird的扩展开发( 4)---修改Thunderbird源代码实现自动保存附件

来源: 发布时间:星期四, 2009年1月15日 浏览:33次 评论:0
  在上基于Mozilla Thunderbird扩展开发( 3)---如何获取邮件完整信息中给出了种简单获取邮件完整信息(包括正文和附件等)思路方法但仔细考虑后发现离实际需求还有段距离

  Thunderbird中已经有保存附件功能但需要手动去操作既然手头有它源代码为什么我们不自己尝试对它进行修改从而使得它能自动保存所有附件呢?Ok,这篇文章就是基于这样思想个尝试

  首先明确个前提本文并不想开发个扩展而是尝试直接修改Thunderbird源代码但你也可以将它修改为个扩展这里为了调试开发简单起见因此我选择了直接修改其代码

  要想自动保存附件首先需要知道在它源代码中哪个点去执行保存附件这样个动作在多次试验后发现可以msgMail3PaneWindow.js中177行处folderListener对象进行修改如下:

var folderListener = {
  
  OnItemIntPropertyChanged: function(item, property, oldValue, Value) {
    (item gMsgFolderSelected) {
    (property.toString "TotalMessages" || property.toString "TotalUnreadMessages") {
      
     
     UpdateStatusMessageCounts(gMsgFolderSelected);
    
     UpdateFolderLocationPicker(item);
//***************************************************************************
//Author: phinecos
//Date : 2008/5/8
//Description:自动保存邮件到指定文件夹下
//Contact:[email protected]
//***************************************************************************
     (property.toString"TotalMessages" && Value>oldValue){//保存邮件到指定文件夹下
        (messenger!=null && gDBView!=null){
         try{
           SaveAllMessages(saveFolderName);
         }
         catch(err){
         }
       }
     }
    }   
   }
  },
//***************************************************************************
//Author: phinecos
//Date : 2008/5/8
//Description:保存所有邮件
//Contact:[email protected]
//***************************************************************************
function SaveAllMessages(folerName)
{//保存所有邮件,folerName是文件夹名称
  (gDBViewnull)
  {//gDBView是空
    ;
  }
  var treeView = gDBView.QueryInterface(Components.erfaces.nsITreeView);
  var count = treeView.rowCount;  
   (!count)
    ;
  gDBView.doCommand(nsMsgViewCommandType.expandAll);//展开所有邮件
  var messageUri;
  var msgKey = null;
  for (var i = 0; i < count; i)
  {//保存第i个邮件
    try
    {
       messageUri = gDBView.getURIForViewIndex(i);//邮件Uri
      msgKey = gDBView.getKeyAt(i);//邮件key
      
      try
      {
        gDBView.loadMessageByMsgKey(msgKey);//加载邮件
      }
      catch(err)
      {
        alert("sory");
      }
      var msgHdr = messenger.messageServiceFromURI(messageUri).messageURIToMsgHdr(messageUri);
      var result = true;
      result = msgHdr.folder.hasMsgOffline(msgHdr.messageKey);
      (resultfalse)
      {//本地数据源中读取邮件
        readOffline(msgHdr,messageUri,folerName);
      }
      
      {//从服务器上读邮件
        //to be do future
      }      
    }
    catch (ex)
    {// blow off errors for dummy rows
      continue;
    }
  }
}


  接下来那些具体保存邮件代码这里就省略了具体可以参考上篇文章要重点提点是这句代码:

gDBView.loadMessageByMsgKey(msgKey);//加载邮件

  当执行它时会加载邮件信息从而会触发对附件处理因此我们可以在附件处理中进行保存附件处理

  msgHdrViewOverlay.js文件中第425行处handleAttachment思路方法就是我们需要修改地方

    handleAttachment: function(contentType, url, displayName, uri, isExternalAttachment)
  {
    ….(省略)
    //保存当前邮件附件信息
   var currentAttachment = createNewAttachmentInfo(contentType, url, displayName, uri, isExternalAttachment);
….(省略)
//   
//***************************************************************************
//Author: phinecos
//Date : 2008/5/17
//Description:保存附件
//Contact:[email protected]
//***************************************************************************
  var actionIndex = 0;
//  for (index in currentAttachment) {
    // exclude all attachments already deleted
        var attachment = currentAttachment;//当前待处理附件
         (attachment.contentType != 'text/x-moz-deleted') {
          var path = getDefaultSaveFolder;//附件保存目录路径
  
          var destFolder=makeFile;
          destFolder.initWithPath(path);          
          var folder=destFolder;
          var proposedfileobject = makeFile;
          proposedfileobject.initWithFile(folder);
  
          proposedfileobject.appendRelativePath(attachment.displayName);//附件目标文件
  
           (proposedfileobject && proposedfileobject.parent && !proposedfileobject.parent.exists)
           {//若父目录不存在则先创建父目录
             proposedfileobject.parent.create(proposedfileobject.DIRECTORY_TYPE, 0600);
           }
          aeMessenger.saveAttachmentToFolder(attachment.contentType, attachment.url,proposedfileobject.leafName, attachment.uri, proposedfileobject.parent, index);//保存当前待处理附件
        }
//      }
  },


  真正完成保存附件是下面aeMessenger对象:

var aeMessenger =
{
  Cc:Components.es,
  Ci:Components.erfaces,
  
/**//* ************************************* saving ************************************* */
 saveAttachmentToFolder:function(contentType,url,displayName,messageUri,aDestFolder,attachmentindex)
 {
  var out=aDestFolder.clone;
  out=out.QueryInterface(Components.erfaces.nsILocalFile);
  out.append(displayName);
   (this.saveAttachment(out, url, messageUri, contentType, attachmentindex)) out;//保存附件实际动作
   null;
 }, //##
  
 // simplied version of this function, taking out all fetchservice stuff.
 saveAttachment:function(file, url, messageUri, contentType, attachmentindex)
 {
  try{
  // strip out ?type=application/x-message-display because it confuses libmime
   (url.indexOf("?type=application/x-message-display")!=-1) {
    url=url.replace("?type=application/x-message-display","").replace('&','?');
  }
  url=url.replace("/;section","?section");
  
  var saveListener = aeSaveMsgListener(file, messenger,contentType,null,null,false);
   
  var convertedListener=saveListener.QueryInterface(Components.erfaces.nsIStreamListener);//流监听器
  
   var messageService=messenger.messageServiceFromURI(messageUri);//邮件服务提供者
   var openAttArgs= Array(contentType,file.leafName,url,messageUri,convertedListener,null,null);//apply思路方法所需要参数
    messageService.openAttachment.apply(null,openAttArgs); //真正去保存附件
  }
   catch (e)
   {
     false;
  }
   true;
 },
};




  注:这里设置了个流监听器作用是为了对文件流写入进行监控并不是必须

  好了这下就可以用make命令重新编译thunderbird源代码了测试时先启动thunderbird当接收到新邮件并且其含有附件时就会自动下载并保存



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: