2

ユーザーの選択に応じて、選択した電子メールを処理するか、選択したフォルダー内のすべての電子メールを処理できる、2 つの方法のいずれかで機能する Outlook アドインに取り組んでいます。最初の部分は動作しましたが、2 番目の部分で問題が発生しています。おそらく、最初の部分のコードを間違って適用したためです。問題は、現在選択されているフォルダーを C# Outlook アドインで適切に取得することにあると思います。ちなみに、私は .NET 3.5 と Outlook 2007 を使用しています。

まず、電子メール コード - ユーザーが受信トレイで 1 つ以上の電子メールを選択し、「選択した電子メール」オプションを使用してアドインを実行すると、次のコードが実行されます (正常に動作します!)。

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 = 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のみItems( MailItem、AppointmentItem など) - ではありませんFolders。現在選択されている にアクセスするには、Folderが必要Explorer.CurrentFolderです。

Folder.ItemsItemsは、指定された 内のすべてへのアクセスを提供しますFolder

于 2012-07-13T13:50:26.693 に答える