본문 바로가기

James Server v3/Mime4j

[Mime4J] DecoderUtil 의 Base64 parser 문제.


--------------------------------------------------------------------------------------------------------------------------------------------

MIME [wiki]

MIME에서 정의하는 전자 메일 base64는 임의의 바이트 스트림을 화면에 표시할 수 있는 ASCII 문자들로 바꾸는 인코딩 방식을 말한다. 이 인코딩은 인터넷 전자 메일을 전송할 때 MIME의 content transfer encoding

의 하나로 정의된다.

 인코딩된 문자열은 알파벳 대소문자와 숫자, 그리고 "+", "/" 기호 64개로 이루어지며, "="는 끝을 알리는 코드로 쓰인다.

베이스64의 정확한 규격은 RFC 1421, RFC 2045에 정의된다. 연속된 8비트 바이트를 인코딩하도록 정의되어 있으며, 이는 대부분 시스템에서 파일의 정의와 들어맞는다. 베이스64코딩을 거친 결과물은 원본보다

대략 4/3 정도 크기가 늘어나게 되며, 보통 의미없어 보이는 문자열이 나열된 형태가 된다.


데이터를 베이스64로 바꾸는 과정은 다음과 같다.

우선 24비트 버퍼에 위쪽(MSB)부터 한 바이트씩 세 바이트를 집어넣는다.

그리고 남은 바이트가 3바이트 미만이라면, 버퍼의 남은 부분은 0으로 채워넣게 된다.

그리고, 버퍼의 위쪽부터 6비트[1]씩 잘라 그 값을 읽어, 다음에 정렬된 64개 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"의

문자 중에서 읽은 값 번째 문자를 골라 출력한다.


     만약 입력된 바이트가 하나라면 출력 중 두 개만이 사용되고 나머지 둘은 "="으로 패딩되며,

     입력된 바이트가 둘이라면 출력 중 세 개 만이 사용되고 나머지 하나는 "="으로 패딩되게 된다.


이것은 원본으로 되돌릴 때 원본에는 없던 비트가 생기는 것을 방지하기 위함이다.

이 과정은 입력 데이터가 끝날 때까지 반복하면 인코딩이 된다.

--------------------------------------------------------------------------------------------------------------------------------------------


ㅁ 내용은 저렇고 문제가 되는 부분은 아래와 같이 디코딩을 하지 않고 mime4j 에서 제공하는

    DecoderUtil 은 각 라인에 따른 디코딩만 하고 있다.


ex1)

 마지막을 제외하고 끝 문자열에 '=' 이 포함되어 있지 않다. 

 즉 모든 문자열을 더한 후 디코딩을 한다. 

Subject: =?utf-8?B?PCjsoJUp67Cc7ZaJPuOInOydtOymiO2MjO2BrCDqtazshJzsnKTri5jsnLzroZzrtoDthLAg?=
 =?utf-8?B?44ic7Zy066GsIOy1nOydgOyjvOuLmOyXkOqyjCDsoIQu7J6QLuyEuC7quIgu6rOELuyCsC7s?=
 =?utf-8?B?hJzqsIAg64+E7LCp7ZWY7JiA7Iq164uI64ukLg==?=


ex2) 더 현란한...

  얘는 3줄을 만들고 각자 디코딩 후 더해야 한다.

   W+yVveyGjeuplOydvF1b64KY7Jio7IaM7ZSE7Yq4XSAo7KO8KeyLuOydtOuFuA==

   7IqkIOq3uOujueybqOyWtCDsi5zsiqTthZw=

   IOq1rOy2lSDqs4Tslb3shJwg7LSI7JWI

Subject: =?utf-8?B?W+yVveyGjeuplOydvF1b64KY7Jio7IaM?=
 =?utf-8?B?7ZSE7Yq4XSAo7KO8KeyLuOydtOuFuA==?=
 =?utf-8?B?7IqkIOq3uOujueybqOyWtCDsi5zsiqTthZw=?=
 =?utf-8?B?IOq1rOy2lSDqs4Tslb3shJwg7LSI7JWI?=


ㅁ 결국 모든 문자의 끝에 '=' 가 있지 않는한 모두 더하고 디코딩하면 된다.

   org.apache.james.mime4j.codec.DecoderUtil 을 사용 할 수 가 없고

   헤더 제목은 com.xxxx.james.parser.utils.MultiLineDecoderUtil 을 사용한다.


 

 -  MultiLineDecoderUtil 는 xxxxxxx-james-server-parser-1.0.0-SNAPSHOT.jar 에 포함되어 있다.