SMTP

Kingyj·2025년 6월 15일


🐤 SMTP?

SMTP (Simple Mail Transfer Protocol)은 이메일을 보내기 위한 인터넷 표준 프로토콜이다.
주로 이메일 클라이언트(예: Gmail, Outlook), 서버(예: Naver Mail Server) 간의 메일 전송을 처리한다.

SMTP를 사용하는 이유

  • 이메일을 전 세계 어디로든 전송할 수 있음

  • 신뢰성 있는 전송 방식

  • POP3, IMAP과 다르게 ‘보내기’에 특화됨


🐤 SMTP 작동 원리

[사용자] 
   ↓ 작성한 메일 
[클라이언트 앱 or 백엔드 서버]
   ↓ SMTP 연결 (인증, 전송)
[SMTP 서버 (ex. Gmail)]
   ↓
[수신자의 메일 서버]
   ↓
[수신자 (POP3/IMAP으로 받음)]

SMTP 구성요소 설명

구성요소설명
SMTP 서버메일을 대신 전송해주는 서버
포트 번호587 (TLS), 465 (SSL), 25 (비보안)
인증사용자 이메일과 비밀번호 (앱 비밀번호 사용)
TLS/SSL메일 전송 중 데이터를 암호화

🐤 이메일 전송 로직

  1. SMTP 서버 정보를 설정

  2. 인증 정보(이메일, 비밀번호) 입력

  3. 메일 제목, 본문, 수신자 등 작성

  4. SMTP 서버를 통해 전송

  5. 서버가 수신자의 메일 서버로 전달

Java 코드 예제

import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;

public class SmtpEmailSender {

    public static void main(String[] args) {

        // 1. SMTP 서버 정보와 사용자 인증 정보 설정
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");             // Gmail SMTP 서버
        props.put("mail.smtp.port", "587");                         // TLS 포트
        props.put("mail.smtp.auth", "true");                        // 인증 필요 여부
        props.put("mail.smtp.starttls.enable", "true");             // TLS 활성화

        // 2. 사용자 인증을 위한 세션 생성
        Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("your_email@gmail.com", "your_app_password"); 
                // 실제 비밀번호 대신 앱 비밀번호 사용
            }
        });

        try {
            // 3. 메일 내용 구성
            Message message = new MimeMessage(session);             // 메시지 객체 생성
            message.setFrom(new InternetAddress("your_email@gmail.com"));  // 보내는 사람
            message.setRecipients(
                Message.RecipientType.TO,
                InternetAddress.parse("recipient@example.com")      // 받는 사람
            );
            message.setSubject("Test Email from Java App");         // 메일 제목
            message.setText("Hello! This is a test email sent via SMTP in Java."); // 본문

            // 4. 메일 전송
            Transport.send(message);

            System.out.println("이메일 전송 완료!");

        } catch (MessagingException e) {
            e.printStackTrace(); // 예외 처리
        }
    }
}
@Service
@RequiredArgsConstructor
public class MailService {

    private final JavaMailSender mailSender; // 이메일 전송 객체 주입 (SMTP 백엔드 사용)

    public void sendVerificationEmail(User user) {
        String to = user.getEmail(); // 수신자 이메일
        String subject = "[Project-A] 이메일 인증을 완료해주세요";
        String verificationLink = "http://localhost:8080/api/auth/verify-email?token=" + user.getEmailVerificationToken();

        // HTML 형식 이메일 내용
        String body = "<h1>이메일 인증</h1>"
                + "<p>안녕하세요, " + user.getNickname() + "님!</p>"
                + "<p>아래 링크를 클릭하여 이메일 인증을 완료해주세요.</p>"
                + "<a href='" + verificationLink + "'>이메일 인증하기</a>";

        try {
            MimeMessage message = mailSender.createMimeMessage(); // 이메일 객체 생성
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setTo(to); // 수신자 설정
            helper.setSubject(subject); // 제목
            helper.setText(body, true); // 본문 (HTML 사용)

            mailSender.send(message); // 실제 전송 (SMTP로 전송됨)

        } catch (MessagingException e) {
            throw new RuntimeException("메일 전송에 실패했습니다.", e); // 예외 처리
        }
    }
}

SMTP 사용 사례

분야설명
회원가입인증 메일 전송 (ex. "이메일을 인증해 주세요")
비밀번호 찾기재설정 링크 전송
마케팅뉴스레터, 이벤트, 광고 메일 발송
시스템 알림서버 상태, 오류 로그 등 자동 알림

고려할 보안 사항

  • Google 등은 일반 비밀번호 사용을 차단 → 앱 비밀번호 사용 필수

  • TLS(587) 또는 SSL(465)로 반드시 암호화

  • SMTP 서버 정보는 .env 같은 설정 파일에 보관하여 외부 노출 방지


🐤 결론 및 요약

  • SMTP는 이메일 전송을 담당하는 핵심 프로토콜

  • 인증 + 서버 설정 + 메시지 구성 → 전송이라는 단순한 로직

  • Java 코드로 쉽게 구현 가능하며, 다양한 상황에서 활용

  • 보안 설정과 계정 인증은 실무에서 매우 중요


0개의 댓글