컴퓨터과학/Microsoft 2013.09.24 17:37

닷넷에서 메일 전송시 첨부파일 명이 깨지는 현상이 간혹 발생한다.

이유는 대충 아래와 같은데 (더 있으면 댓글로 알려주세요...)

1. 파일명이 수신 메일서버가 지원하지 않는 문자셋으로 인코딩 된 경우

2. 파일명이 non-ASCII 문자를 포함하면서 파일명을 UTF-8로 인코딩한 길이가 42바이트 이상인 경우


1의 경우는 문자셋을 지정하여 보내면 되는데...참 난감한 것이..

수신자의 메일서버가 어떤 문자셋을 지원하는지 알수가 없는 것이다.


그러나 일반적으로 첨부파일명을 EUC-KR로 인코딩하면 한글 첨부파일을 주고받는데에는 무리가 없다.

attatchment.NameEncoding = System.Text.Encoding.GetEncoding("euc-kr"); // euc-kr 인코딩


참고로 아웃룩으로 발송시 CP949로 인코딩 되는 것을 확인하였는데..

이는 발송자의 운영체제(윈도우)에서 사용하는 기본 문자셋을 이용하여 인코딩하는 것으로 보인다. 


attatchment.NameEncoding = System.Text.Encoding.Default; // 현재 운영체제의 기본 인코딩

attatchment.NameEncoding = System.Text.Encoding.GetEncoding(949); // CP949 인코딩


2의 경우는 좀 답답하다.

.NET Framework 4.0의 버그인데 파일명이 이런식으로 보이는 경우다.

보여지는 파일명

=?ks_c_5601-1987?Q?130917_=C0=CC=BD=C3=BD= BA=C5=DB?= =?ks_c_5601-1987?Q?.xls?=


메일에서의 소스

Content-Type: application/vnd.ms-excel;

 name="=?utf-8?B?PT9rc19jXzU2MDEtMTk4Nz9RPzEzMDkxN189QzA9Q0M9QkQ9QzM9QkQ9?=\

\

 =?utf-8?B?QkE9QzU9REI/PQ0KID0/a3NfY181NjAxLTE5ODc/UT8ueGxzPz0=?="

Content-Transfer-Encoding: base64

Content-Disposition: attachment


파일명의 인코딩이 두번 된 것인데 위의 경우는 CP949로 인코딩 된 후 그게 다시 한 번 UTF-8로 인코딩 된 경우였다.


2번 타이틀에 쓴것 처럼 파일명에 non-ASCII 문자가 포함하고 있으면서 파일명을 UTF-8로 인코딩한 길이가 42바이트가 넘어가면 UTF-8로 한번 더 인코딩하는 치명적인 버그다.

http://support.microsoft.com/kb/2402064/en-us


아래 참조에 공식 패치가 있으니 다운받아 설치해야한다.

https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=31723


클라이언트에 해당 기능이 포함되어 이미 배포되었다면 추후 패치시 굉장히 곤란한 경우로...-_-

.NET의 메일 발송을 이용할 것이라면 가능하면 .NET 3.5로 개발하는 것을 추천한다.





posted by 연식킴

댓글을 달아 주세요