SMTP
From CS Wiki
Simple Mail Transfer Protocol
SMTP는 인터넷에서 이메일을 보내기 위해 이용되는 프로토콜이다. 현대까지 널리 사용되는 프로토콜로, TCP 25번의 잘 알려진 포트를 사용하고 있다.
- 주로 이메일을 보내는 데 사용되며, 수신된 이메일을 저장하고 관리하는 것은 다른 프로토콜(IMAP, POP3 등)이 담당한다.
주요 기능 및 특징
- 이메일 전송: SMTP는 클라이언트가 작성한 이메일을 지정된 수신자의 이메일 서버로 전달한다. 이 과정에서 발신자 주소, 수신자 주소, 메일 본문 등을 서버로 보내는 역할을 한다.
- 텍스트 기반 프로토콜: SMTP는 텍스트 기반의 명령어를 사용하여 통신한다. 각 명령어는 서버와 클라이언트 간의 명확한 대화를 가능하게 한다. 예를 들어, HELO(서버에 인사), MAIL FROM(발신자 지정), RCPT TO(수신자 지정), DATA(이메일 본문 전송) 등의 명령어가 사용된다.
- 연결 설정: SMTP는 이메일을 전송하기 전에 클라이언트와 서버 간에 TCP 연결을 설정하고, 전송이 완료된 후에는 연결을 종료한다. 보통 포트 25번을 사용하여 통신하지만, 보안이 강화된 SMTP over SSL(SMTPS)는 포트 465 또는 587번을 사용한다.
- 다중 수신자 지원: SMTP는 한 번에 여러 명의 수신자에게 이메일을 보낼 수 있다. 여러 명의 수신자를 지정할 때, CC(Carbon Copy)나 BCC(Blind Carbon Copy)를 사용하여 각각의 수신자에게 메일을 전달할 수 있다.
- 스팸 필터링 및 인증: 현대 SMTP 서버는 스팸 메일을 필터링하거나, 발신자 인증을 통해 보안을 강화하는 기능도 추가로 지원한다. 인증되지 않은 사용자가 서버를 통해 이메일을 보내는 것을 방지하기 위해 SPF(Sender Policy Framework), DKIM(DomainKeys Identified Mail), DMARC(Domain-based Message Authentication, Reporting & Conformance) 등의 기술을 함께 사용한다.
동작 흐름
기본 동작
- 클라이언트와 서버 간 연결: 이메일 클라이언트가 SMTP 서버에 연결을 요청하고, 서버는 이를 받아들인다.
- 이메일 전송: 클라이언트는 이메일 발신자 정보, 수신자 정보, 본문 등의 데이터를 SMTP 명령어를 사용하여 서버에 전달한다.
- 이메일 수신자 서버로 전달: SMTP 서버는 수신자의 도메인을 확인한 후, 해당 수신자의 이메일 서버로 이메일을 전송한다.
- 연결 종료: 이메일이 성공적으로 전송되면 SMTP 서버는 클라이언트와의 연결을 종료한다.
상세 명령
- TCP 연결 설정: 클라이언트와 서버 간 TCP 3-way handshake로 연결 설정.
- EHLO/HELO: 클라이언트가 서버에 자신을 소개.
- 클라이언트가 서버에 연결을 설정한 후, HELO(또는 EHLO) 명령어를 통해 자신을 서버에 소개한다.
- HELO는 SMTP 초기 명령어이고, EHLO는 확장된 기능을 지원하는 경우 사용된다.
- C: EHLO example.com
- S: 250-Hello example.com
- S: 250-SIZE 35882577
- S: 250-8BITMIME
- S: 250-STARTTLS
- S: 250 OK
- MAIL FROM: 발신자 이메일 주소 전송.
- C: MAIL FROM:<[/cdn-cgi/l/email-protection [email protected]]>
- S: 250 OK
- RCPT TO: 수신자 이메일 주소 전송.
- C: RCPT TO:<[/cdn-cgi/l/email-protection [email protected]]>
- S: 250 OK
- C: RCPT TO:<[/cdn-cgi/l/email-protection [email protected]]>
- S: 250 OK
- DATA: 이메일 본문과 헤더 전송, 마지막에 마침표로 전송 완료 알림.
- C: DATA
- S: 354 Start mail input; end with <CRLF>.<CRLF>
- C: From: [/cdn-cgi/l/email-protection [email protected]]
- C: To: [/cdn-cgi/l/email-protection [email protected]], [/cdn-cgi/l/email-protection [email protected]]
- C: Subject: Test email
- C:
- C: This is the body of the email.
- C: .
- S: 250
- OK: queued as 12345
- QUIT: 연결 종료 명령 전송.
- C: QUIT
- S: 221 Bye
- TCP 연결 종료: 클라이언트와 서버 간 TCP 4-way handshake로 연결 종료.