c# - 是否可以使用 MailKit 修改/附加邮件而无需下载整个邮件?

标签 c# .net-core email-attachments mailkit mimekit

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

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

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

有什么想法吗?

最佳答案

首先,让我澄清一下:

IMessageSummary 中包含的信息实际上是关于消息的只读元数据BodyAttachments 属性不是完整的 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/

相关文章:

python - 解密电子邮件中附加的 gpg 文件 (file.pgp)

azure - Service Fabric 负载平衡超时

linq - .net core - 将函数列表与单个函数组合或合并到单个函数

c# - UIImageView.Image 使用 MonoTouch 发送邮件附件

c# - 如何使用 OpenPGP 从一个 blob 解密到另一个

image-manipulation - 使用 .NET Core 调整图像大小?

email - 使用 Gmail API 发送的邮件中缺少附件,但仅适用于收件人

c# - 使用 C# 进行动态 SQL Server 访问的建议

c# - 为 "garage"软件项目招募虚拟团队的最佳方式?

c# - WinForms MDI 子窗体