0

さて、これは少しトリッキーなものです...

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オブジェクトを処理する必要があるのは奇妙です。

4

1 に答える 1

3

ユーザーがメールを読み終えた時期がはっきりしないため、UIをどのように動作させるかはよくわかりません。それを見る1つの方法は、彼らがそれを見たときに行われるということです。つまり、インスペクターウィンドウにメールが表示され、ユーザーは別のメールに切り替えています。それをキャッチするには、メールアイテムではなく、検査官からのイベントを見るのがおそらく最善でしょう。別の見方をすれば、メールは既読としてマークされているときはいつでも読まれます。ユーザーが実際にアイテムを自動的に既読としてマークするオプションをオフにする場合があることに注意してください。これは、次のように、[ツール]->[オプション]->[その他]->[閲覧ウィンドウ]で実行できます。

ここに画像の説明を入力してください

また、ユーザーがアイテムを選択して手動で既読としてマークする場合があるため、その場合に何をしたいかを考える必要があります。

MailItemの「読み取り」プロパティの変更を監視する場合は、ラウンド1に非常に近いです。追加する必要があるのは、すべてのハンドラーを単一のオブジェクトの単一のサブルーチンに結び付けないことです。実例。代わりに、次のような独自のクラスを作成できます(C#コード):

class ItemWatcher
{
    // The Outlook mailitem to watch for
    private Microsoft.Office.Interop.Outlook.MailItem itemBeingWatched = null;

    public ItemWatcher(Microsoft.Office.Interop.Outlook.MailItem item, Form1 parentForm)
    {
        itemBeingWatched = item;
        itemBeingWatched.PropertyChange += new Microsoft.Office.Interop.Outlook.ItemEvents_10_PropertyChangeEventHandler(itemBeingWatched_PropertyChange);
    }

    void itemBeingWatched_PropertyChange(string Name)
    {
        // Respond to property <Name> in the object itemBeingWatched having changed
    }
}

次に、ItemWatcherクラスのコレクションを作成し、それらをメールを監視するように設定する必要があります。
新しいメールが到着したとき、または古いメールが削除/移動されたときに、監視対象アイテムのコレクションに追加/削除する必要のあるアイテムにも注意する必要があることに注意してください。

于 2011-11-16T14:49:46.957 に答える