- 인터넷에서 전자 메일 전송은 SMTP(Simple Mail Transfer Protocol)를 지원하는 호스트 사이에 이루어지며, SMTP 호스트들은 SMTP 명령과 그에 따른 응답 과정을 반복해 메일을 전송한다.
- 메일을 보내는 과정은 절차상 3단계로 구분한다.
- 연결 설정 단계에서는 SMTP 클라이언트가 TCP를 이용해 SMTP 서버와 세션을 설정한다.
- 연결 설정이 완료되면 SMTP 서버에 메일을 보내는 데이터 전송 단계를 진행한다. 이 단계에서 송신자의 메일 주소, 수신자의 메일 주소, 메일 제목 등과 같은 헤더 정보를 포함하여 메일의 전체 내용이 순차적으로 전송된다.
- 마지막으로 메일 전송을 완료하면 TCP 연결을 종료하는 연결 해제 단계가 진행되고, SMTP세션이 종료된다.
SMTP의 구조
- SMTP는 메일을 전송하는 SMTP 클라이언트와 메일을 수신하는 SMTP 서버 사이의 데이터 전송에 대한 규칙을 다루며, 명령과 응답의 교환 과정을 통해 메일을 전달한다.
- SMTP 클라이언트는 메일 수신자로 지정한 하나 이상의 SMTP 서버에 메일을 전달 한다. 이를 위해 SMTP 서버에 대한 접근 가능성 확인, 서버와 연결 설정, 메일 전송이라는 단계를 순차적으로 진행한다.
- SMTP 클라이언트가 SMTP 서버와 직접 연결하는 것이 불가능할 수도 있다.
ex) 서버가 다운되는 등의 상황에 의해 첫 번째 단계인 서버 접근이 불가능할 수 있다. 하지만 매일 시스템은 기본적으로 메시지를 실시간으로 처리하지 않고, 메시지 저장과 중개라는 개념에 따라 동작하기 때문에 이런 문제를 극복할 수 있다.
SMTP의 명령과 응답
- SMTP의 기본 동작 원리는 SMTP 클라이언트의 명령 전송과 이에 대한 SMTP 서버의 응답으로 이루어진다.
- SMTP의 명령과 응답은 미리 정의된 문자 코드와 개행(enter키) 문자로 구성된다.
- SMTP에서 규정한 SMTP 명령 중에서 주요한 8개이며, 이중 메일의 송수신과 직접 관계되는 것은 앞쪽의 5개이다.
명령 | 의미 |
HELO + <송신자의 호스트 이름> | SMTP 세션을 시작하며, 송신자의 호스트 이름을 전송하여 서버에 자신의 신분을 알려준다. |
MAIL + <송신자의 메일 주소> | 송신자의 메일 주소를 통지한다. |
RCPT + <수신자의 메일 주소> | 수신자의 메일 주소를 통지한다. |
DATA + <메시지의 내용> | 메일 메시지를 송신한다. |
QUIT | 더 이상의 전송 메시지가 없음을 통지하여 SMTP 세션을 종료한다. |
RSET | 현재의 연결 상태가 종료되었음을 통지하고, 연결 재설정이 이루어진다. |
VRFY + <수신자의 메일 주소> | 수신자의 주소를 조회하려고 사용한다. |
NOOP | 수신자의 상태를 검사하려고 사용한다. |
클라이언트가 전송한 명령에 대하여 SMTP 서버는 SMTP 응답 기능을 수행한다. 응답 정보는 세 자리의 코드와 추가 정보로 구성된다. 코드의 첫 문자는 의미가 다른 2~5 값 중의 하나이다.
응답 코드 | 의미 |
2yz | 긍정적 완료 응답 |
3yz | 긍정적 중간 응답 (추가 과정 필요) |
4yz | 임시 부정적 완료 응답 (향후 처리될 가능성 있음) |
5yz | 영구 부정적 완료 응답 |
연결 설정
연결 설정 단계는 SMTP 클라이언트가 SMTP 서버의 Well-Known 포트인 25번 포트로 TCP 연결을 만들면서 시작한다.
명령과 응답
TCP 연결 설정이 정상적으로 이루어지면 SMTP 세션의 연결 설정 절차가 진행된다.
- 25번 포트에서 대기 중인 SMTP 서버는 TCP 연결 요청이 들어오면 응답 코드 220을 회신하여 메일을 수신할 준비가 되었음을 통지한다.
- 서비스가 준비되지 않았으면 코드 421을 전송하여 후속 작업이 진행되지 않도록 한다.
- SMTP 서버로부터 응답이 없으면 SMTP 세션 연결에 실패한 것이다.
- 응답 코드 220을 수신한 클라이언트는 HELO명령과 함께 송신자으 호스트 이름을 전송한다.
- 수신자는 그에 대한 완료 코드 250을 전송함으로써 SMTP 세션 연결 절차가 완료된다.
시뮬레이션
- 클라이언트 호스트에서 'telnet information.uu.ac.kr 25' 명령을 입력하여 information.uu.ac.kr의 25번 포트인 SMTP 서버에게 연결을 시도한다.
- 연결이 성공하면 telnet 명령과 관련된 결과를 출력한다.
- SMTP 서버로부터 '200 information.uu.ac.kr ESMTP Sendmail 8.9.3....'의 응답 메시지를 수신하는데, 응답 코드 220을 수신하였으므로 정상적인 연결 설정 절차를 이어갈 수 있다.
- 사용자가 키보드로 'HELO kihyun.uu.ac.kr'을 입력함으로써, SMTP 서버에 HELO 명령과 송신자의 호스트 이름을 전송한다.
- 서버는 '250 information.uu.ac.kr Hello kihyun.uu.ac.kr .....'의 응답 메시지를 회신하여 SMTP 세션이 성공적으로 이루어졌음을 알린다.
왼쪽의 텔넷 프로그램이 SMTP 클라이언트를 대신한다. 텔넷 프로그램은 키보드의 입력을 SMTP 서버에 전달하고 SMTP 서버의 결과를 화면으로 출력하는 중개 기능만 수행한다.
데이터 전송
데이터 전송은 클라이언트가 전송하고자 하는 메일 내용을 전달하는 단계이다. 연결 설정 단계가 성공적으로 이루어져 SMTP 세션이 존재하는 경우에만 가능하다.
명령과 응답
데이터 전송 단계는 크게 송수신자의 메일 주소 확인, 메일 헤더 정보의 전송, 메일 메시지의 전송으로 구분한다.
메일 주소 확인
- 송수신자의 메일 주소 확인 과정에서 SMTP 클라이언트가 SMTP 서버에 송신자와 수신자의 메일 주소를 전달한다.
- 먼저 MAIL 명령을 사용해 송신자 메일 주소를 서버에 전달하는데, 서버에서 오류 상황이 발생하면 이 주소로 오류 내용을 회신 받는다.
- MAIL 명령이 성공적으로 처리되면 RCPT 명령을 이용해 수신자 메일 주소를 전송한다.
- SMTP 서버는 수신자 메일 주소가 자신의 호스트에 등록된 사용자인지 확인하여 등록된 경우에만 긍정 응답을 한다.
ex) 등록된 사용자가 아니면 응답 코드 550을 회신하여 오류로 처리한다.
메일 헤더 정보 전송
메일 헤더 정보를 전송하는 과정은 사용자의 메일 헤더를 서버에 전송하기 위한 것이며, DATA 명령에 의해 시작된다. From, To, Date 등과 같이 전송하려는 헤더 정보를 순차적으로 한 줄씩 전송하는데, 반드시 모든 헤더 정보를 보내야 하는 것은 아니다.
메일 메시지 전송
메일 메시지 전송 과정은 송신자의 메일 내용을 전송하는 단계이며, 메시지를 원하는 만큼 순차적으로 전송한다. 더 이상 전송할 데이터가 없으면 마지막을 의미하는 점(.)을 전송해 데이터 전송을 완료한다.
올바르게 완료되면 SMTP 서버로부터 응답 코드 250을 수신한다.
시뮬레이션
- 'MAIL FROM: park@kihyun.uu.ac.kr' 명령을 입력하여 송신자의 메일 주소를 서버에 통지한다.
- 이어서 RCPT 명령으로 수신자 메일 주소를 통지한다.
- 호스트 information.uu.ac.kr에는 park이라는 사용자가 등록되어 있지 않으므로 '550 park@information.uu.ac.kr... User unknown'이라는 오류 응답이 회신되었다.
- 2번째로 'RCPT TO: kihyun@information.uu.ac.kr` 명령을 전송한다.
- kihyun이라는 사용자는 서버에 등록되어 있기 때문에 정상적으로 처리된다.
- 이어서 DATA 명령을 전송해 메일의 헤더와 메시지를 전송할 수 있다.
- 마지막으로 점(.)을 전송해 메일 내용이 더 이상 없음을 통지하였다.
- 맨 마지막의 QUIT 명령은 SMTP 세션을 종료시킨다.
연결 해제
연결 해제 단계는 더 이상 전송할 메일 내용이 없을 때 진행하는데, QUIT 명령 전송으로 시작한다.
명령과 응답
SMTP 클라이언트가 QUIT 명령을 전송하고, 그에 따른 SMTP 서버의 응답 코드 221을 회신하는 과정이다.
Reference
쉽게 배우는 데이터 통신과 컴퓨터 네트워크
https://soso-hyeon.tistory.com/113
[쉽게 배우는 데이터 통신과 네트워크] CH15. 전자 메일
01 전자 메일 사용자 환경메일 편집: 메시지를 새로 작성하거나, 수신 메일에 대해 회신하거나 수신 메일을 제3자에게 전달할 때 필요하다.메일 내용 읽기: 수신한 메일의 내용이 일반 텍스트로
soso-hyeon.tistory.com
'CS > Network' 카테고리의 다른 글
[Chapter 16] 파일 전송 (파일 전송을 위한 사용자 환경) (0) | 2025.02.19 |
---|---|
[Chapter 15] 전자 메일 (POP 서비스) (0) | 2025.02.19 |
[Chapter 15] 전자 메일 (전자 메일 시스템 구조) (0) | 2025.02.19 |
[Chapter 15] 전자 메일 (메일 처리) (0) | 2025.02.19 |
[Chapter 14] DNS (DNS 프로토콜) (0) | 2025.02.18 |