程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> outlook 插件:導出rss的link地址,rsslink

outlook 插件:導出rss的link地址,rsslink

編輯:C#入門知識

outlook 插件:導出rss的link地址,rsslink


由於對於rss的應用程序不熟悉,所以使用Outlook接收rss。使用過程和平時收郵件沒有什麼差別。

唯一的遺憾是鑒於安全考慮,outlook沒有全部下載網頁,所以每次都要打開浏覽器。有時候遇到一些需要詳細閱讀或要收藏的(比如我預備加入pocket)都要走一遍浏覽器。網頁多了,就感覺有些煩人了。

有需求,就找解決方案。

我的方案:創建一個outlook的插件,保存需要的網址。

IDE:vs2010。

outlook:2007

step 1:創建項目,名稱RssLinkExport. 請注意我沒有選擇c#節點下的outlook插件類型。采用通用的插件模型,這樣可以更好控制outlook。

 

 

step 8: 寫代碼了。由於代碼不多,就都寫在Connect類裡面了。

申明變量

private string rssEntryID; // 用於識別rss目錄,按照outlook開發,每個對象都有一個id。
private Microsoft.Office.Interop.Outlook.Application app; // 緩存outlook的對象
CommandBarButton exportBtn; // 控件
Regex reUrl; // 正則對象,篩選url。

初始化

public Connect()
{     

rssEntryID = null;    
     // 初始化正則表達式。至於為什麼要這樣寫,可以參考rss的數據格式。
     reUrl = new Regex("HREF=\"(?<key>http:[^\"]+)\"", RegexOptions.Compiled);
}
緩存application對象
public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
{
    applicationObject = application;
    addInInstance = addInInst;

// 在啟動階段,緩存應用的對象。如果您熟悉com開發,應該對此很熟悉。
    app = application as Microsoft.Office.Interop.Outlook.Application;
}
 
增加工具欄的按鈕,需要的時候觸發保存。
public void OnStartupComplete(ref System.Array custom)
{
    // save rss   ID
     Microsoft.Office.Interop.Outlook.MAPIFolder rssFolder = app.ActiveExplorer().Session.GetDefaultFolder(OlDefaultFolders.olFolderRssFeeds); 
     rssEntryID = rssFolder.EntryID;
     CommandBars commandBars = app.ActiveExplorer().CommandBars;    

// 判斷:萬一插件有異常,之前新增控件沒有移除的話,就不需要新增了。
     foreach (CommandBarControl control in commandBars["Standard"].Controls)
     {     
         if (control.Caption == "export")
         {                         
               exportBtn = control as CommandBarButton;  
               break;
         }
    }
    if (exportBtn == null)
    {
         exportBtn = (CommandBarButton)commandBars["Standard"].Controls.Add(1

, System.Reflection.Missing.Value

, System.Reflection.Missing.Value

, System.Reflection.Missing.Value

, System.Reflection.Missing.Value);
         exportBtn.Caption = "export";    
    }
    exportBtn.Click += new _CommandBarButtonEvents_ClickEventHandler(exportBtn_Click);
}
 
移除control
public void OnBeginShutdown(ref System.Array custom)  
{

// 程序退出前,銷毀新增的控件。
     if (exportBtn != null)             
     {
             exportBtn.Delete(System.Reflection.Missing.Value);
             exportBtn = null;             
     }
}
觸發事件
 void exportBtn_Click(CommandBarButton Ctrl, ref bool CancelDefault)         
{
 
     List<string> urls = new List<string>();
      // 檢查當前目錄是否rss   
     Microsoft.Office.Interop.Outlook.MAPIFolder selectedFolder = app.ActiveExplorer().CurrentFolder;                 
     Microsoft.Office.Interop.Outlook.MAPIFolder parentFolder = selectedFolder.Parent as Microsoft.Office.Interop.Outlook.MAPIFolder;                 
     if (parentFolder == null) return;                                               
     if (rssEntryID == null || rssEntryID.Equals(parentFolder.EntryID) == false) return;                 
     // 獲取界面操作後,選擇的對象列表。selection是office的對象。                
     Selection selectdItems = app.ActiveExplorer().Selection;                 
     if (selectdItems == null) return;                 
     foreach (object objSelected in selectdItems)                 
     {                     
           // 轉換成PostItem
           Microsoft.Office.Interop.Outlook.PostItem pItem = objSelected as Microsoft.Office.Interop.Outlook.PostItem;                     
           if (pItem == null) continue;                     
           // 獲取格式,這是防御性編碼,因為我常用的rss對象都是html的。
           OlBodyFormat bodyFmt = pItem.BodyFormat;                     
           string pItemBody = null;                     
           if (bodyFmt == OlBodyFormat.olFormatHTML)                     
           {                         
             pItemBody = pItem.HTMLBody;                     
           }                     
           else                     
           {                         
             pItemBody = pItem.Body;                     
           }                     
           // 導出的對象標注藍色分類,我並沒有刪除。所以如果已經標注就說明曾經導出過了。                       
           if (pItem.Categories == null)                     
           {                         
              pItem.Categories = "Blue Category";                         
              // 這步很關鍵。否則outlook不會立即刷新界面。                              
              pItem.Save();                         
              // 獲取url地址                          
              Match urlMa = reUrl.Match(pItemBody);                         
              if (urlMa.Success)                         
              {                             
                urls.Add(urlMa.Groups["key"].ToString());                         
              }                     
           }                 
     }                 
     // 把全部url保存到我的文件夾。                               
     if (urls.Count > 0)                 
     {                     
        string baseFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);                     
        string targetFolder = string.Format("{0}\\bel", baseFolder);                     
        DirectoryInfo di = new DirectoryInfo(targetFolder);                     
        if (di.Exists == false)                     
        {                         
           di.Create();                     
        }                     
        DateTime dtNow = DateTime.Now;                     
        string targetFile = string.Format("{0}\\urls_{1}{2}{3}.txt", targetFolder, dtNow.Year, dtNow.Month, dtNow.Day);                     
        StreamWriter sw = new StreamWriter(targetFile, true);                     
        foreach (string url in urls)                     
        {                         
          sw.WriteLine(url);                     
        }                     
        sw.Close();       
        // 這時候你應該看到url的文本了。         
     }

}


step 9:調試。默認的外部程序是vs2010,所以你有必要指向outlook的目錄。

debug

 

step 10:插件成功load後,界面顯示的控件--“export”。

outlook-view

 

step 11:單擊export後,選擇的item會顯示藍色分類。

btn-click

 

step 12:vs2010會自動創建發布包,但默認情況不會build,你需要手工build。

setup-proj

 

step 13:這是成功創建的安裝程序。

setup-file

 

step 14:試試看吧。

 

最後感謝施向陽同學的正則表達式技術支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved