Trouble Shooting

[업무자동화] Python_한글 파일명 메일 첨부 오류 해결 방법

yeit 2025. 8. 20. 14:02
728x90

 

1. 문제

한글 파일명으로 된 PDF를 메일에 첨부하여 발송할 경우, 수신자에게 첨부 파일명이 깨지거나 인식할 수 없는 문자로 표시되는 문제 발생. (UTF-8 인코딩 값이 그대로 노출)

 

 

2. 문제 원인

2-1. 메일 프로토콜의 문자 인코딩 한계

메일 헤더는 기본적으로 ASCII 문자만을 안전하게 처리하도록 설계

한글과 같은 비ASCII 문자는 메일 헤더에 직접 포함되면 메일 클라이언트가 올바르게 해석하지 못하고 깨지게 됨

2-2. RFC 표준 인코딩

한글과 같은 비ASCII 문자를 메일 헤더에 안전하게 포함하기위해서는 RFC 2047 또는 RFC 2231과 같은 국제 표준 인코딩 방식을 따라야

 

참고) 메일 헤더

헤더 항목 설명
From 발신자 주소
To 수신자 주소
Subject 제목
Date 발송 시간
Content-Type 본문/첨부파일의 타입과 인코딩
Content-Disposition 첨부 파일 정보 (이름, 타입 등)

 

 

3. 해결 방안

3-1.  RFC 표준 인코딩 방식

RFC 용도 설명
RFC 2047 메일 헤더 필드 인코딩 제목, 파일명 등 헤더에 쓰이는 비 ASCII 문자열 인코딩
RFC 2231 메일 헤더 파라미터 값 인코딩 Content-Disposition 헤더의 filename 파라미터와 같은 헤더 내의 특정 파라미터 값에 쓰이는 비 ASCII 문자열 인코딩

 

3-2. email.header.Header().encode()활용

Python의 email.header.Header 모듈을 사용하여 한글 파일명을 RFC 표준에 따라 명시적으로 인코딩한 후, Content-Disposition 헤더의 filename 파라미터에 전달

 

예시)

from email.header import Header
…
    # 파일 첨부
    part = MIMEBase('application', 'pdf')
    try:
        with open(pdf_full_path, "rb") as f:
            part.set_payload(f.read())
        encoders.encode_base64(part)
        
        import os
        file_basename = os.path.basename(pdf_full_path)
        
        part.add_header(
            'Content-Disposition',
            'attachment',
            filename=(Header(file_basename, 'utf-8').encode())
        )
        msg.attach(part)
    except Exception as e:
        print(f"파일 첨부 중 오류 발생: {e}")
…

os.path.basename()을 이용해 파일 이름만 추출

추출된 한글 파일명을 email.header.Header(파일_이름, 'utf-8').encode()를 사용하여 RFC 표준에 맞게 인코딩

인코딩한 값을 part.add_header의 filename 파라미터에 할당

 

 

4. 결론

해당 코드로 수정 후 메일 발송 시, 첨부된 PDF 파일명이 깨지지 않고 정상적으로 한글로 표시됨

이메일 관련 기능 개발 시, 한글과 같은 비ASCII 문자 처리에 대한 국제 표준(RFC) 준수의 중요성을 느낌

Pythonemail 패키지 내 Header 모듈을 활용하여 메일 헤더의 복잡한 문자 인코딩 문제를 해결하도록 지원하며, 개발자가 직접 복잡한 인코딩 규칙을 구현할 필요 없이 표준을 준수할 수 있도록 함

728x90