0

CDO オブジェクトを使用して添付ファイル付きのメッセージを送信しようとしています。SMTP サーバーが利用可能で、すべての情報が正しい場合、メッセージは添付ファイル付きで正しく送信されます。

ただし、SMTP サーバーが正しくない場合、メッセージは (予想どおり) 送信されませんが、どこかで「スタック」しているように見えます。私は使っている:

Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"] = 2

インターネットで検索したところ、このオプションでは 60 秒のタイムアウトが発生することがわかりました。しかし、メッセージに添付したファイルは利用できません。

私が行ったテストは、ファイルが添付され、無効な SMTP サーバーを使用してメッセージを送信することです。次に、数分待ってから、添付したファイルを削除しようとしました。ただし、実行しようとすると、許可の問題が発生します。送信メール プログラムを強制終了すると、ファイルを削除できます。

メッセージの送信を断念するようにタイムアウトを設定する方法、メッセージが送信されないときにファイルを「デタッチ」する方法、メッセージが送信されるまでプログラムを待機させる方法を知りたいです (送信したいメッセージを送信してから、添付ファイルをコンピュータから消去します.そのため、メッセージが実際に送信されたのはいつか、またはタイムアウトになったのはいつかを知る必要があります)。

4

1 に答える 1

1

CDO はどうしようもなく時代遅れです。System.Net.Mail への切り替えを検討する必要があります。特定の問題は、ファイルのロックの問題のようです。CDO のバグと同じように、添付ファイルを開いて電子メール メッセージを作成しますが、SMTP サーバーが停止するとファイルを閉じるのを忘れます。

このバグは、.NET が CDO などの COM サーバーを処理する方法によって悪化する可能性があります。ガベージ コレクターが実行されるまで、COM オブジェクトは解放されません。特にメールを送信しようとした後、プログラムが重要なことを何も行わない場合は、しばらく時間がかかることがあります。これを回避するには、CDO オブジェクトで Marshal.ReleaseComObject() を呼び出します。プログラム内に他の CDO インターフェイス参照がある場合は機能しない傾向があり、それらの参照は隠される傾向があります。GC.Collect() + GC.WaitForPendingFinalizers() は、オブジェクト参照を無効にした後の大きなハンマーです。

しかし、実際には System.Net.Mail を使用してください。

于 2010-08-18T15:08:04.370 に答える