본문 바로가기

Applications

이메일 - 수신확인 기능

과거 10년 전만해도 이메일은 새로운 의사소통의 도구였다.

지금은 초등학생도 보낼 정도로 보편화가 되었지만 말이다.

 

하지만 '핸드폰 문자메시지 서비스'처럼 이메일은 단방향의 통신 수단이다. 즉, 보내면 땡이다.

보냈으면 취소할 수 없고, 상대방에게 잘 도착했는지, 메일을 읽었는지 알 수 있는 방법은 만들어질 당초 고려되지 않았다.

사실 메일이 지연되어 늦게 도착하거나 이메일 중계 서버를 거치면서 폐기되거나, 스팸 메일함으로 분류되어 읽혀지지 않을 수 있다.

 

하지만 꿍수를 써서 메일이 읽었는지 알 수 있다.

한국의 이메일 서비스에는 보통 수신확인 기능이 대부분 있다.

 

 

원리는?

그럼 어떤 원리로 수신확인이 가능한 것인가?

 

원리는 간단하다. 보내는 메시지에 특정 리소스(보통 작은 이미지 같은)를 같이 덧붙여 보내는 것이다.

상대방이 메일을 읽게 되면 메시지 이외에 이메일 클라이언트(웹브라우저던 아웃룩이건..)는 리소스를 요청하게 된다.

서버는 리소스 요청을 메일을 읽었다고 판단하게 되고 "수신확인" 쪽에 읽었다고 표시를 하게 되는 것이다.

 

사례: 네이버 메일

네이버를 예로 들어보자.

텍스트로 달랑 메시지를 보내고 전송되는 메시지 원본을 열어보면 아래와 같다.

 

바운더리(Boundary)가 하나가 아니라 2개임을 알 수 있다.

이메일은 첨부 파일 같은 여러 유형의 데이터를 메일에 포함 시키기 위해 MIME이라는 기능이 있는데

각 데이터를 바운더리로 구분을 한다. (데이터와 겹치지 않는 짝대기와 특정 문자열로 구성된다.
위에서 "---------Boundary-Naver=_a9bc694d33ce1804024c8000392c1bc6"가 바로 그것이다)

 

내가 보낸 메시지는 컨텐츠 타입이 텍스트(Content-Type: text/plain)인 부분이다.

내용은 달랑 VEVTVAo= 이다. base64로 인코딩이 되어 있어 무슨말인지 모르겠지만 디코더로 디코딩을 해보면

"TEST"라는 문자열이다.

 

그럼 아래 부분(위의 그림에서 파란색으로 선택되어진 부분)은 무엇일까?
디코딩을 해보면 아래와 같다.

  1. <html><head><style>P {margin-top:2px;margin-bottom:2px;}</style></head><body><div style="font-size:10pt; font-family:Gulim;"><p>TEST</p></div></body></html><!--navermail.footer.start-->
  2. <!--navermail.footer.end-->                                                                                              
  3. <IMG SRC="http://mail2.naver.com/newmailcheck/os+q16R9bX3opxmsWXiGp4JSKqM/ax0oK4MqpovwaxUrKoMrKxU/poJSaxMZtH3Xp6UqFZdZ74lRhoR51zRGW6lCW6egpr9C16m5MreR.gif" border=0 width=0 height=0 style="display:none">

즉, HTML문서인데 .gif 이미지가 포함되어 있다. 근데 display 스타일이 none으로 되어 있기에 실제 표시는 되지 않는 것이다.

이미지를 다운 받아보면 1x1픽셀짜리 34바이트짜리 이미지(링크)이다.

 

 

수신확인이 제대로 동작하지 않을 경우는?

만약 메일을 읽더라도 메일 메시지를 단순히 내용만 읽는다면(예를 들면 원문을 읽는 다거나, 원문을 읽기 위해 메일을 열어야 하는 경우는 불가) HTML을 처리하지 않을 수 있다.

마찬가지로 메일 수신 확인용 HTML을 클라이언트가 처리를 하지 않는다면 gif 이미지 요청(HTTP GET)을 하지 않을 것이다.

누군가에게 긴급하게 업무상, 개인상 메일을 보낼 때는 전화등의 보조적인 수단으로 확인을 하는 게 가장 좋을 것이다.