由于對于rss的應用程序不熟悉,所以使用Outlook接收rss。使用過程和平時收郵件沒有什么差別。
唯一的遺憾是鑒于安全考慮,outlook沒有全部下載網頁,所以每次都要打開瀏覽器。有時候遇到一些需要詳細閱讀或要收藏的(比如我預備加入pocket)都要走一遍瀏覽器。網頁多了,就感覺有些煩人了。
有需求,就找解決方案。
我的方案:創建一個outlook的插件,保存需要的網址。
IDE:vs2010。
outlook:2007
step 1:創建項目,名稱RssLinkExport. 請注意我沒有選擇c#節點下的outlook插件類型。采用通用的插件模型,這樣可以更好控制outlook。
step 2:選擇目標對象Microsoft OutLook。這個是必須的,關系到注冊表的設定。
step 3:給插件起一個名稱,這是給outlook用戶看的。
step 4:決定安裝程序用戶是否共享這個組件。建議全部勾選。省得用的時候要重啟一下。
step 5:匯總信息,finish即可。
step 6:開發前,加入必要的reference。因為我們開發的模型是通用的。所以需要增加outlook互操作的dll。默認位置在C:/Windows/assembly/GAC/Microsoft.Office.Interop.Outlook/12.0.0.0__71e9bce111e9429c/Microsoft.Office.Interop.Outlook.dll
step 7:檢查是否加入成功Microsoft.Office.Interop.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.W
新聞熱點
疑難解答