Openpop.NET恢复特定文件夹的附件

时间:2011-08-05 07:29:27

标签: vb.net pop3 openpop

我正在尝试检索电子邮件附件并使用以下代码将其保存到文件系统中的特定目录。

Dim objMail As Message = New Message(Encoding.ASCII.GetBytes(strMessage))

For Each att In objMail.FindAllAttachments()
    Dim Stream as FileStream = New FileStream("D:\XX\" & att.FileName.ToString(), 
        FileMode.Create)
    Dim BinaryStream As New BinaryWriter(Stream)
    BinaryStream.Write(BitConverter.ToString(att.Body))
    BinaryStream.Close()
Next

我也试过att.GetBodyasText()

使用此代码,我可以将附件文件保存在所需的文件夹中。但是在打开文件时,我收到错误

  

文件格式不正确或未正确解码。

我是MIME编码/解码的新手。

1 个答案:

答案 0 :(得分:8)

我是OpenPop.NET的开发人员。

用于实例化Message类的代码存在多个问题:

  1. strMessage内容来自哪里?
  2. 你怎么知道它只用ASCII编码?
  3. 这两个主要问题可能会产生重大影响。 你不应该使用字符串来包含消息,而应该使用原始字节!

    例如(在C#中):

    byte[] byteMessage = someFileStream.ReadToEnd();
    Message message = new Message(byteMessage);
    

    通过这种方式,您不会通过对字节使用错误的编码来销毁消息。通常,电子邮件将包含一个标题,告诉您如何将字节解码为字符串,这就是OpenPop Message类将为您做的事情。

    现在让我解释一下附件。附件通常是原始字节,例如PNG图片是PNG图片阅读器将理解的一些字节。要使PNG图片阅读器理解图片,必须将附件原始字节保存到文件中。您可以使用att.Body获取原始字节。

    还有一些附件,其中原始字节没有意义 - 例如,在BASE64中编码的文本附件对于文本阅读器程序不是很有用,并且这样的附件必须在保存之前转换为文本。您可以使用att.GetBodyAsText()获取文本。

    你正在做的是获取附件的原始字节,然后使用BitConverter将其转换为十六进制数字 - 这是我无法理解的。相反,你应该改变你的:

    BinaryStream.Write(BitConverter.ToString(att.Body)) 
    

    BinaryStream.Write(att.Body)
    

    如果您的附件是图片或更复杂的文件。

    我希望这可以帮助您解决问题。