본문 바로가기

Protocol

SMTP를 알아보자

 

서버에서 이메일 전송하는 걸 구현하기 위해 알아보던 중.. SMTP를 사용하게 되었는데

평소에 아웃룩에서 설정할 때나 사내 메일을 설정할 때도 봤던 친구라 간단히 정리해보려고 한다

 

- SMTP란 무엇인지

- SMTP 서버가 뭔지

- SMTP&DNS

- SMTP 사용 Port

- SMTP 라이브러리


1. SMTP (Simple Mail Transfer Protocol)

위키백과: 간이 전자 우편 전송 프로토콜은 인터넷에서 이메일을 보내기 위해 이용되는 프로토콜이다.

풀네임을 해석한 정말 간단한 설명이다

보통 SMTP는 메일서버끼리 메일을 주고받거나,

아니면 SMTP 서버(ex. gmail, naver)에 메일 클라이언트가 연결을 맺고 다른 서버에 메일을 보내는 형식으로 사용된다

 

특징만 간단히 정리하면 다음과 같다

- 텍스트 기반 프로토콜

- 프로토콜은 TCP(SSL/TLS)

- SMTP 서버와 클라이언트로 구성

 

통신 방법은 SMTP 서버를 공부하면 쉽게 알 수 있다

(SMTP의 더 자세한 내용은 난 안 필요하다)

 

 

2. SMTP 서버

보통의 서버를 생각하면, 클라이언트의 요청을 받는 무언가로 나는 생각을 한다

클라이언트의 요청을 받으면 누군지 보고 받아줄지 거절할지도 보기도 하고,

다른 서버로 가라고 하거나, 원하는 정보를 내려주기도 한다

 

그러면 SMTP의 서버와 클라이언트는 뭐지?

이메일을 보낼 때도 마찬가지로, 예를 들어 메일을 보내는 사람이 sender@gmail.com이고

메일을 받는 사람이 receiver@naver.com 일 때를 보겠다

 

이메일을 보내는 sender@gmail.com은 SMTP 클라이언트가 될 것이고

gmail.com 주소는 이메일을 송수신하는 SMTP 서버로 부른다 

(gmail의 SMTP 서버 주소는 smtp.gmail.com 이고 naver의 SMTP 서버 주소는 smtp.naver.com 이다)

 

그러면 SMTP 클라이언트는 메일을 받는 상대방인가 하하 놉

그런 줄 알았는데, 받는 receiver@naver.com의 naver.com도 SMTP 서버라고 부른다

 

SMTP와 IMAP (링크있츰)

(IMAP이란 거는 잘 모를 거다)

위에 그림을 참고하자면, SMTP 서버(gmail)--> SMTP 서버(naver)로 메일을 보내고 있는 모양이고

gmail과 naver는 SMTP 서버를 각각 다른 걸 쓰고 있는 거다,, 사실 이게 끝이다

 

프로토콜은 그냥 동네방네에서 쓰는 각자의 전송 방법을 정리해둔 게 다니까,,

그러면 naver.com이랑 gmail.com은 누가 어떻게 알고 메일을 데려다주는 걸까?

 

3. SMTP & DNS

위키백과: 도메인 네임 시스템(Domain Name System, DNS)은 호스트의 도메인 이름을 호스트의 네트워크 주소로 바꾸거나 그 반대의 변환을 수행할 수 있도록 하기 위해 개발되었다. 

DNS(Domain Name System)은 간단하게 말하자면,,

우리가 인터넷 주소창에 "www.naver.com"을 입력을 하면 "www.naver.com"이라는 이름을

실제 가야 하는 네트워크 주소(ex.111.111.111.111)로 바꿔주거나 반대로 바꿔주는 시스템이다

 

naver.com과 gmail.com도 원래는 자기 자신의 네트워크 주소를 갖고 있는데,

자신들의 이름을 DNS 서버에 등록만 해준 거다

 

맘에드는 그림이 없어서 대충 만들었다,,

SMTP를 사용해서 이메일을 전송할 때도, DNS를 거치게 되는데

보내는 사람이 SMTP 서버로 접근을 하게 되면, SMTP 서버는 DNS를 통해 받는 사람의 주소를 알 수 있다

(그림은 간단한데 사실 더 복잡하다. 이름이 여러 개일 수도 있으니까)

 

그냥 어떻게 이름을 알고 쓰나 해서 알아봤다,,

 

 

4. SMTP 사용 Port

그래서 SMTP 서버에는 그럼 어떤 주소로 접근을 해야할까

위에서도 잠깐 얘기했지만, SMTP 서버는 자기들만의 주소가 이미 있다 (smtp.xxx.com 이런거)

자기만의 SMTP 서버 만들고 싶으면 돈내고 사면 된다 아주 간단하다

 

그러면 주소는 있고, Port만 알면 되는거다

검색하면 다 나오는데 내가 볼려고 적어 놓을거다

 

기본 TCP 포트: 25

TLS 포트: 587

SSL 포트: 465

 

되시겠다.

 

 

5. SMTP 라이브러리

SMTP 클라이언트 시뮬을 만들어서 테스트하려고 알아봤다

나는 이중에서 libquickmail을 이용해서 테스트해보았다 ( language는 C로 했다 )

 

1) libquickmail

2) libcurl

보통 라이브러리 쓰는 형식을 보니까, 

이메일에서 사용하는 To/CC/From 주소를 api를 통해서 파라미터로 설정해주고 있고

메일을 보내는 api를 부를 때 smtp 서버 주소도 넘겨주고 있다

 

ex) mail_send("smtp.example.com", "smtp 접속 port", "receiver@naver.com", "smtp 접속 id", "smtp 접속 비번" ...)

너무 당연하다

 

libquickmail 라이브러리 사용해서 테스트만 간단하게 했는데,

사실 libquickmail에서 제공하는 샘플 코드라 의미는 없다

 

#include "quickmail.h"
#include <stdio.h>

#define FROM        "test_send@example1.com"
#define TO          "test_recv@example2.com"

#define SMTPSERVER  "smtp.example1.org"

#define SMTPPORT        25
#define SMTPTLSPORT     587
#define SMTPSSLPORT     465

#define SMTPUSER        "user"
#define SMTPPASS        "pass"

int main ()
{
  printf("libquickmail %s\n", quickmail_get_version());
  quickmail_initialize();
  quickmail mailobj = quickmail_create(FROM, "libquickmail test e-mail");

  quickmail_add_to(mailobj, TO);
  quickmail_set_body(mailobj, "안녕하세요\nThis mail was sent using libquickmail.");

  const char* errmsg;
  quickmail_set_debug_log(mailobj, stderr);

#if 0
  errmsg = quickmail_send(mailobj, SMTPSERVER, SMTPPORT, SMTPUSER, SMTPPASS);
#else
  errmsg = quickmail_send_secure(mailobj, SMTPSERVER, SMTPSSLPORT, SMTPUSER, SMTPPASS);
#endif
  if( errmsg != NULL ) {
    fprintf(stderr, "Error sending e-mail: %s\n", errmsg);
  }
  quickmail_destroy(mailobj);
  quickmail_cleanup();

  return 0;
}

mailobj라는 quickmail 객체하나 만들어서 값 셋팅, 셋팅, 보내줘로 간단하게 사용할 수 있었다

실제 메일을 보내는건 quickmail_send() 또는 quickmail_send_secure()라는 걸 사용하는데,

차이는 TCP로 보낼건지 SSL/TLS로 보낼건지에 대한 차이일 뿐이다

 

SMTPUSER와 SMTPPASS는 SMTP 서버로 접근할 때 아이디와 비번이다

 

실행해보면

실행화면쓰

요런 모양이 나오는데, 

좌측에 < > 요런 기호들은 내가 보낸거가 > 요거를 쓰고, < 이거로 온거는 smtp 서버에서 받은 응답을 뜻한다

그리고 220, 250 요런거는 smtp 서버가 준 응답 코드이다. 2.1.0 이런거도 응답코드 설명보면 나옴

(응답코드는 아래 참고 사이트들에 올려놓겠다)

 

중간에 DATA 이런 내용이 나오는데, SMTP가 텍스트를 보내는거이니까,

DATA를 쓰면 메시지 텍트스트이 첫 신호다라는 약속이다

 

요런 식으로 간단하게 보내고 받을 수 있다 ㅋ

 


엄청 간단한 프로토콜이라 사실 정리할게 많이 없었다

send()하면 끝나는거라;

깊게 파면 물론 알아야할 거 엄청 많음

 

시간나면 DNS도 더 찾아봐야겠다 (안하겠다는 뜻)

 


* 위키백과

ko.wikipedia.org/wiki/%EA%B0%84%EC%9D%B4_%EC%9A%B0%ED%8E%B8_%EC%A0%84%EC%86%A1_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C

 

간이 우편 전송 프로토콜 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 간이 전자 우편 전송 프로토콜(Simple Mail Transfer Protocol, SMTP)은 인터넷에서 이메일을 보내기 위해 이용되는 프로토콜이다. 사용하는 TCP 포트번호는 25번이다. 상

ko.wikipedia.org

ko.wikipedia.org/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8_%EB%84%A4%EC%9E%84_%EC%8B%9C%EC%8A%A4%ED%85%9C

 

도메인 네임 시스템 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 도메인 네임 시스템(Domain Name System, DNS)은 호스트의 도메인 이름을 호스트의 네트워크 주소로 바꾸거나 그 반대의 변환을 수행할 수 있도록 하기 위해 개발되었

ko.wikipedia.org

* SMTP Client 라이브러리 참고 자료

junho85.pe.kr/907

 

c - smtp client library

GNU Mailutils GNU Mailutils curl curl github 사용법이 간단한편이다. curl 은 보통 http 요청 할 때 많이 사용하는데, curl 을 종종 사용하는 사람들 조차도 smtp 가 된다는 사실에 놀라곤 한다. 문제점 수신자..

junho85.pe.kr

* SMTP 응답코드

blog.naver.com/ncloud24/220946070335

 

SMTP 응답코드 및 유형

[SMTP 응답코드] 211 : 시스템 상태 또는 시스템 도움말 응답 214 : 도움말 메시지 220 : 도메인 서비...

blog.naver.com

* SMTP 그림 참고한거

www.socketlabs.com/blog/smtp-or-imap/

 

SMTP or IMAP: What’s the Difference? [Bonus: What is POP3?] | SocketLabs

Should you be using SMTP or IMAP? Find out the difference between the two email protocols in this article.

www.socketlabs.com

 

'Protocol' 카테고리의 다른 글

UDP를 알아보자  (0) 2021.07.08
SOAP을 알아보자  (0) 2021.06.10
HTTP Chunked Message를 알아보자  (0) 2021.03.09