0

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

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()

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

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

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

4

1 回答 1

8

我是 OpenPop.NET 的开发人员。

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

  1. strMessage 内容来自哪里?
  2. 你怎么知道它只用 ASCII 编码?

这是两个可能会产生重大影响的主要问题。您不应该使用字符串来包含消息,而应该使用原始字节!

例如(在 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)

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

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

于 2011-08-05T09:54:30.533 回答