Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用anmar.SharpMimeTools解析MIME消息_C#_.net_Parsing_Email_Mime - Fatal编程技术网

C# 使用anmar.SharpMimeTools解析MIME消息

C# 使用anmar.SharpMimeTools解析MIME消息,c#,.net,parsing,email,mime,C#,.net,Parsing,Email,Mime,我正在尝试解析一条MIME消息,使用和来自的一些MIME消息示例。我设法从一个文件创建了一条新消息,并将解码后的正文保存到一个文件(它是一个png图像),但创建的文件已损坏。大多数情况下,示例文件和我提取的文件看起来是一样的,但有区别 可在此处找到这些文件: 将原始邮件作为文本文件保存: 原始PNG图片: 提取的损坏PNG图片: 文件的十六进制视图摘录: 原件: 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00 1b 00 00

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

可在此处找到这些文件:

  • 将原始邮件作为文本文件保存:
  • 原始PNG图片:
  • 提取的损坏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);
    }
}

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

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

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


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

谢谢!我现在使用以下命令编写文件:
System.IO.file.writealBytes(@“D:\Extracts\”+message.Name,strobytearray(message.BodyDecoded))
公共静态字节[]strobytearray(string str){System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding();返回encoding.GetBytes(str);}
但仍有损坏的文件。我还是写错了吗?(希望评论的格式有效…@Birgit_B,不,这完全是错误的,你不能假设PNG是UTF-8字符串,因为它根本不是字符串。您需要类似于
SharpMimeMessage.GetBytes的内容,但没有。请尝试
DumpBody
查找附件。或者尝试附件集合。谢谢<代码>SharpMimeMessage.DumpBody()
成功了!FWIW,您可能应该研究一下,因为它比SharpMimeTools解析消息的速度快75倍。它也更健壮,更符合标准。