S22.Imap System.IO.IOException:在client.GetMessages(uids)期间无法读取流

时间:2017-09-13 13:19:10

标签: c# email gmail imap gmail-imap

我有一个应用程序,通过使用Gmail收件箱和S22.Imap来处理供应商的发票,以阅读电子邮件和PDF附件。它已经使用了几年而没有任何问题,但是最近,当我尝试使用命令处理来自收件箱的所有消息时,我一直看到“流无法读取”错误:

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);
}

我的问题是我无法在本地重现异常,我真的不明白它与client.GetMessages(uids)命令的关系。

是否可以通过这种方式处理最大数量的邮件,还是有更好的方式来阅读和处理电子邮件?

如果client.GetMessages(uids)是获取这些电子邮件的最佳方式,是否有一种很好的方法可以捕获此异常并在它发生时继续?

我很感激任何建议。谢谢,

1 个答案:

答案 0 :(得分:0)

不确定这是否会对任何人都有帮助,因为对于我们如何使用s22来处理电子邮件这种情况如此特别,但我想我无论如何都会发布答案。 发生的主要问题是所有电子邮件都被标记为“未读”。使用client.GetMessages(uids)语法时。这标记了收件箱中的所有电子邮件,其中包含&#39;读取&#39; (我计算了未读电子邮件以确保每封电子邮件都已处理完毕)。每次更改此方法以通过收集的uid可以防止出现此问题。错误仍然偶尔会发生,但它不会给用户带来任何麻烦。未能获得处理的消息将在下次应用程序运行时得到处理。所以基本上,我只是改变了我用S22.Imap检索未读电子邮件的方式,并通过捕获它们并继续前进来处理错误。 //从uids中一次获取一条消息。通过消息捕获任何罕见的错误 尝试 {     MailMessage message = client.GetMessage(uid);     ProcessMessage的(消息); } catch(例外e) {     System.Threading.Thread.Sleep(1000);     SendErrorEmail(&#34;已捕获异常:&#34; + e.ToString()+                     Environment.NewLine +&#34; UID:&#34; + uid.ToString()); }