outlook 插件:导出rss的link地址

由于对于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.WriteLine(url);                     
        }                     
        sw.Close();       
        // 这时候你应该看到url的文本了。         
     }

}

step 9:调试。默认的外部程序是vs2010,所以你有必要指向outlook的目录。

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

step 11:单击export后,选择的item会显示蓝色分类。

step 12:vs2010会自动创建发布包,但默认情况不会build,你需要手工build。

step 13:这是成功创建的安装程序。

step 14:试试看吧。

最后感谢施向阳同学的正则表达式技术支持。

时间: 2024-08-04 02:41:14

outlook 插件:导出rss的link地址的相关文章

阿里企业邮箱-PC加载outlook插件

pc机安装阿里企业邮箱outlook插件,必须有VSTO4.0及以上环境 VSTO下载地址:https://download.microsoft.com/download/F/B/A/FBAB6866-71F8-4A3F-89A4-5BC6AB035C62/vstor_redist.exe outlook插件:http://aliyun-alimail-desktop.oss-cn-hangzhou.aliyuncs.com/Windows/lastestpackage/AlimailOutlo

如何更改outlook邮件附件的默认保存地址

outlook附件默认的保存地址是"我的文档",而我习惯将我邮件的附件保存在桌面上,每次保存时都得多点一下鼠标,为了提高工作效率,通过上网搜索和自己摸索,找到了更改outlook邮件附件的默认保存地址的办法,总结如下. 1.单击"开始",然后单击"运行". 2.在"打开"框中,键入 regedit,然后按 Enter 键. 3.在注册表编辑器中,找到注册表中的以下子项: HKEY_CURRENT USER\Software\M

未解决符号表,导出符号表和地址重定向表

让我们总结一下:编译器把一个cpp编译为目标文件的时候,除了要在目标文件里写入cpp里包含的数据和代码,还要至少提供3个表:未解决符号表,导出符号表和地址重定向表.     未解决符号表提供了所有在该编译单元里引用但是定义并不在本编译单元里的符号及其出现的地址.     导出符号表提供了本编译单元具有定义,并且愿意提供给其他编译单元使用的符号及其地址.     地址重定向表提供了本编译单元所有对自身地址的引用的记录.     链接器进行链接的时候,首先决定各个目标文件在最终可执行文件里的位置.然

php,phpexcel插件导出excel使用

做了一个星期的导出excel,基本就是重复劳动,只需要完成一个,其它页面就是排版的问题了:比写静态页面还无聊: 网上excel插件应该蛮多的,之前发过一篇导出excel是以csv格式导出,这种方式导出excel有点事速度快,大批量导出数据效率高,跟导出txt文件差不多:缺点导出的文件数据没有格式,不能按照页面样式去导出数据: excel插件缺点就是导出的数据不能太多, 之前测试数据达到几千条基本上就跑不动了, 可能跟服务器性能有关, 但也能说明问题,就是插件对服务器资源消耗很大:我这边应该专门有

Flash Activex NPAPI PPAPI 各种网页插件完整安装包下载地址

内容全部是自己手工原创写作的参考内容,完全排除从其他网站COPY的内容信息.如有雷同实属巧合.   奉献给有需求的人士,也给各位解决FLASH安装头疼的问题,正常在线下载安装运气不好的安装半天.运气好的也许一会就搞定了. 以下内容主要是送给那些运气不好的朋友....也不知道你是不是其中一个运气不好的....相信你看到我的文章内容之后,很高兴的告诉你,你是一个很幸运的人...   完整安装包下载地址.所有网页插件都在这个网址了,更新的速度也是最快的,目前内容仅仅只是当天最新安装包的版本.如需要获取

[其他]chrome浏览器插件导出与导入

下载了某些插件,重装电脑怎么不备份,重装之后怎么再次使用,一文搞定! 导出crx格式备份文件 1.选择 自定义格式及控制 > 更多工具 > 扩展程序: 2.勾选"开发者模式",界面显示出打包扩展程序按钮(注意下方详细信息下面的ID,这里就是插件存放本地的目录名): 3.a.选择打包扩展程序 > 弹出对话框,选择"扩展程序根目录" ,这里注意,需要选择到插件的版本号这个目录为止,然后确认: b.私有密钥文件(可选)---这个是你有就可以选择,要是没有

火狐浏览器插件Modify Headers伪造IP地址

安装插件:先打开火狐浏览器 => 找到下载好的 modify_headers.xpi 插件文件 => 鼠标按住插件文件不放,拖拽到火狐浏览器界面 => 按提示重启浏览器 => 完成安装. 在浏览器右上角点小图标,选择打开“Open ModifyHeaders”,如下图所示. 如图依次选择 Add → 输入 X-Forwarded-For → 自定义IP地址 → 点Add按钮完成添加 最后点击左上角的“Start”开启插件就搞定啦! 文章来源:http://jingyan.baidu

jquery.fileDownload.js插件导出excel

因为使用ajax导出excel会出现问题,所以现在使用jQuery.fileDownload.js插件来解决导出excel的问题 http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/ 在页面引入jquery.fileDownload.js插件 1.如下所示 <script type="text/JavaScript" src="${re

清除Outlook 2013中缓存的邮件地址

1.删除相关文件(可能会没有访问权限): 路径:C:\Documents and Settings\user\用户名\Application Data\Microsoft\Outlook 文件名:outlook.nk2 2.Outlook中操作 File - Options - Mail - Send messages - (button) Empty Auto-Complete List