일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 디버깅
- docker
- 레디스 동시성
- 깊게 생각해보기
- piplining
- 트랜잭샨
- 검색어 추천
- 구현
- 셀러리
- 백준
- 객체지향패러다임
- AWS
- branch 전략
- 수신자 대상 다르게
- 완전탐색
- 누적합
- 알람 시스템
- BFS
- 숫자 블록
- 코드 계약
- spring event
- 쿠키
- 좋은 코드 나쁜 코드
- gRPC
- 프로그래머스
- 결제서비스
- 카카오
- prg 패턴
- jwt 표준
- 이분탐색
- Today
- Total
코딩관계론
Email attachment received as 'noname' 해결하기 본문
소개
이 포스트에서는 이메일의 첨부 파일 이름이 'noname' 으로 표시되는 문제를 다룹니다. 구체적으로, 현대 측 SMTP 서버를 사용하여 이메일을 발신하던 중, 한글 파일을 첨부하면 서버에서 파일 이름을 'noname'으로 변경하여 수신자에게 전달하는 문제가 발생했습니다.
문제 원인
문제의 원인은 한글 파일을 보낼 때 인코딩과 디코딩 과정이 제대로 이루어지지 않아 발생한 것으로 확인되었습니다. 해당 문제를 해결하기 위해서는 올바른 인코딩 방식을 사용하여 파일 이름을 설정해야 합니다.
먼저 문제를 제대로 이해하기 위해 인코딩의 개념과 한글이 왜 ASCII에서 인코딩이 될 수 없는지에 대해서 설명하겠습니다.
인코딩이란 무엇인가?
인코딩은 컴퓨터에서 문자나 기호를 표현하는 방법입니다. 컴퓨터는 전기 신호로 정보를 처리하기 때문에, 텍스트와 문자를 이진 데이터로 변환해야 합니다. 인코딩은 문자 집합(Charset)에서 각 문자를 숫자로 매핑하는 규칙을 정의하는 과정입니다. 이렇게 숫자로 된 이진 데이터는 컴퓨터에서 저장하고 처리할 수 있습니다.
대표적인 인코딩 방식은?
대표적인 인코딩 방식은 ASCII (American Standard Code for Information Interchange)가 있습니다. ASCII는 7비트로 표현되며, 주로 영어 알파벳, 숫자, 특수 문자 등을 인코딩할 수 있습니다.
하지만 한글은 인코딩할 수 없는데 그 이유는 한글은 2바이트로 인코딩되어 있기 때문에 아스키 인코딩으로는 직접 표현할 수 없습니다. 한글이 2바이트로 인코딩 되는 이유는 유니코드에서 한글을 표현하기 위해 충분한 비트 수가 필요하며, 16비트인 2바이트로 한글의 모든 글자를 표현할 수 있기 때문입니다.
해결 방법
MIMEApplication의 addheader함수의 주석을 보면 만약 파라미터 값에 비 ASCII 문자가 포함되어 있다면, 해당 값은 (charset, language, value)의 세 개의 요소로 구성된 세 개의 튜플로 지정할 수 있습니다. 이 경우, RFC2231 규칙에 따라 인코딩됩니다.
즉, 해당 문자열은 charset과 language에 따라 인코딩 방식이 결정되고, 특정 규칙에 따라 변환됩니다.
def add_header(self, _name, _value, **_params):
"""Extended header setting.
name is the header field to add. keyword arguments can be used to set
additional parameters for the header field, with underscores converted
to dashes. Normally the parameter will be added as key="value" unless
value is None, in which case only the key will be added. If a
parameter value contains non-ASCII characters it can be specified as a
three-tuple of (charset, language, value), in which case it will be
encoded according to RFC2231 rules. Otherwise it will be encoded using
the utf-8 charset and a language of ''.
Examples:
msg.add_header('content-disposition', 'attachment', filename='bud.gif')
msg.add_header('content-disposition', 'attachment',
filename=('utf-8', '', Fußballer.ppt'))
msg.add_header('content-disposition', 'attachment',
filename='Fußballer.ppt'))
"""
parts = []
따라서 아래와 같이 변경해주면 noname 말고 적잘한 파일 이름을 받을 수 있습니다.
bucket = Bucket()
bucket.file_path = pdf_file.minio_url
bucket_file = MinioBucket.read(bucket).read()
attachment = MIMEApplication(bucket_file, _subtype='pdf')
attachment.add_header('Content-Disposition', 'attachment',
filename=('utf-8', '', pdf_file.encode('utf-8')))
email.attach(attachment)
#잘못된 코드
bucket = Bucket()
bucket.file_path = pdf_file.minio_url
bucket_file = MinioBucket.read(bucket).read()
attachment = MIMEApplication(bucket_file, _subtype='pdf')
attachment.add_header('Content-Disposition', 'attachment',filename=pdf_name)
email.attach(attachment)
'TroubleShooting' 카테고리의 다른 글
파이썬 크롤링 작업 시간 단축하기 (0) | 2023.08.13 |
---|---|
telegram.error.NetworkErrorAsyncIO Event Loop Closed 오류 (0) | 2023.08.12 |
OAuth2.0이란 (0) | 2023.04.15 |
테스트 커버리지를 올리기 위한 노력 (0) | 2023.04.14 |
CSRF verification failed. Request aborted는 왜 발생할까? (0) | 2023.04.04 |