2017-09-13 16 views
0

Gmailの受信トレイとS22.Imapを使用してベンダーからの請求書を処理するアプリケーションがあります。 。それはどんな問題なくここ数年のために使用されてきたが、最近、私は受信トレイからのすべてのメッセージは、コマンドを使用して処理するために取得しようとすると、エラーを「ストリームを読み取ることができませんでした」を見てきた:S22.Imap System.IO.IOException:client.GetMessages(uids)中にストリームを読み取れませんでした

IEnumerable<uint> uids = client.Search(SearchCondition.Unseen()); 
IEnumerable<MailMessage> messages = client.GetMessages(uids); 

この例外は、特定のベンダーが多数の電子メールを一度に送信した場合にのみ発生すると思われます。私はS22.Imap documentationを通して見てきましたが、何も助けを見つけませんでした。

注:私は電子メールを取得するこの方法を見ましたが、私が上記使用したオリジナルの方法は、マニュアルの「目に見えないメールメッセージのダウンロード」の実際の例です。

// Fetch the messages and process each one 
foreach (uint uid in uids) 
{ 
    MailMessage message = client.GetMessage(uid); 
    ProcessMessage(message); 
} 

ここでの私の問題は、Iローカルで例外を再現することができませんでした。クライアントとの関係を実際に理解していません.GetMessages(uids)コマンド。

このように処理できるメッセージは最大数ありますか、または電子メールを読んで処理するためのよりよい方法がありますか?

これらの電子メールを取得するには、client.GetMessages(uids)が最適な方法である場合、この例外を受け取り、それが起こったときに続行する良い方法がありますか?

私は何かアドバイスをいただきありがとうございます。ありがとう、

答えて

0

私がs22を使用して電子メールを処理する方法についてこの1つの状況に非常に特化しているので、これが誰でも助けてくれるかどうかはわかりませんが、私は答えを投稿します。

主な問題は、client.GetMessages(uids)構文を使用すると、すべての電子メールが「未読」とマークされていたことです。これは、受信トレイ内のすべての電子メールを「読み取り」とマークしました(未読の電子メールをカウントして、すべての電子メールが処理されたことを確認しました)。この方法を変更して、収集したuidを1回ずつ処理することで、この問題を防ぐことができました。このエラーは、しばらくの間は一度も起こりますが、ユーザーのために何かを混乱させることはありません。処理されなかったメッセージは、次にアプリケーションが実行されたときに処理されます。だから、基本的には、私はS22.Imapで未読メールをどのように取得したのかを変更し、エラーを捕まえて移動することで対処しました。

//get the message one at a time from uids. catching any rare errors with a message 
try 
{ 
    MailMessage message = client.GetMessage(uid); 
    ProcessMessage(message); 
} 
catch(Exception e) 
{ 
    System.Threading.Thread.Sleep(1000); 
    SendErrorEmail("An exception has been caught: " + e.ToString() + 
        Environment.NewLine + "UID: " + uid.ToString()); 
} 
関連する問題