【问题标题】:S22.Imap System.IO.IOException: The stream could not be read, during client.GetMessages(uids)S22.Imap System.IO.IOException:在 client.GetMessages(uids) 期间无法读取流
【发布时间】:2017-09-13 13:19:09
【问题描述】:

我有一个应用程序,它通过使用 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) 是获取这些电子邮件的最佳方式,是否有一种好方法可以捕获此异常并在它发生时继续?

如果有任何建议,我将不胜感激。谢谢,

【问题讨论】:

    标签: c# email gmail imap gmail-imap


    【解决方案1】:

    不确定这是否会对任何人有所帮助,因为它对于我们如何使用 s22 处理电子邮件的这种情况非常特殊,但我想我无论如何都会发布答案。

    发生的主要问题是使用 client.GetMessages(uids) 语法时所有电子邮件都被标记为“未读”。这将收件箱中的所有电子邮件标记为“已读”(我计算了未读电子邮件以确保每封电子邮件都已处理)。更改此方法以每次通过一个收集的 uid 可以防止此问题。该错误仍然偶尔发生一次,但它不会给用户带来任何麻烦。未能得到处理的消息只会在应用程序下次运行时得到处理。所以基本上,我只是改变了我使用 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());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 2015-06-03
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      相关资源
      最近更新 更多