メールの受信を監視し、添付ファイルがあればそれを、添付ファイルがない場合はメール自体を自動的に印刷する Outlook 用の小さなアドインを作成しました。
最初は、メールの処理中に別のメールが届いた場合、それをスキップするだけで、多くのメールが印刷されないという問題がありました。アプリをマルチスレッド化しようとしましたが、その後 Outlook が開くことを拒否し、ランダムなエラーが発生し続けました。そのため、最後にアドインを変更して、添付ファイルまたは電子メールをキュー (hdd 上のフォルダー) に保存し、コンソール アプリがそのキューを通過して電子メール/添付ファイルを印刷するようにしました。
これはしばらくの間は問題なく機能しますが、Outlook はアプリケーションへの新しいメールの報告を停止するだけで、エラーはどこにも記録されません。Outlook を再起動すると、ランダムな時間 (場合によっては数時間、場合によっては 1 日) 後に再び停止するまで、すべてが再び機能します。アドインの目的はセールスが注文の印刷に費やす時間を減らすことであるため、非常に面倒ですが、この問題により、印刷されたものと印刷されていないものを判断するために、受信した電子メールに対して印刷物をチェックし続ける必要がありました. メールが印刷されると自動的に既読としてマークされるように変更を加えたので、いつ停止したかを確認できますが、まだ完全ではありません。
Outlook がこのアドインへの新しいメールの報告を突然停止する理由を知っている人はいますか? 新しい電子メールを受信したときに実行される (または実行されるはずの) コードは次のとおりです。
void outlookApp_NewMailEx(string EntryIDCollection)
{
try
{
WriteToLog("Email Received: " + ((Outlook.MailItem)Application.Session.GetItemFromID((string)EntryIDCollection)).Subject);
ProcessEmail(EntryIDCollection);
}
catch (System.Exception ex)
{
WriteToLog("Error: " + ex.Message);
}
}
「受信したメール」もログに記録されず、catch ブロックにエラーも記録されないため、イベントがトリガーされているとは思いません。最後の停止の前に印刷された最後の電子メールが 19 時間 (土曜日の夜だった) 受信された唯一の電子メールであったため、過負荷になっているわけではありません。
アドバイスをいただければ幸いです。最初は 15 ~ 30 分かけて書いたものが、Microsoft のさまざまな問題をすべて解決するのに何日もかかったので、面倒になってきました。
編集:
以下は WriteToLog メソッドです。アドインとコンソール アプリの両方が同じファイルを使用しているため、ログ ファイルへのアクセスに問題がある可能性があることに気付きました。同時に書き込みを試みている可能性があります。
private void WriteToLog(string message)
{
using (StreamWriter sw = File.AppendText(logFile))
{
sw.WriteLine(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + ": " + message);
}
}
これを調べて、コンソール アプリ用の 2 つ目のログ ファイルを作成することもできます。
編集2:
以下は、「ThisAddin_Startup」メソッド内でイベントをサブスクライブする方法です。
ApplicationClass outlookApp = new ApplicationClass();
outlookApp.NewMailEx += new ApplicationEvents_11_NewMailExEventHandler(outlookApp_NewMailEx);