【问题标题】:How to loop through all MailItems of certain Outlook subfolders如何遍历某些 Outlook 子文件夹的所有 MailItems
【发布时间】:2011-07-03 04:18:01
【问题描述】:

我正在开发 Outlook 2007 加载项。我找到了一些代码来遍历所有文件夹,但我无法弄清楚如何循环 inside 任何给定的文件夹来检查 MailItem 对象(最终,我想要将电子邮件保存在其他地方并修改 .Subject 属性)。

这是我目前所拥有的:

 private void btnFolderWalk_Click(object sender, EventArgs e)
    {
        // Retrieve the name of the top-level folder (Inbox) , for 
        // the purposes of this demonstration.
        Outlook.Folder inbox = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
          as Outlook.Folder;        // Cast the MAPI folder returned as an Outlook folder
        // Retrieve a reference to the top-level folder.
        if (inbox != null)
        {
            Outlook.Folder parent = inbox.Parent as Outlook.Folder;   // the mailbox itself
            if (parent != null)
            {
                RecurseThroughFolders(parent, 0);
            }
        }
    }
    private void RecurseThroughFolders(Outlook.Folder theRootFolder, int depth)
    {
        if (theRootFolder.DefaultItemType != Outlook.OlItemType.olMailItem)
        {
            return;
        }
        lbMail.Items.Add(theRootFolder.FolderPath);
        foreach (Object item in theRootFolder.Items)
        {
            if (item.GetType() == typeof(Outlook.MailItem))
            {
                Outlook.MailItem mi = (Outlook.MailItem)item;
                lbMail.Items.Add(mi.Subject);
            //-------------------------------------------------------------------------
            //  mi.Subject is actually a folder name as it's full path. 
            //  How to "open it" to get emails?
            //  need loop here to modify .Subject of MailItem(s) in certain subfolders
            //-------------------------------------------------------------------------
            }
        }
        foreach (Outlook.Folder folder in theRootFolder.Folders)
        {
            RecurseThroughFolders(folder, depth + 1);
        }
    }

在解决问题的这个阶段,我正在使用一个列表框,当前的输出如下所示。我想“处理”“Projectnnnnnn”文件夹的电子邮件。

\\Personal Folders
\\Personal Folders\Deleted Items
\\Personal Folders\Inbox
\\Personal Folders\Inbox\MySubFolder
\\Personal Folders\Inbox\MySubFolder\Project456212
\\Personal Folders\Inbox\MySubFolder\Project318188
\\Personal Folders\Inbox\Outbox
\\Personal Folders\Inbox\SentItems

编辑:

我在上面的循环中稍作更改来解决这个问题(即删除当前项目是邮件项目的检查):

foreach (Object item in theRootFolder.Items)
    {
            Outlook.MailItem mi = (Outlook.MailItem)item;
            string modifiedSubject = "Modifed Subject: " + mi.Subject;
            lbMail.Items.Add(modifiedSubject);
            mi.Subject = modifiedSubject;
            mi.Save();
     //          insert call webservice here to upload modified MailItem to new data store
    }

【问题讨论】:

  • lbMail 变量的定义是什么?

标签: c# visual-studio-2010 outlook-addin outlook-2007


【解决方案1】:

// 因为下面有.move,所以需要向后迭代

for (int i = theRootFolder.Items.Count; i > 0; i--)
{
     Outlook.MailItem mi = (Outlook.MailItem)theRootFolder.Items[i];
     if (mi != null)
     {
         if (!mi.Subject.StartsWith("M1"))
         {
             mi.Move(_TRIM_archiveFolder);
         }
     }
 }

【讨论】:

    【解决方案2】:

    虽然上述代码可能有效,但您可能会遇到未处理的 InvalidCastException,因为并非根文件夹中的所有项目都是邮件项目(例如会议请求)。
    以下代码对我有用:

    foreach (object item in items)
    {
        if (item is Outlook.MailItem)
        {
            ///The rest of your code
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 2011-01-17
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2013-01-27
      相关资源
      最近更新 更多