在 MailKit 中,如何获取邮件的原始表示形式?

In MailKit, how do I get the message's raw representation?

我正在使用 MailFolder.Fetch 通过 IMAP 下载消息,然后使用 MailFolder.GetBodyPart 获取相关正文部分。

除了处理过的信息之外,是否有可能获得 MIME 消息的原始表示形式?

代码:

var query = CreateSearchQuery(startDate, endDate);
await mailFolder.OpenAsync(FolderAccess.ReadOnly);
var results = await mailFolder.SearchAsync(SearchOptions.All, query);
var messageSummaries = await mailFolder.FetchAsync(results.UniqueIds, DownloadFlags);

后来我通过 运行 下载消息部分,找到 html 和普通部分并下载它们,如 this 问题所示(我只下载了部分不是 IsAttachment==true).

如果您只下载单独的 MIME 部分,将无法获得完整邮件的原始表示(除非您下载 所有 部分并重建邮件),但您 可以 获取您下载的每个 MIME 部分的原始表示,方法是使用您返回的每个 MimeEntity 上存在的 WriteTo() 方法来自 MailFolder.GetBodyPart().

如果您想要完整消息的原始表示,那么获得它的最简单方法是使用 MailFolder.GetMessage(),然后在您创建的 MimeMessage 上调用 WriteTo() 方法返回或者您可以通过以下方式使用 MailFolder.GetStream()

var raw = folder.GetStream (uid, string.Empty);

我建议,如果您知道自己需要完整的原始消息,最好避免先下载单个部分,因为这只会浪费带宽。如果您决定使用 GetStream(),您可以将流提供给 MimeMessage.Load() 并取回已解析的 MimeMessage 对象。

注意:如果使用WriteTo()方法,如果要读取原始消息或正文部分数据,请不要忘记在流中寻回0。

最后,我需要的不一定是特定消息的原始数据,而是我从服务器得到的数据就是呈现给用户的数据的证据,实际上WriteTo不是'不这样做是因为它将加载到 C# 对象中的数据转换回字符串。

我打算打开库并将 ImapStream 重定向到一个将数据复制到另一个流的新类型,但幸运的是 Jeff 已经想到了这一点并实现了注入 ProtocolLogger 已经这样做了。

希望对以后的人有所帮助。