[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 에 포함되어 있다.