우리는 꽤 오랜 시간 이메일을 사용해왔다.
요즘에는 다른 서비스를 가입할 때도 이메일을 입력한다. 회원가입을 마치기 위해 인증 메일을 확인한다. 비밀번호를 잊어버렸을 때도 이메일로 재설정 링크를 받는다. 결제 영수증도 이메일로 오고, 서비스 공지도 이메일로 오고, 가끔은 내가 가입한 기억도 희미한 서비스에서 오랜만에 메일이 오기도 한다.
이메일은 너무 익숙하다.
너무 익숙해서 오히려 잘 생각하지 않게 된다.
메일을 보낸다는 것은 무엇일까?
서비스에서 “인증 메일을 보냈습니다”라고 말할 때, 실제로는 무슨 일이 일어나는 걸까?
예전에 만들었던 이메일 인증 기능
예전에 회사에서 회원가입 기능을 구현한 적이 있다.
사용자가 이메일 주소를 입력하면 인증 메일을 보내고, 사용자는 그 메일 안에 있는 링크나 코드를 통해 본인의 이메일임을 증명하는 방식이었다. 비밀번호를 잊어버렸을 때도 비슷했다. 사용자가 이메일을 입력하면 비밀번호를 재설정할 수 있는 링크를 보내야 했다.
당시의 나는 이 기능을 “이메일 발송 기능”이라고 생각했다.
하지만 실제 구현은 생각보다 단순했다.
외부 메일 발송 서비스를 선택하고, 계정을 만들고, API 키를 발급받고, 문서에 나온 대로 코드를 작성했다. 대략 이런 느낌이었다.
SendEmail(to, subject, body)
메일이 보내졌다.
기능은 동작했고, 사용자는 인증 메일을 받을 수 있었다. 서비스 입장에서도 문제가 없었다. 오히려 그게 가장 현실적인 선택이었다. 내가 직접 메일 서버를 만들 필요도 없었고, 메일 전송에 대해 깊게 알 필요도 없었다.
그때의 나는 “메일을 보냈다”고 생각했다.
그런데 지금 와서 다시 생각해보면, 나는 정말 메일을 보낸 걸까?
아니면 메일을 보내주는 다른 서비스에게 “이 메일 좀 보내주세요”라고 요청한 걸까?
나중에 생긴 작은 의문
서비스를 실제로 운영하려고 하니 비용 문제가 보이기 시작했다.
메일 발송 서비스는 편리했지만, 계속 사용하려면 정기적으로 비용을 지불해야 했다. 물론 당연한 일이다. 누군가 서버를 운영하고, 메일을 안정적으로 보내고, 실패를 처리하고, 여러 문제를 대신 감당해주고 있으니 비용이 드는 것은 자연스럽다.
그런데 그때 문득 이런 생각이 들었다.
우리가 직접 할 수는 없었을까?
우리 서버가 직접 이메일을 보내는 것도 가능했을까?
외부 서비스를 쓰지 않고, 우리가 만든 서버에서 사용자에게 인증 메일을 보내는 구조를 만들 수 있었을까?
그게 가능하다면 왜 많은 서비스는 외부 메일 발송 서비스를 사용할까?
반대로 가능하지 않다면 무엇 때문에 어려운 걸까?
이 질문들이 계속 남았다.
처음에는 단순한 비용 문제처럼 보였다. “메일 발송 서비스 비용을 아낄 수 있지 않을까?” 같은 생각이었다. 하지만 조금 더 생각해보니 단순히 돈의 문제가 아닌 것 같았다.
나는 이메일이 어떻게 보내지는지 잘 모르고 있었다.
너무 익숙하지만 잘 모르는 것
이메일은 오래된 기술이다.
하지만 아직 이메일에 대해 잘 모르는 상태에서는 모르는 것들 투성이다.
메일은 어디로 보내야 할까?
상대방의 메일 서버는 어떻게 찾을까?
메일을 보냈다는 것은 정확히 어느 시점을 말하는 걸까?
내 서버에서 메일을 내보낸 순간일까?
상대 서버가 메일을 받은 순간일까?
사용자의 받은편지함에 도착한 순간일까?
스팸함에 들어가면 보낸 걸까, 실패한 걸까?
메일 주소는 정말 존재하는지 어떻게 알 수 있을까?
메일 본문은 그냥 문자열이면 될까?
파일 첨부는 어떻게 되는 걸까?
한글 제목은 어떻게 보내는 걸까?
생각해보면 질문은 끝이 없다.
그런데 나는 이 질문들에 대해 제대로 답하지 못한다. 이메일 인증 기능을 구현해본 적은 있지만, 이메일 자체를 이해했다고 말하기는 어렵다.
외부 서비스를 사용했기 때문에 몰라도 됐던 부분들이 있었다.
이제는 그 몰라도 됐던 부분을 직접 들여다보고 싶어졌다.
그래서 직접 구현해보려 한다
이 글은 “이제부터 완벽한 메일 서버를 만들겠다”는 선언이 아니다.
운영 가능한 이메일 인프라를 만들겠다는 이야기도 아니다.
아직 나는 무엇이 중요한지 모른다. 무엇이 어려운지도 모른다. 어디서 막힐지도 모른다. 어쩌면 아주 단순해 보이는 부분에서 막힐 수도 있고, 전혀 예상하지 못한 개념을 만나게 될 수도 있다.
이메일을 직접 보내려면 무엇을 해야 할까?
이 질문에 답하기 위해 SMTP라는 것을 구현해볼 생각이다.
SMTP는 정보처리기사 공부할 때 포트번호 관련해서 스쳐지나가듯이 봤던 기억이 있다.
처음에는 로컬에서 작은 서버를 띄워볼 것이다.
그 서버가 메일을 받을 수 있는지 확인해볼 것이다.
그다음에는 메일을 보낸다는 행위가 실제로 어떤 순서로 이루어지는지 살펴볼 것이다.
그리고 언젠가는 이런 질문에 다시 돌아오고 싶다.
예전에 회사에서 만들었던 이메일 인증 기능.
그 기능을 외부 서비스 없이 직접 만들 수 있었을까?
가능했다면 어디까지 가능했을까?
가능하지 않았다면 무엇 때문이었을까?
그때는 몰랐던 것들을, 이번에는 직접 구현하면서 알아가보려 한다.
'Deep Dive > 기타' 카테고리의 다른 글
| [SMTP] 2. SMTP 지도 그리기: 메일은 어디에서 어디로 가는가 (0) | 2026.05.07 |
|---|
