3

我正在使用 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 和普通部分并下载它们,如这个问题所示(只有我下载不是的部分IsAttachment==true)。

4

2 回答 2

3

如果您只下载单个 MIME 部分,则无法获得完整消息的原始表示(除非您下载所有部分并重建消息),但您可以获得每个 MIME 部分的原始表示使用WriteTo()MimeEntityMailFolder.GetBodyPart().

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

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

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

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

于 2015-10-15T13:25:57.490 回答
0

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

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

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

于 2015-10-19T08:09:56.200 回答