SMTP 프로토콜이란

노로로·2022년 3월 4일
0

smtp

목록 보기
1/1

후...
메일을 전송해주는 거 테스트를 해야한다고 한다... 나는 아무것도 모르는데, 공부를 해야겠다. smtp라고 하는데 이거는 무엇일까..

👩‍🍳 일단 SMTP는 무엇인가.

Simple Mail Transfer Protocol 간이 메일 전송 프로토콜, 인터넷에서 이메일을 보내기 위해 이용되는 TCP/IP 프로토콜이라고 한단다. 사용하는 TCP 포트번호는 25..

TCP/IP 분명 공부했었는데 딱 설명을 못하겠다.
TCP/IP는 OSI 7 Layer 중에서 Layer3(Network-IP), Layer4(Transport-TCP)를 다루는 프로토콜이다. TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달을 보장하고 순서대로 받도록 해준다.
TCP/IP는 IP 주소를 따르고 TCP의 특성을 활용해 송신자와 수신자의 논리적 연결을 생성하고 신뢰성을 유지할 수 있는 ...것이다
나중에 다시 정리해보자.

아무튼 대부분의 시스템이 메일을 전송하는 방법으로 SMTP를 사용한다. SMTP는 푸시 프로토콜?이며, 메일을 보내는 데 사용되는 반면 POP(우편) 또는 IMAP(인터넷 메시지 액세스 프로토콜)은 수신자 측에서 해당 메일을 검색하는 데 사용된다.

메일 규격(format)은 RFC 822번 (추후 RFC 2822번으로 개정)
TCP Port는 주로 25, 587번도 사용

SMTP 구성요소

User Agents(UA) : 사용자 에이전트 = 메일 리더
Mail Transfer Agent(MTA) : 메일을 전송하기 위한 에이전트

👩‍🏫 Gmail은 SMTP 프로토콜 어떻게 하냐

(참고..https://shxrecord.tistory.com/118)

  1. mail.jar 라이브러리 : 메일을 보내기 위해서 필요한 라이브러리라고 한다.

  2. 다운받은 mail.jar 파일을 프로젝트의 WEB-INF>lib 폴더에 넣어준다.

  3. Gmail SMTP 사용하려면 계정 설정을 해주어야 한다.

  4. 인증(auth) 부분, 보내기(send) 부분 나누어서 구현을 하나보다.


MailAuth.java

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

// Authenticator 을 상속
public class MailAuth extends Authenticator {
	// 
	PasswordAuthentication pa;
    
    // 생성자
    public MailAuth() {
    	String mail_id = "gmail 아이디";
        String mail_pw = "패스워드";
        
        pa = new PasswordAuthentication(mail_id, mail_pw);
    }
    
    // 재정의
    public PasswordAuthentication getPasswordAuthentication() {
    	return pa;
    }

}

  • mail.jar 에는 javax.mail 패키지가 들어있다.
  • javax.mail 패키지의 주요 클래스는 Session, Message, Address, Authenticator, Tranport 등이 있다.
  • SMTP 서버에 연결해 사용자 인증을 하기 위해서는 Authenticator 클래스 사용이 필요하다.
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
  • Authenticator 를 사용하기 위해 PasswordAuthenticator 클래스로부터 인스턴스(pa)를 생성하고 메소드(getPasswordAuthenticator)로 리턴받는다.
  • PasswrodAuthentication 클래스는 사용자의 아이디와 패스워드를 입력받는다.

MailSend.java

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MailSend {

	public void MailSend() {
    	// Properties 클래스 : Hashtable을 상속받은 클래스 key: value로...
    	Properties prop = System.getProperties();
        
        // TLS와 SSL 의 사용에 따라 설정값이 다르다. 이거는 TLS경우
        // https://stackoverflow.com/questions/20290625/javamail-javax-mail-authenticationfailedexception 참조
        prop.put("mail.smtp.starttls.enable", "true"); // 로그인 시 TLS 사용할 것인지
        prop.put("mail.smtp.host", "smtp.gmail.com"); // SMTP 서버
        prop.put("mail.smtp.auth", "true"); // SMTP 서버 인증 사용한다는 의미
        prop.put("mail.smtp.port", "587"); // TLS 포트, SSL은 465
        
        // MailAuth.java에서 ...
        Authenticator auth = new MailAuth();
        
        // prop(메일처리환경), auth(Authenticator) 가지고 세션 생성
        Session session = Session.getDefaultInstance(prop, auth);
        
        // 세션 담아서 msg 객체 생성
        MimeMessage msg = new MimeMessage(session);
        
        try {
        	msg.setSentDate(new Date());
            
            // 발송자(발송자 메일, 발송자명)
            msg.setFrom(new InternetAddress("from123@gmail.com", "VISITOR"));
            
            // 수신자 메일 생성
            InternetAddress to = new InternetAddress("to123@gmail.com");
            // RecipientType.TO : 받는사람
            // RecipientType.CC : 참조
            // RecipientType.BCC : 숨은 참조
            msg.setRecipient(Message.RecipientType.TO, to);
            
            // 메일 제목
            msg.setSubject("제목", "UTF-8");
            
            // 메일 내용
            msg.setText("안녕하세요 메일내용...", "UTF-8");
            
            // Transport는 메일을 최종적으로 보내는 클래스
            Transport.send(msg);
            
        } catch(AddressException ae) {
        	System.out.println("AddressException : " + ae.getMessage());
        } catch(MessagingException me) { // 메일 계정인증 관련 예외 처리
        	System.out.println("MessagingException : " + ma.getMessage());
        } catch(UnsupportedEncodingException e) { // 지원되지 않는 인코딩 사용할 경우 예외처리
        	System.out.println("UnsupportedEncodingException : " + e.getMessage());
        }
        
    }

}

💪 TLS / SSL 은 뭐지

인터넷 보안의 일부인가보다. SSL은 Secure Socket Layers, TLS 는 Transport Layer Security 이다.
SSL, TLS는 네트워크를 통해 작동하는 서버, 응용 프로그램 간에 인증 및 데이터 암호화를 제공하는 암호화 프로토콜이다. SSL 은 TLS 이전의 프로토콜이다.

SSL 2.0, 3.0 모두 사용 중지... 취약점이 발견되어서, URL 표시 줄의 자물쇠 또는 보안 경고가 있다. TLS 프로토콜만 사용하도록 해야함...

인증서는 프로토콜과 다르다?
SSL 인증서를 TLS 인증서로 대체해야하기 전에 인증서는 프로토콜에 의존하지 않는다!! 인증서는 대체하지 않아도 되나보다.


참고
https://aws-hyoh.tistory.com/entry/TCPIP-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
https://m.blog.naver.com/dreamxpeed/222133557330
https://peemangit.tistory.com/57
https://shxrecord.tistory.com/118
https://smartits.tistory.com/209

profile
개발자가 되어보자

0개의 댓글