2

次のコードを使用して、署名付き/未署名の Outlook メッセージを開き、コンテンツをWebBrowserコントロールに表示します。

Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
var item = app.Session.OpenSharedItem(msgfile) as Microsoft.Office.Interop.Outlook.MailItem;
string message = item.HTMLBody;
app.Session.Logoff();     

初めてファイルを開いたときは正常に動作していますが、Outlook ファイルを閉じた後、ファイルを再度開いてみると、次のエラーが表示されます。

「ファイルを開けません: C:\tion.msg。ファイルが存在しないか、ファイルを開く権限がないか、別のプログラムで開いている可能性があります。ファイルを含むフォルダーを右クリックし、[プロパティ] をクリックします。フォルダーのアクセス許可を確認します。」

しばらくすると正常に開きます。この奇妙な動作の理由と、エラー メッセージを修正する方法を教えてください。

4

5 に答える 5

3

Outlookは、メッセージを開いたり閉じたりするときに、アイテムの独自のキャッシュを管理します。最善の策は、問題が発生しないように、経由で開くときにランダムに生成されたファイル名(つまり)を使用することです。Path.GetRandomFilenameまた、root (つまりOpenSharedItem)の代わりに一時パスを使用します。c:\Path.GetTempPath

参照解放するMailItemつまり、nullに設定する)ことはできますが、Outlookがいつアイテムをキャッシュから解放するかは保証されません。

于 2013-01-21T20:50:27.223 に答える
0

こんにちは、2 つのオプションがあります。

  • msg ファイルに読み取り専用属性を設定します

また

  • 親フォルダーに対するユーザーまたはユーザーグループの次の権限を無効にします。

    • 書き込み属性
    • 拡張属性の書き込み

msg ファイルは複数回開くことができるようになりましたが、書き込み保護されています

于 2013-03-04T12:42:43.060 に答える
0

まず、 を使用して、メッセージの処理が完了したらすぐに解放してみてくださいMarshal.ReleaseComObject()。Outlook は最後に開いたアイテムをキャッシュするのが好きなので、これが役立つ場合とそうでない場合があります。
第 2 に、Outlook がまだ実行されていてユーザーに表示されている間に、Outlook からログオフしています。Outlook はシングルトンであるため、既に実行されている場合は、既存のインスタンスで終了します。まったく呼び出さないかLogoff、開いているインスペクターとエクスプローラーがないことを確認してください。

RDOSessionを呼び出すためにRedemptionを使用することもできます。. 完了後すぐにメッセージを解放する必要がある 場合は、呼び出します。償還の場合は、RDOMailオブジェクトをインターフェイスにキャストして を呼び出すこともできます。GetMessageFromMsgFile
Marshal.ReleaseComObject()
IDisposableIDisposable.Dispose()

于 2013-01-28T18:46:05.770 に答える