[Network] 메일은 어떻게 발송되는가

한호성·2024년 2월 27일
0

응용프로그램을 통해, 메일을 보내는 방법은 알고 있으나, 실제로 어떤 과정을 거쳐 메일이 오고가는지, 작동원리에 대해 알아보도록 하겠습니다.
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교시 메일서버: 메일서버 개념과 실습환경의 이해

profile
개발자 지망생입니다.

0개의 댓글