Openpop.NET извлекает вложение в определенную папку - PullRequest
0 голосов
/ 05 августа 2011

Я пытаюсь получить вложение электронной почты и сохранить его в определенном каталоге в файловой системе, используя приведенный ниже код.

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

Используя этот код, я могу сохранить файл вложения в нужной папке. Но при открытии файла я получаю сообщение об ошибке L

Файл имеет неправильный формат или неправильно декодирован.

Я новичок в кодировании / декодировании MIME.

1 Ответ

8 голосов
/ 05 августа 2011

Я разработчик OpenPop.NET.

Существует несколько проблем с кодом, который вы используете для создания экземпляра класса Message:

  1. Откуда исходит содержимое strMessage?
  2. Откуда вы знаете, что он закодирован только в ASCII?

Это две основные проблемы, которые, вероятно, будут иметь большое значение. Вы НЕ должны использовать строку для хранения сообщения, вместо этого вы должны использовать необработанные байты!

Например (в C #):

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

Таким образом, вы не уничтожите сообщение, используя неправильную кодировку байтов. Как правило, электронное письмо содержит заголовок, в котором указывается, как декодировать байты в строку, что и будет делать класс сообщений OpenPop.

Теперь позвольте мне объяснить вложения. Вложения обычно представляют собой необработанные байты, например, изображение PNG - это несколько байтов, которые распознает устройство чтения PNG-изображений. Чтобы программа чтения изображений PNG могла понять картинку, необработанные байты вложений должны быть сохранены в файл. Вы можете получить необработанные байты, используя att.Body.

Существуют также вложения, в которых необработанные байты не имеют смысла - например, текстовое вложение, закодированное в BASE64, не очень полезно для программы чтения текста, и такое вложение необходимо преобразовать в текст перед сохранением. Вы можете получить текст, используя att.GetBodyAsText ().

Что вы делаете, это берете необработанные байты для вложения, а затем используете BitConverter для преобразования его в шестнадцатеричные числа - что я не могу понять. Вместо этого вы должны изменить:

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

до

BinaryStream.Write(att.Body)

на случай, если ваше вложение - изображение или более сложный файл.

Надеюсь, это поможет решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...