我正在开发一个 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;
}
}
无论我选择一条消息,还是转到导航窗格并选择一个文件夹,我都会收到消息“此项目是一封电子邮件”。