さて、これは少しトリッキーなものです...
VS 2010とVSTO、およびVB.NETを使用して、MSOutlook2007のアドインをプログラミングしています。私の目標は、特定の電子メールアドレスから受信した電子メールを印刷するようにユーザーに促すことです。(これは単純なMsgBoxで行われます。)
具体的には、メールを読み終えたときにユーザーにプロンプトを表示したいと思います。私のコンセプトは、Outlookの「開封確認」機能と同様に機能する必要があるということです。(ご存知のとおり、これらの迷惑なことは... 「送信者はあなたがこのメールを読んだことを示す領収書を要求しました」)
したがって、ユーザーは電子メールを読み、インスペクターを閉じる(または、エクスプローラービューにある場合はフォーカスを別のアイテムに変更する)と、MsgBoxがポップアップします。このタイミングは、メールが「既読」になるタイミングと一致していることに気づきました。
私はこれを数日間GoogleとMSDNおよびチュートリアルのWebサイトで追跡してきましたが、これが私が見つけたものです。
ラウンド1: MailitemオブジェクトにはUnReadプロパティがあり、PropertyChangeイベントもあります。受信トレイ内のすべてのメールアイテムでPropertyChangeにAddHandlerを使用して、PropertyChangeイベントの引数をチェックしてUnReadであることを確認する単一のサブルーチンにそれらを結び付けることができます。PropertyChangeが呼び出し元オブジェクトのIDを渡さないことを除いて、かなり機能しているようです。そのため、受信トレイ内のどの電子メールが「未読」ステータスを失ったかを知る方法がありません。
実際、MailitemイベントはどれもIDを渡していないようです。おそらく、誰か(MSだと思います)が、最初にMailitemオブジェクトへの直接ポインターを持っていると想定しているためです。したがって、このルートは機能していないようです。
ラウンド2: 受信トレイ内のすべてのメールアイテムをコレクションに取り込み、未読のものだけに制限することができます。
Dim inbox As Outlook.MAPIFolder = Nothing
Dim WithEvents unreadItems As Outlook.Items
inbox = Me.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
unreadItems = inbox.Items.Restrict("[Unread]=true")
unreadItemsはDimmedWithEventsであったため、unreadItems.ItemRemoveを処理するSubを作成できました。これは正常に機能します。ただし、ItemRemoveイベントにはオブジェクト引数がありません。ドー!
ラウンド3: 反対のことをしたとしましょう。受信トレイの内容を取得して[Unread] = falseに制限してから、.ItemAddイベントを使用します。これはある程度機能しますが、理論的には、受信トレイ内の未読グループから既読グループへの変更だけでなく、ユーザーが任意のフォルダから「[未読]=false」アイテムを受信トレイにダンプしたときに呼び出されます。ですから、私がここで何かを誤解していない限り、選択肢もありません。
ラウンド4: さて、私も考えたのは、受信トレイアイテムコレクションWithEventsを調光し、.ItemChangeイベントをオフにすることでしたが、このイベントはオブジェクトについて何が変更されたかを実際には指定しないため、サイコロはありません。
最後に、私はこれにかなり困惑しています。私は自分の目標から後退することに非常に近いです。不十分な代替手段は、指定されたアドレスの1つから電子メールを受信したときにユーザーに警告することです(Application.NewMailイベントは私に面倒を与えないと私は信じているため)。しかし、それなら、私は単にユーザーに警告する必要があります-私は彼らがまだ読んでいない電子メールを印刷するように彼らに促しません。
この代替案は望ましくなく、私は自分の問題を調査と提案のために提示すると考えました。
-マット
PS私はObjective-CでiPadアプリを作成することから来ています。ここでは、オブジェクト階層のほとんどを自分で構築しています...そのような制限があるCOMオブジェクトを処理する必要があるのは奇妙です。