想象一个支持 400-500 mb 范围内的附件的邮件服务器。或者想象一封 30 MB 的邮件,但有 10 个附件 - 如果我们每次希望从中删除附件时都必须下载整个邮件,那么 GC 必须处理 300 MB 的开销。
IMailFolder.GetMessage
很好,但在这种情况下,最好使用 IMailFolder.Fetch
。
遗憾的是,我没有找到一种方法可以向 IMessageSummary
添加内容(就我而言,我想添加附件或删除附件)并且“修改”我通过更改在服务器上获取的消息。通过使用 ImailFolder.Append(MimeMessage)
可以实现这一点,但正如方法签名所暗示的那样,它需要一个 MimeMessage
,而 IMessageSummary
则不需要。
有什么想法吗?
最佳答案
首先,让我澄清一下:
IMessageSummary
中包含的信息实际上是关于消息的只读元数据。 Body
和 Attachments
属性不是完整的 MIME 部分,它们只是关于 MIME 部分的元数据。
好吧,现在这已经不成问题了:
基础 IMAP 协议(protocol)不支持您想做的事情。您需要做的是下载完整邮件,对邮件进行更改,将修改后的邮件附加到 IMAP 文件夹,然后删除旧(原始)邮件。
如果服务器支持 REPLACE
扩展,则 APPEND + STORE FLAGS\Deleted + EXPUNGE 操作可以成为原子操作,但其要点仍然相同,因为您仍然需要下载消息,修改它,然后将其上传回服务器。
我认为这涵盖了您之前的 stackoverflow 问题:How to move an attachment from one e-mail to another using MailKit/MimeKit?
(包括上下文,以防阅读本文的任何人有兴趣了解解决方案)
但是这个问题与旧问题不同,因为您询问是否有更有效的方法可以在 IMAP 服务器上的邮件中添加或删除 MIME 部分,无需 必须先在本地下载。
恰好有一个名为 CATENATE 的 IMAP 扩展。这样就可以实现这一点。
不幸的是,我还没有时间在 MailKit 中实现此扩展,并且我不确定它是否真的值得这样做,因为无论如何,很少有 IMAP 服务器实际上支持此扩展。
也就是说,如果添加此扩展有值(value)的话,我愿意将其添加到我的 TODO 列表中。
您可以通过检查以下内容来检查您的服务器是否支持此扩展:
if (client.Capabilities.HasFlag (ImapCapabilities.Catenate)) {
Console.WriteLine ("Yes! The IMAP server supports the CATENATE extension!");
}
如果没有(我怀疑没有),那么您唯一的选择就是下载邮件,删除部分内容,然后重新上传。
关于c# - 是否可以使用 MailKit 修改/附加邮件而无需下载整个邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69401376/