이메일 Base64 디코딩에서...
글쓴이: 익명 사용자 / 작성시간: 수, 2002/10/23 - 11:30오전
안녕하세요
간단한 SMTP 를 만들었습니다.
메일을 base64 를 이용해서 디코딩하게 되있는데 ( 사실은 제가
만든것이 아니라서 잘 모름니다. ^^; )
몇가지 질문이 있습니다
1. base64 로 모든 인코딩된 메일을 디코딩 가능합니까?
2. 간혹가다가 제목을 디코딩 못하고 아웃룩에서 속성으로 보면
제목 부분이 아래와 같고..
Subject =?ks_c_5601-1987?q?[=B1=A4=B0=ED]
40=B8=B8_=B5=B9=C6=C4=B1=E2=B3=E4_=B0=A8=BB=E7=C0=CC=BA=A5=C6=AE
(=C0=CE=C2=AF)?=
제꺼 Base64 디코딩 했을때는
P8A?|픶克
Forums:
Re: 이메일 Base64 디코딩에서...
base64는 메일을 보내기 위한 디코딩 방법 중에 하나입니다. 즉,
base64로 인코딩 된것만 base64로 디코딩할 수 있습니다. 물론, 이것은
MIME 헤더에 어떤 형식으로 인코딩 되었다는 것이 나옵니다. 일반적으로
는 base64를 많이 쓰지만, 가끔씩 quota-print 등으로 인코딩된 것들도
있습니다. 예로드신 제목의 경우 quota-print 로 인코딩이 되어있군요
Subject =?ks_c_5601-1987?q?[=B1=A4=B0=ED]
40=B8=B8_=B5=B9=C6=C4=B1=E2=B3=E4_=B0=A8=BB=E7=C0=CC=BA=A5=C6=AE
(=C0=CE=C2=AF)?=
먼저 제목을 인코딩하는 것은 앞의 =? 와 뒤의 ?= 를 떼어냅니다. 그리고
문자 코드 ks_c_5601-1987 가 있고 ?q? 라는 부분이 있습니다. 여기가
q 면 quota-print 라는 뜻이고 b 면 base64라는 뜻입니다. 즉
quota-print 로 디코딩 하시면 잘 나옵니다. ^^
이제 나머지 부분은 위의 형식에 따라서 다시 인코딩해주면 됩니다.
본문의 인코딩은 본문전의 MIME 헤더에서 발견할 수 있습니다.
quota-print 나 base64는 어려운 인코딩 방법이 아니므로 금방
구현하실 수 있을것입니다. 그것보다는 MIME 파싱에 더 신경을
쓰시길... 그럼 고운 하루...
리눅스 wrote..
안녕하세요
간단한 SMTP 를 만들었습니다.
메일을 base64 를 이용해서 디코딩하게 되있는데 ( 사실은 제가
만든것이 아니라서 잘 모름니다. ^^; )
몇가지 질문이 있습니다
1. base64 로 모든 인코딩된 메일을 디코딩 가능합니까?
2. 간혹가다가 제목을 디코딩 못하고 아웃룩에서 속성으로 보면
제목 부분이 아래와 같고..
Subject =?ks_c_5601-1987?q?[=B1=A4=B0=ED]
40=B8=B8_=B5=B9=C6=C4=B1=E2=B3=E4_=B0=A8=BB=E7=C0=CC=BA=A5=C6=AE
(=C0=CE=C2=AF)?=
제꺼 Base64 디코딩 했을때는
P8A?|픶克
Re^2: 감사합니다 .. 그런데..
감사합니다.
그런데 quoted-print 디코딩 하는 함수 소스를 찾으려고 했는데
찾질 못하겠습니다.
고글도 찾아 봣는데 펄은 많이 있더라구요
# perl -e 'use MIMEQuotedPrint; print decode_qp("haha")';
C 로 된 소스를 가지고 있거나 링크가 있으면 가르쳐 주시기 바랍니다.
Re^3: 감사합니다 .. 그런데..
미력 하지나마 몇자 꺼적여 봅니다..
혹시 도움이 된다면 기뻐~~~ 할꼬야. ~~
#include
int main (int argc, char *argv []) {
Quoted_parse (argv [1], argv [2]);
exit (0);
}
int Quoted_to_string (char *obuf, char *ibuf) {
while (*ibuf) {
if (*(ibuf) == '=' && *(ibuf + 1) == 0x20 && *(ibuf
+ 2) == 0x0a) {
ibuf+=3;
continue;
}
if (*ibuf == '=') {
*obuf = (*(ibuf + 1) - (*(ibuf + 1)
> '9' ? 'A'-'9' - 1 0) - '0') * 16;
*obuf += *(ibuf + 2) - (*(ibuf + 2)
> '9' ? 'A'-'9' - 1 0) - '0';
ibuf += 2;
obuf++;
}
else *obuf++ = *ibuf;
ibuf++;
}
*obuf = '\0';
return 0;
}
int Quoted_parse (char *in, char *out) {
FILE *rp;
FILE *wp;
char src [256 + 1];
char des [256 + 1];
if ((rp = fopen (in, "r")) != NULL) {
wp = fopen (out, "w");
memset(des, 0, sizeof (des));
memset(src, 0, sizeof (src));
while (fgets (src, 256, rp) != NULL) {
Quoted_to_string (des, src);
fprintf (wp, "%s", des);
}
fclose (rp);
fclose (wp);
}
return (0);
}
이상 입니다. ~~~
댓글 달기