使用 anmar.SharpMimeTools 解析 MIME 消息

Posted

技术标签:

【中文标题】使用 anmar.SharpMimeTools 解析 MIME 消息【英文标题】:Parsing a MIME-Message using anmar.SharpMimeTools 【发布时间】:2012-02-24 00:20:18 【问题描述】:

我正在尝试使用SharpMimeTools 和来自Hunny Software 的一些示例Mime 消息来解析MIME 消息。我设法从一个文件中创建了一条新消息并将解码的正文保存到一个文件中(它是一个 png 图像),但是创建的文件已损坏。大多数示例文件和我提取的文件看起来相同,但也有区别。

文件可以在这里找到:

作为文本文件的原始消息:m0013.txt 原始PNG-图片:Blueball_original.png 提取的损坏的 PNG 图片:Blueball.png

文件十六进制视图的摘录: 原文:

89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52
00 00 00 1b 00 00 00 1b 08 03 00 00 00 ba 0a 04
67 00 00 03 00 50 4c 54 45 ff ff ff 00 00 08 00
00 10 00 00 18 00 00 00 00 08 29 00 10 42 00 10
4a 00 08 31 00 10 52 08 21 73 08 29 7b 08 29 84
08 21 6b 00 18 5a 00 08 39 08 21 63 10 39 9c 18
42 a5 18 42 ad 18 42 b5 10 39 a5 10 31 94 00 18

提取:

3f 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52
00 00 00 1b 00 00 00 1b 08 03 00 00 00 3f 0a 04   
67 00 00 03 00 50 4c 54 45 3f 3f 3f 00 00 08 00   
00 10 00 00 18 00 00 00 00 08 29 00 10 42 00 10  
4a 00 08 31 00 10 52 08 21 73 08 29 7b 08 29 3f
08 21 6b 00 18 5a 00 08 39 08 21 63 10 39 3f 18
42 3f 18 42 3f 18 42 3f 10 39 3f 10 31 3f 00 18

...最后,这是我正在使用的代码:

public void MIMETest()

    FileStream fileStream = new FileStream(@"D:\m0013.txt", FileMode.Open);
    SharpMimeMessage m = new SharpMimeMessage(fileStream);
    fileStream.Close();
    parseMessage(m);            


public void parseMessage(SharpMimeMessage message)

    if (message.IsMultipart)
    
        foreach (SharpMimeMessage subMessage in message)
        
            parseMessage(subMessage);
        
    
    else
    
        System.IO.File.WriteAllText(@"D:\Extracts\" + message.Name,
            message.BodyDecoded, message.Header.Encoding);
    

你对如何解决这个问题有什么建议吗?

【问题讨论】:

FWIW,您可能应该查看MimeKit,因为它解析消息的速度比 SharpMimeTools 快 75 倍。它也更加健壮且符合标准。 【参考方案1】:

您正在使用WriteAllText 写出二进制文件。您不能指望使用文本编写器写出 PNG。

WriteAllText 只能用于文本内容类型。对于其他内容类型,您应该使用WriteAllBytes

此外,在您的代码中,您正在使用传输时使用的原始文本编码来编写文本。无论原始文件是什么,您可能只想使用 UTF-8。

【讨论】:

谢谢!我现在正在使用:System.IO.File.WriteAllBytes(@"D:\Extracts\" + message.Name, StrToByteArray(message.BodyDecoded));public static byte[] StrToByteArray(string str) System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); return encoding.GetBytes(str); 编写文件,但文件仍然损坏。我还在写错误的消息吗? (希望评论的格式有效...) @Birgit_B,不,这是完全错误的,你不能假设 PNG 是 UTF-8 字符串,它不会是,因为它根本不是字符串。你想要像SharpMimeMessage.GetBytes 这样的东西,但没有。请尝试DumpBody 获取附件。或者尝试附件集合。 谢谢! SharpMimeMessage.DumpBody() 做到了!

以上是关于使用 anmar.SharpMimeTools 解析 MIME 消息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 nant 脚本解压缩文件? Nant 解压缩任务显示一些错误?

Draco使用笔记——图形解压缩

如何使用 Objective-C 解压缩/解压缩,包括单个文件检索

压缩与解压缩

压缩命令解压缩命令

使用 -jr 标志创建的 zip 在 macOS 上的解压缩方式不同,当双击与运行解压缩时