
SMTP (Simple Mail Transfer Protocol)은 이메일을 보내기 위한 인터넷 표준 프로토콜이다.
주로 이메일 클라이언트(예: Gmail, Outlook), 서버(예: Naver Mail Server) 간의 메일 전송을 처리한다.
이메일을 전 세계 어디로든 전송할 수 있음
신뢰성 있는 전송 방식
POP3, IMAP과 다르게 ‘보내기’에 특화됨
[사용자]
↓ 작성한 메일
[클라이언트 앱 or 백엔드 서버]
↓ SMTP 연결 (인증, 전송)
[SMTP 서버 (ex. Gmail)]
↓
[수신자의 메일 서버]
↓
[수신자 (POP3/IMAP으로 받음)]
| 구성요소 | 설명 |
|---|---|
| SMTP 서버 | 메일을 대신 전송해주는 서버 |
| 포트 번호 | 587 (TLS), 465 (SSL), 25 (비보안) |
| 인증 | 사용자 이메일과 비밀번호 (앱 비밀번호 사용) |
| TLS/SSL | 메일 전송 중 데이터를 암호화 |
SMTP 서버 정보를 설정
인증 정보(이메일, 비밀번호) 입력
메일 제목, 본문, 수신자 등 작성
SMTP 서버를 통해 전송
서버가 수신자의 메일 서버로 전달
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); // 예외 처리
}
}
}
| 분야 | 설명 |
|---|---|
| 회원가입 | 인증 메일 전송 (ex. "이메일을 인증해 주세요") |
| 비밀번호 찾기 | 재설정 링크 전송 |
| 마케팅 | 뉴스레터, 이벤트, 광고 메일 발송 |
| 시스템 알림 | 서버 상태, 오류 로그 등 자동 알림 |
Google 등은 일반 비밀번호 사용을 차단 → 앱 비밀번호 사용 필수
TLS(587) 또는 SSL(465)로 반드시 암호화
SMTP 서버 정보는 .env 같은 설정 파일에 보관하여 외부 노출 방지
SMTP는 이메일 전송을 담당하는 핵심 프로토콜
인증 + 서버 설정 + 메시지 구성 → 전송이라는 단순한 로직
Java 코드로 쉽게 구현 가능하며, 다양한 상황에서 활용
보안 설정과 계정 인증은 실무에서 매우 중요