C# 在MailKit中,如何获取消息';什么是原始表示?

C# 在MailKit中,如何获取消息';什么是原始表示?,c#,.net,imap,mailkit,C#,.net,Imap,Mailkit,我正在使用MailFolder.Fetch通过IMAP下载邮件,然后使用MailFolder.GetBodyPart获取相关的身体部位 除了已处理的信息之外,是否还可以获取MIME消息的原始表示 代码: 后来,我通过运行各个部分来下载消息,找到html和普通部分,并按问题所示下载它们(只有我下载的部分不是IsAttachment==true)。如果只下载单个MIME部分,就不可能获得完整消息的原始表示形式(除非下载所有部分并重新构建消息),但您可以通过使用WriteTo()方法获得下载的每个MI

我正在使用MailFolder.Fetch通过IMAP下载邮件,然后使用MailFolder.GetBodyPart获取相关的身体部位

除了已处理的信息之外,是否还可以获取MIME消息的原始表示

代码:


后来,我通过运行各个部分来下载消息,找到html和普通部分,并按问题所示下载它们(只有我下载的部分不是
IsAttachment==true
)。

如果只下载单个MIME部分,就不可能获得完整消息的原始表示形式(除非下载所有部分并重新构建消息),但您可以通过使用
WriteTo()
方法获得下载的每个MIME部分的原始表示,该方法存在于从
MailFolder.GetBodyPart()
返回的每个
MimeEntity

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

var raw = folder.GetStream (uid, string.Empty);
我建议,如果您知道您需要完整的原始消息,最好先避免下载单个部分,因为这只会浪费带宽。如果您决定使用
GetStream()
,您可以将流馈送到
MimeMessage.Load()
,然后获取解析后的
MimeMessage
对象


注意:如果使用
WriteTo()
方法,如果要读取原始消息或身体部位数据,请不要忘记在流中查找回0。

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

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


希望这对将来的人有所帮助。

谢谢,GetMessage是否总是下载带有附件的整个邮件?是否可以在不带附件的情况下下载邮件,并且仍然使用WriteTo?是否可以在获取调用后获取数据?仅获取邮件头?GetMessage()将下载包括附件在内的整个邮件。获取不带附件的邮件的唯一方法是按您当前的方式下载各个身体部位,但这意味着您将无法获得邮件的完整原始表示,因为完整原始邮件将包含附件。您可以请求ind在
Fetch()
调用中有两个头,但您不能通过这种方式轻松请求所有头。我建议使用
GetStream(uid,“HEADER”)
获取原始消息头,然后使用
HeaderList.Load()解析这些头
如果您需要解析版本。非常感谢,我只需下载整个邮件并使用EncodeTo即可。非常感谢您提供了这个很棒的高质量库。
var raw = folder.GetStream (uid, string.Empty);