응용프로그램을 통해, 메일을 보내는 방법은 알고 있으나, 실제로 어떤 과정을 거쳐 메일이 오고가는지, 작동원리에 대해 알아보도록 하겠습니다.
Index
- SMTP 와 POP3/IMAP 이란?
- 여러 SMTP 서버간의 통신 과정
- 자바 에서는 어떤식으로 작동하는가?
용어 및 개념 정리
메일 시스템에는 2가지 종류의 프로토콜이 필요합니다.
- 메일을 발송하는데 사용하는 프로토콜 (SMTP)
- 메일을 받아오는데 사용하는 프로토콜 ( IMAP, POP)
SMTP (Simple Mail Transfer Protocol)
- 인터넷에서 메일을 주고 받기 위한 전송규약을 의미한다.
- SMTP 통신규약이 사용되는 경우
- SMTP는 클라이언트가 작성한 메일을 서버로 전송할 때.
- 인터넷을 통해 서버 간 메일을 전송할 때 사용할 때
- SMTP 서버 와 SMTP는 다른의미로 문맥에서 잘 이해해야합니다.
- 기본적으로 25번 포트를 사용하지만, 보안상의 이유로 587를 활용합니다.
SMTP 서버
- SMTP 프로토콜에 따라서 이메일 전달 과정을 처리해주는 이메일 서버
- 이메일 클라이언트가 보낸 메일을 수신하여 다른 메일 서버로 전달해주는 역할을 합니다.
SMTP 시스템에서 사용되는 용어
- MUA (Mail User Agent): 사용자가 이메일을 작성하고 내려 받을 수 있게 하는 프로그램
ex) Gmail, Outlook
- MSA (Mail Submission Agent): MUA에서 이메일을 최초로 전달 받으면 MTA로 메시지를 전달합니다.
- MTA (Mail Transfer Agent): MSA 또는 다른 서버의 MTA와 통신하여 이메일을 전달합니다.
- MDA (Mail Delivery Agent): MTA로부터 받은 이메일을 최종적으로 수신자의 메일함에 넣어놓는 역할을 합니다.
POP3(Post Office Protocol 3)
- SMTP 서버로부터 메시지를 다운로드하여 로컬 저장소에 저장, 일반적으로 서버의 메시지를 삭제
(휴대기기가 나오면서, 동기화 문제가 발생하였음. 한번 로드받으면, 서버에서 지웠기 때문에..)
IMAP (Internet Message Access Protocol)
- 서버에서 메시지를 관리하며, 클라이언트는 서버의 메시지를 동기화하여 볼 수 있다. 위의 POP3 의 문제점을 해결한 프로토콜이라고 볼 수 있습니다.
정리
우편을 보내는 것으로 비유할 때, 우체통은 SMTP 서버, 집배원은 (POP3 / IMAP)을 의미한다고 생각하면 조금 더 이해가 될 것입니다.
SMTP 서버 간 통신 과정
1 사용자는 메일 클라이언트 ( ex)Gmail, Outlook)) 을 통해 Mail 을 작성하고 B서버의 도메인 주소를 갖는 유저에게 메일을 발송 요청했습니다. 자신의 메일 도메인을 갖는 A서버에 전송하게 됩니다.
2 A서버의 MSA에게 메일이 전달되고, 문제가 없는지 확인 후, A서버의 MTA로 이동하게 됩니다.
3 받는 사람의 도메인 주소를 확인하여, 네임서버로부터 IP를 받아와 B서버에게 전달합니다.
4 B서버의 MTA는 메일을 전달받게 되고, MDA 에게 전달합니다.
5 전달받은 유저는 메일 클라이언트를 통해 IMAP, POP3를 통해 메일 내용을 받아옵니다.
아래의 그림을 보면서 이해하면 조금 더 설명이 이해가 가실겁니다.

자바에서는 어떻게 메일을 보내는걸까?
- 자바에서는 JavaMail API를 제공합니다.
- SpringFramework 같은 경우 내부 내장 라이브러리가 존재합니다.

- Spring에서는
JavaMailSender
를 구현한 JavaMailSenderImpl
클래스가 존재합니다.
- 기존의 사용할 메일의 SMTP 서버를 활용해서 구현한 것이었다. (office365)
- 위의 그림으로 내가 작업한 내용을 이해해봤을 때, 내가 작업한 내용은 MUA를 통해서 메일을 발송하는 것을 Java Backend API가 대신해서 진행한 것으로 볼 수 있었습니다.
- 핵심 객체는
Transport
, Session
인 것으로 보입니다.
- Backend API Application 외부 주입을 받은 설정을 통해 만들어진 Session 을 통해 만들어진 메세지를 전달한다고 볼 수 있습니다.
사용하다가 문제점이 생긴다면,JavaMailSenderImpl
클래스를 뜯어보면 되겠습니다.
Reference
SMTP(단순 전자우편 전송 규약)이란 무엇일까요?
[Ubuntu 20.04] 10장-01교시 메일서버: 메일서버 개념과 실습환경의 이해