【问题标题】:Get mailitem from subfolder VSTO从子文件夹 VSTO 获取 mailitem
【发布时间】:2020-03-20 14:39:41
【问题描述】:

今天我有下面的代码来按主题过滤共享邮箱中的邮件。 来自项目的信息被插入到数据表中。

代码运行良好,但我还需要包含子文件夹。 我试图解决但完全卡住了。

感谢所有帮助。

 try
        {
            DataTable dtForExport = new DataTable();
            dtForExport.Clear();
            dtForExport.Columns.Add("Typ");
            dtForExport.Columns.Add("Inkom");
            dtForExport.Columns.Add("Orsak");

            Outlook.Application outlookapp = new Outlook.Application();
            Outlook.NameSpace ns = outlookapp.GetNamespace("MAPI");

            // additional email address 
            string recipientName = "Foo@bar.com";

            Outlook.Recipient recip = ns.CreateRecipient(recipientName);
            recip.Resolve();



                Outlook.MAPIFolder inbox = ns.GetSharedDefaultFolder(recip, Outlook.OlDefaultFolders.olFolderInbox);

            Outlook.Items items = inbox.Items;
            Outlook.MailItem mailItem = null;
            object folderItem;
            string subjectName = string.Empty;

            string filter = "[Subject] = 'Sjukanmälan' OR [Subject] = 'Friskanmälan'";
            folderItem = items.Find(filter);

            string pattern = ".*Orsak.*";
            Regex r = new Regex(pattern);

            while (folderItem != null)
            {
                mailItem = folderItem as Outlook.MailItem;
                MessageBox.Show(folderItem.ToString());
                if (mailItem != null)
                {
                    var SickType = "";
                    foreach (Match m in r.Matches(mailItem.Body))
                    {
                        SickType = m.Value.Replace("Orsak: ", "");
                    }
                    dtForExport.Rows.Add(mailItem.Subject, mailItem.ReceivedTime, SickType);
                }
                folderItem = items.FindNext();
            }

【问题讨论】:

    标签: c# outlook vsto


    【解决方案1】:

    Enumerating through all outlook folders recursively

     private void LoadTree()
            {
                Microsoft.Office.Interop.Outlook.Application app = null;
                Microsoft.Office.Interop.Outlook._NameSpace ns = null;
                Microsoft.Office.Interop.Outlook.PostItem item = null;
                Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null;
                Microsoft.Office.Interop.Outlook.MAPIFolder subFolder = null;
    
                try
                {
                    app = new Microsoft.Office.Interop.Outlook.Application();
                    ns = app.GetNamespace("MAPI");
                    ns.Logon(null, null, false, false);
    
                    TreeNode root = new TreeNode();
                    root.Text = "MAPI";
    
                    Microsoft.Office.Interop.Outlook.Folders folders = ns.Folders;
    
                    foreach (Microsoft.Office.Interop.Outlook.Folder folder in folders)
                    {
                        TreeNode newnode = new TreeNode();
                        newnode.Text = folder.Name;
    
                        LoadSubFolder(ref newnode, folder.Folders);
    
                        //foreach (Microsoft.Office.Interop.Outlook.Folder subfolder in folder.Folders)
                        //{
                        //    TreeNode newsub = new TreeNode();
                        //    newsub.Text = subfolder.Name;
                        //    newnode.Nodes.Add(newsub);
                        //}
    
                        root.Nodes.Add(newnode);
                    }
    
                    root.Expand();
                    treeView1.Nodes.Add(root);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    ns = null;
                    app = null;
                    inboxFolder = null;
                }
            }
    
            private void LoadSubFolder(ref TreeNode node, Microsoft.Office.Interop.Outlook.Folders folders)
            {
                try
                {
                    foreach (Microsoft.Office.Interop.Outlook.Folder subfolder in folders)
                    {
                        TreeNode newNode = new TreeNode();
                        newNode.Text = subfolder.Name;
                        LoadSubFolder(ref newNode, subfolder.Folders);
    
                        node.Nodes.Add(newNode);
                    }
                }
                catch (Exception ex) { }
            }
    

    【讨论】:

    • 感谢您的回答。但是我该如何把东西放在一起呢?我可以遍历并获取名称,但我的 2 个未解决的问题是:它列出了个人收件箱和共享收件箱,我认为 Outlook.MAPIFolder inbox = ns.GetSharedDefaultFolder(recip, Outlook.OlDefaultFolders.olFolderInbox);使用共享邮箱的设置。如何从所有文件夹中取出项目?
    • 对不起,我不明白你写什么。您的代码正在搜索一个文件夹,所以我给了您一个链接,它可以“递归枚举所有 Outlook 文件夹”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2011-12-30
    • 2017-11-18
    • 2013-01-07
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    相关资源
    最近更新 更多