想象一个邮件服务器支持400- 500mb的附件,或者想象一个30mb的邮件,但是有10个附件——如果我们每次想要从中删除一个附件时都必须下载整个消息,那么GC必须处理300 mb的开销。
IMailFolder.GetMessage
很好,但在这种情况下,最好使用IMailFolder.Fetch
。
遗憾的是,我没有看到一种方式,我可以添加一些东西到IMessageSummary
(在我的情况下,我想添加一个附件,或删除一个附件)和"修改"。我在服务器上获取的信息。这可以通过使用ImailFolder.Append(MimeMessage)
来实现,但正如方法签名所暗示的那样,它需要MimeMessage
,而IMessageSummary
不是。
任何想法?
首先,让我澄清一些事情:
IMessageSummary
上包含的信息实际上是关于消息的只读元数据。Body
和Attachments
属性不是完整的MIME部分,它们只是关于 MIME部分的元数据。
好了,现在已经解决了这个问题:
基本IMAP协议不支持做你想做的事情。您需要做的是下载完整的消息,对消息进行更改,将修改后的消息附加到IMAP文件夹,然后删除旧的(原始)消息。
如果服务器支持REPLACE
扩展,那么APPEND + STORE FLAGS Deleted + EXPUNGE操作可以是原子的,但它的要点仍然是相同的,因为您仍然需要下载消息,修改它,然后将其上传到服务器。
我认为这涵盖了你以前的stackoverflow问题:如何使用MailKit/MimeKit将附件从一封电子邮件移动到另一封电子邮件?
(包括上下文,以防阅读本文的人有兴趣知道解决方案)
但是这个问题与以前的问题不同,因为你问的是是否有一种更有效的方法可以在IMAP服务器上添加或删除消息中的MIME部分,而不必先在本地下载。
正好有一个叫做CATENATE的IMAP扩展允许这个
不幸的是,我还没有时间在MailKit中实现这个扩展,我不确定它是否真的值得这样做,因为很少有IMAP服务器实际上支持这个扩展。
也就是说,如果添加它有价值,我愿意将此扩展添加到我的TODO列表中。
你可以检查你的服务器是否支持这个扩展通过检查:
if (client.Capabilities.HasFlag (ImapCapabilities.Catenate)) {
Console.WriteLine ("Yes! The IMAP server supports the CATENATE extension!");
}
如果没有(我怀疑它没有),那么你唯一的选择就是下载消息,删除部分,然后重新上传。