이메일 원본 소스를 보는 방법
- 메일 클라이언트에서 원본 메시지를 가져와(아래 표 참고) 붙여넣거나,
.eml이나.mht파일을 페이지에 놓으세요. - 요약에 From, To, Cc, Subject, Date, Message-ID가 디코딩되어 나옵니다. 전체 헤더에는 모든 헤더가 디코딩된 값, 원래 값과 함께 나열됩니다.
- 메시지 본문을 일반 텍스트나 HTML로 읽으세요. HTML은 샌드박스에서 표시됩니다.
- 첨부 파일에는 파일마다 이름, 유형, 크기, 콘텐츠 ID와 다운로드 버튼이 나오며, 이미지는 미리보기도 나옵니다.
- MIME 구조는 파트가 어떻게 중첩되어 있는지 보여 주므로, 첨부 파일이 빠진 것 같을 때 도움이 됩니다.
| 메일 클라이언트 | 원본 소스를 찾는 곳 |
|---|---|
| Gmail | 메시지 메뉴(⋮) → 원본 보기(Show original), 그다음 원본 다운로드(Download original) |
| 웹용 Outlook | 메시지 메뉴(…) → 보기(View) → 메시지 원본 보기(View message source) |
| Thunderbird | 보기(View) → 메시지 소스(Message Source, Ctrl+U), 또는 .eml로 받으려면 파일(File) → 다른 이름으로 저장(Save As) |
| Apple Mail | 보기(View) → 메시지(Message) → 원본 소스(Raw Source) |
디코더가 처리하는 것
- 인코딩된 헤더: Base64(
B)와 quoted-printable(Q)로 된 RFC 2047 단어를 처리합니다. 인접한 단어를 합치고, 브라우저가 아는 모든 문자 인코딩(EUC-KR 포함)과 원시 UTF-8 헤더도 읽습니다. - 첨부 파일 이름:
filename*=UTF-8''Rechnung%20M%C3%A4rz.pdf같은 RFC 2231 형식과 나뉜filename*0*=이어 쓰기를 처리합니다. - 본문:
base64와quoted-printable본문을 선언된 문자 인코딩으로 디코딩합니다.f=C3=BCr는für가 됩니다. - 중첩된 메시지:
message/rfc822로 첨부된 전달 메일도 바깥 메시지처럼 따라가며 읽습니다. - 인라인 이미지: HTML의
cid:참조를 첨부된 이미지로 연결합니다. - 일부만 있는 입력: 단독 Base64 MIME 파트, 통째로 Base64 인코딩된 메시지, 헤더 없이
--boundary로 시작하는 multipart 본문도 받습니다.
통째로 Base64 인코딩된 메시지는 보통 UmV0dXJuLVBhdGg6(Return-Path:)나 UmVjZWl2ZWQ6(Received:)로 시작합니다. 그대로 붙여넣으면 디코더가 먼저 벗겨 냅니다.
의심스러운 메시지 확인하기
피싱 시도에 대해서는 본문보다 헤더가 더 많은 것을 알려 줍니다. 전체 헤더에서 비교할 것은 다음과 같습니다.
- From과 Return-Path, Reply-To. 회신 주소가 다른 도메인이라면 전형적인 신호입니다.
- 받는 서버가 추가하는 Authentication-Results:
spf=,dkim=,dmarc=가 pass인지 fail인지. - 아래에서 위로 읽는 Received 줄은 보낸 서버에서 받는 서버까지의 경로를 보여 줍니다.
- 첨부 파일 유형: 모르는 사람이 보낸
.html,.iso,.zip첨부 파일은 의심해 봐야 하며,invoice.pdf.html같은 이중 확장자도 마찬가지입니다.
원격 콘텐츠가 차단되므로 여기서 HTML 본문을 봐도 추적 픽셀이 로드되거나 주소를 읽었다는 사실이 확인되지 않습니다. 페이지 CSS도 제거되므로 뉴스레터는 메일 클라이언트에서보다 밋밋하게 보입니다.
Python으로 첨부 파일 추출하기
from email import policy
from email.parser import BytesParser
with open("message.eml", "rb") as f:
msg = BytesParser(policy=policy.default).parse(f)
print(msg["Subject"])
for part in msg.iter_attachments():
name = part.get_filename()
with open(name, "wb") as out:
out.write(part.get_payload(decode=True))
print("saved", name)
policy.default는 인코딩 단어 헤더를 디코딩하므로 msg["Subject"]는 이미 읽을 수 있는 상태입니다. 실제로 쓸 때는 name이 보낸 사람에게서 온 값이므로 파일을 쓰기 전에 정리하세요. 첨부 파일이 어떻게 인코딩되는지는 이메일 속 Base64에서 더 다루며, MIME Base64 인코더는 76열 형식을 만들어 줍니다.
알려진 한계
- Outlook
.msg파일은 지원하지 않습니다.winmail.dat(TNEF) 파트는 첨부 파일로 나열되지만 풀지는 않습니다. - HTML 본문 안의 링크는 의도적으로 작동하지 않습니다.
- MIME 파트가 지나치게 많은 메시지는 안내와 함께 중간에서 끊깁니다.
자주 묻는 질문
Outlook 없이 .eml 파일을 열려면 어떻게 하나요?
이 페이지에 파일을 놓으세요. 헤더, 텍스트 본문과 HTML 본문, 모든 첨부 파일이 표시되며 첨부 파일은 하나씩 내려받을 수 있습니다. 64 MB까지의 파일은 브라우저에서 바로 읽습니다.
제목 줄의 =?UTF-8?B?…?=는 무슨 뜻인가요?
RFC 2047 인코딩 단어입니다. B는 사이의 텍스트가 Base64라는 뜻이고, Q는 quoted-printable 변형이라는 뜻입니다. =?UTF-8?B?UmVjaG51bmcgTcOkcno=?=는 Rechnung März로 디코딩됩니다. 디코더는 디코딩된 값과 원래 값을 나란히 보여 줍니다.
의심스러운 이메일을 여기서 봐도 안전한가요?
HTML 본문은 스크립트, 폼, 작동하는 링크가 없는 샌드박스 프레임에서 렌더링되고 원격 이미지와 추적 픽셀은 차단되므로, 열어 봐도 보낸 사람에게 아무것도 알려지지 않습니다. 첨부 파일은 목록으로 보여 주고 다운로드만 제공하며 절대 열지 않습니다.
Outlook .msg 파일도 열 수 있나요?
아니요. .msg 파일은 MIME이 아니라 Outlook 전용 바이너리 형식입니다. 대신 웹용 Outlook에서 같은 메시지를 열고 메시지 원본 보기를 선택한 뒤 그 텍스트를 여기에 붙여넣으세요.