是否可以使用 MailKit modify/Append 邮件而不下载整封邮件?

Is it possible to modify/Append a mail without downloading the whole message by using MailKit?

想象一个支持 400-500 mb 范围内附件的邮件服务器。或者想象一个 30 MB 的邮件,但有 10 个附件 - 如果我们每次要从中删除附件时都必须下载整个邮件,那么 GC 必须处理 300 MB 的开销。

IMailFolder.GetMessage 很好,但在这种情况下,最好使用 IMailFolder.Fetch.

遗憾的是,我没有看到可以向 IMessageSummary 添加内容的方法(在我的例子中,我想添加附件或删除附件)和“修改“我通过更改在服务器上获取的那条消息。这可以通过使用 ImailFolder.Append(MimeMessage) 来实现,但正如方法签名所暗示的那样,它需要一个 MimeMessage,而 IMessageSummary 不是。

有什么想法吗?

首先,让我澄清一下:

IMessageSummary 中包含的信息实际上是关于消息的只读 元数据 BodyAttachments 属性不是完整的 MIME 部分,它们只是关于 MIME 部分的元数据

好的,既然那是不碍事的:

基本 IMAP 协议不支持执行您想执行的操作。您需要做的是下载完整邮件,对邮件进行更改,将修改后的邮件附加到 IMAP 文件夹,然后删除旧(原始)邮件。

如果服务器支持 REPLACE 扩展,那么 APPEND + STORE FLAGS \Deleted + EXPUNGE 操作可以是原子的,但它的要点仍然是一样的,你仍然需要下载邮件,修改,然后上传回服务器。

我认为这涵盖了您之前在此处提出的 Whosebug 问题:

(包括它作为上下文,以防阅读本文的任何人有兴趣了解该解决方案)

但是这个问题与旧问题的不同之处在于,您询问的是是否有更有效的方法在 IMAP 服务器上的邮件中添加或删除 MIME 部分无需先在本地下载。

恰好有一个名为 CATENATE 的 IMAP 扩展,它允许这样做。

不幸的是,我还没有时间在 MailKit 中实现这个扩展,我不确定它是否真的值得做,因为无论如何很少有 IMAP 服务器真正支持这个扩展.

就是说,如果添加它有价值,我愿意将它添加到我的 TODO 列表中。

您可以检查您的服务器是否支持此扩展,方法是:

if (client.Capabilities.HasFlag (ImapCapabilities.Catenate)) {
    Console.WriteLine ("Yes! The IMAP server supports the CATENATE extension!");
}

如果不是(我怀疑不是),那么您唯一的选择是下载邮件,删除部分内容,然后重新上传。