S22.Imap System.IO.IOException: 在 client.GetMessages(uids) 期间无法读取流
S22.Imap System.IO.IOException: The stream could not be read, during client.GetMessages(uids)
我有一个应用程序可以通过使用 Gmail 收件箱和 S22.Imap 阅读电子邮件和 pdf 附件来处理供应商的发票。它已经使用了好几年,没有任何问题,但最近,我在尝试使用以下命令处理收件箱中的所有邮件时看到 "The stream could not be read" 错误:
IEnumerable<uint> uids = client.Search(SearchCondition.Unseen());
IEnumerable<MailMessage> messages = client.GetMessages(uids);
这个异常似乎只有在某个供应商一次发送大量电子邮件时才会出现。我一直在浏览 S22.Imap documentation,但没有找到任何帮助。
注意:我确实看到过这种获取邮件的方式,但我上面使用的原始方法是文档中"Downloading unseen mail messages"的实际示例:
// 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) 是获取这些电子邮件的最佳方式,是否有一种好方法可以捕获此异常并在它确实发生时继续?
如有任何建议,我将不胜感激。谢谢,
不确定这是否会对任何人有所帮助,因为在我们使用 s22 处理电子邮件的这种情况下它是如此特殊,但我想我无论如何都会 post 回答。
发生的主要问题是在使用 client.GetMessages(uids) 语法时所有电子邮件都被标记为 'unread'。这将收件箱中的所有电子邮件标记为 'read'(我计算未读电子邮件以确保处理每封电子邮件)。将此方法更改为每次通过收集的 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());
}
我有一个应用程序可以通过使用 Gmail 收件箱和 S22.Imap 阅读电子邮件和 pdf 附件来处理供应商的发票。它已经使用了好几年,没有任何问题,但最近,我在尝试使用以下命令处理收件箱中的所有邮件时看到 "The stream could not be read" 错误:
IEnumerable<uint> uids = client.Search(SearchCondition.Unseen());
IEnumerable<MailMessage> messages = client.GetMessages(uids);
这个异常似乎只有在某个供应商一次发送大量电子邮件时才会出现。我一直在浏览 S22.Imap documentation,但没有找到任何帮助。
注意:我确实看到过这种获取邮件的方式,但我上面使用的原始方法是文档中"Downloading unseen mail messages"的实际示例:
// 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) 是获取这些电子邮件的最佳方式,是否有一种好方法可以捕获此异常并在它确实发生时继续?
如有任何建议,我将不胜感激。谢谢,
不确定这是否会对任何人有所帮助,因为在我们使用 s22 处理电子邮件的这种情况下它是如此特殊,但我想我无论如何都会 post 回答。
发生的主要问题是在使用 client.GetMessages(uids) 语法时所有电子邮件都被标记为 'unread'。这将收件箱中的所有电子邮件标记为 'read'(我计算未读电子邮件以确保处理每封电子邮件)。将此方法更改为每次通过收集的 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());
}