2011-08-05 2 views
0

전자 메일 첨부 파일을 검색하고 아래 코드를 사용하여 파일 시스템의 특정 디렉토리에 저장하려고합니다. 나는 또한이 코드를 사용하여Openpop.NET 특정 폴더에 첨부물을 다시 검색

att.GetBodyasText()을 시도

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 

내가 원하는 폴더에 첨부 파일을 저장할 수 있어요. 그러나 파일을 여는 동안 오류가 발생합니다 ->파일이 올바르지 않습니다. 형식이 잘못되었거나 올바르게 디코딩되지 않았습니다.

저는 MIME 인코딩/디코딩을 처음 사용합니다. 이 문제를 해결할 수 있도록 도와 주시겠습니까?

정말 시급합니다.

답변

8

나는 OpenPop.NET을 사용하고 있습니다. strMessage 내용이에서오고

  1. :

    는 메시지 클래스의 인스턴스를 사용하는 코드 여러 문제가 있습니까?

  2. ASCII로만 인코딩되었음을 어떻게 알 수 있습니까?

다음은 큰 차이를 만들 수있는 두 가지 주요 문제입니다. 메시지를 포함하기 위해 문자열을 사용하지 않아야합니다. 대신 원시 바이트를 사용해야합니다!

예를 들어 (C에서 #) :이 방법으로

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

, 당신은 바이트에 잘못된 인코딩을 사용하여 메시지를 파괴하지 않습니다. 일반적으로 전자 메일에는 바이트로 디코드하여 문자열로 변환하는 방법을 알려주는 헤더가 포함되어 있습니다. 이는 OpenPop Message 클래스가 수행하는 것입니다.

이제 첨부 파일을 설명하겠습니다. 첨부 파일은 일반적으로 원시 바이트입니다. 예를 들어 PNG 그림은 PNG 그림 리더가 이해할 수있는 일부 바이트입니다. PNG 그림 판독기가 그림을 이해하려면 첨부 파일 원시 바이트를 파일에 저장해야합니다. att.Body를 사용하여 원시 바이트를 가져올 수 있습니다.

원시 바이트가 의미가없는 첨부 파일도 있습니다. 예를 들어 BASE64로 인코딩 된 텍스트 첨부 파일은 텍스트 판독기 프로그램에별로 유용하지 않으며 이러한 첨부 파일을 저장하기 전에 텍스트로 변환해야합니다. att.GetBodyAsText()를 사용하여 텍스트를 가져올 수 있습니다.

첨부 파일의 원시 바이트를 가져온 다음 BitConverter를 사용하여 16 진수로 변환합니다. 의미는 없습니다. 대신, 당신은 당신을 변경해야합니다 :

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

첨부 파일은 사진이나 좀 더 복잡한 파일 인 경우

BinaryStream.Write(att.Body) 

합니다.

귀하의 문제에 도움이되기를 바랍니다.

+0

답장을 보내 주셔서 감사합니다 .. 데이터베이스에서 메일을 가져오고 메일 첨부 파일을 검색하려고합니다. 데이터베이스 메일 내용은 varbinary 데이터 유형에 저장됩니다. 나는 그 메일 내용을 일부 처리를 위해 문자열로 변환하고 다시 첨부 파일을 얻기 위해 ASCIIEncoding.ASCII.getBytes()를 사용하여 byte()로 변환합니다. 또한 att.GetBodyAsText(), att.Body를 BinaryWriter의 params로 시도했습니다 . 그러나 여전히 오류는 동일합니다 !! 디코딩하지 제대로 열려 수출 된 PDF 문서 .. 제발 도와주세요. –

+0

또한 한가지 더 .. 적절한 형식으로 PlainText 및 HTML MessagePart 받고 있어요 .. 나는 또한 att.SaveToFile (새로운 FileInfo ("파일 경로") 시도했다) 첨부 파일을 저장하려면 ..하지만 개선 없음 –

+1

누가 데이터베이스에 이메일을 추가 했습니까? 전자 메일 (원시) _CANNOT_은 (는) 의미가 없기 때문에 문자열로 저장됩니다. 대신 BLOB (Binary Large OBject) 또는 원시 바이트 저장을 용이하게하는 것으로 저장해야합니다. ASCII.getBytes()를 사용하는 경우 전체 전자 메일이 ASCII로되어 있는지 확인해야합니다. 그렇지 않으면 잘못된 바이트가 생성되고 나중에 OpenPop에서 이러한 바이트를 찾아내어 잘못된 첨부 파일을 만드는 데 어려움을 겪습니다. 나는 이것이 당신의 주된 문제라고 생각합니다. 간단히 말하면 : OpenPop에 잘못된 인코딩으로 인해 모든 컨텐츠가 파괴되었을 수있는 이메일을 보내고 있습니다. – foens