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) 준수의 중요성을 느낌
► Python의 email 패키지 내 Header 모듈을 활용하여 메일 헤더의 복잡한 문자 인코딩 문제를 해결하도록 지원하며, 개발자가 직접 복잡한 인코딩 규칙을 구현할 필요 없이 표준을 준수할 수 있도록 함
'Trouble Shooting' 카테고리의 다른 글
| [Python] 파이썬 환경 변수(PATH) 설정 방법 (0) | 2024.08.04 |
|---|---|
| [Windows] 배치파일 한글 오류 / 한글 깨짐 문제 (0) | 2024.04.22 |
| [Error] No package nginx available. 해결 방법 (0) | 2024.02.28 |
| [NTP] Leap Second expired / 윤초 만료 이슈 (1) | 2024.01.28 |
| [MySQL 설치 시 에러] RPM GPG KEY Error 해결 방법 (0) | 2024.01.14 |