2

我正在开发一个 Outlook 加载项,它可以以两种方式之一工作,具体取决于用户的选择 - 它可以处理选定的电子邮件,或者处理选定文件夹中的所有电子邮件。我已经完成了第一部分的工作,但是第二部分给我带来了麻烦,可能是因为我只是错误地调整了第一部分的代码。我相信问题归结为在 C# Outlook 加载项中正确获取当前选定的文件夹。顺便说一句,我正在使用 .NET 3.5 和 Outlook 2007。

首先,电子邮件代码 - 如果用户在收件箱中选择一封或多封电子邮件,并使用“选定的电子邮件”选项运行我的加载项,则运行以下代码(并且工作正常!):

public static void processSelectedEmails(Outlook.Explorer explorer)
{
    //Run through every selected email
    for (int i = 1; i <= explorer.Selection.Count; i++)
    //alternatively, foreach (Object selectedObject in explorer.Selection)
    {
        Object selectedObject = explorer.Selection[i];
    if (!(selectedObject is Outlook.Folder))
        {
                string errorMessage = "At least one of the items you have selected is not an email.";
                //Code for displaying the error
                return;
        }
        else
        Outlook.MailItem email = (selectedObject as Outlook.MailItem);
        //Do something with current email
    }
}

如果用户转到 Outlook 中的导航窗格(默认情况下在左侧),选择文件夹或子文件夹(可能是收件箱、已发送邮件或他们创建的其他文件夹),我已尝试调整此代码以执行其他操作. 然后,用户可以在我的加载项中选择“处理选定文件夹”选项,这与上面的代码基本相同,但处理选定文件夹内的所有电子邮件。我已将其设置为仅在用户选择了单个文件夹时才起作用。

public static void processFolder(Outlook.Explorer explorer)
{
    //Assuming they have selected only one item
    if (explorer.Selection.Count == 1)
    {
        //Make sure that that selected item is a folder
        Object selectedObject = explorer.Selection[1];
        if (!(selectedObject is Outlook.Folder))
        {
            string errorMessage = "The item you have selected is not a folder.";
            //Code for displaying the error
            return;
        }

        //Code for running through every email in that folder
    }
}

我还没有编写代码来实际运行所选文件夹中的所有电子邮件,因为我的代码永远不会超过if (!(selectedObject is Outlook.Folder)). 即使最近选择的项目是您的收件箱,我也会收到我当时编程的错误。也许我在滥用 explorer.Selection 的东西?任何帮助将非常感激。

这对于回答我的问题可能很重要 - 加载项有一个名为“explorer”的字段,它是在启动时生成的:explorer = this.Application.ActiveExplorer. 这是传递给我的函数的“资源管理器”,以便他们知道选择了什么。正如我所说,这适用于选定的电子邮件,但不适用于选定的文件夹。任何见解将不胜感激!

编辑 1:看来这个问题基本上是Get all mails in Outlook from a specific folder的副本,但它没有答案。

编辑2:我一直在做进一步的研究,看来我可以通过创建一个弹出窗口来使用该Application.Session.PickFolder()方法选择一个文件夹来获得几乎相同的功能(但不幸的是还有一个额外的步骤)。有没有办法根据当前选择的文件夹来做,而不是强迫用户选择一个新文件夹?

编辑 3:我修改了此处的代码:http: //msdn.microsoft.com/en-us/library/ms268994 (v=vs.80).aspx以进一步显示对我来说不能正常工作的内容:

  public static void processFolder(Outlook.Explorer explorer)
    {
        string message;
        if (explorer.Selection.Count > 0)
        {
            Object selObject = explorer.Selection[1];
            if (selObject is Outlook.MailItem)
            {
                message = "The item is an e-mail";
            }
            else if (selObject is Outlook.Folder)
            {
                message = "The item is a folder";
            }
            else
            {
                message = "No idea what the item is!";
            }

            Console.WriteLine(Message);
            return;
        }
    }

无论我选择一条消息,还是转到导航窗格并选择一个文件夹,我都会收到消息“此项目是一封电子邮件”。

4

1 回答 1

5

Explorer.Selection仅适用于ItemsMailItem、AppointmentItem 等)- 不适用Folders。要访问当前选定的Folder,您需要Explorer.CurrentFolder.

Folder.Items将为您提供对Items给定Folder.

于 2012-07-13T13:50:26.693 回答