위키백과에서 SMTP 설명 살펴보기
SMTP(간이 우편 전송 프로토콜, Simple Mail Transfer Protocol)은 인터넷에서 이메일을 보내기 위해 만들어진 프로토콜이다. 사용하는 TCP 포트번호는 25번이고 텍스트 기반의 통신 방식을 사용한다.
SMTP 방식은 모든 문자를 7bit ASCII로 처리해야한다고 규정되어 있는데 이 때문에 8bit 이상의 코드를 사용하는 언어나 첨부파일 등은 마임(MIME)이라고 불리는 방식으로 7bit 형식으로 변환하여 전송한다.
Spring dependency
Java와 Spring에서 메일 발송을 하기 위해 필요한 의존성은 다음과 같다.
javax.mail.mail
org.springframework.spring-context-support
pom.xml에 다음과 같이 추가한다.
<dependencies>
<!-- 중간 생략 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<!-- 중간 생략 -->
</dependencies>
SMTP 서버 구축
윈도우 서버나 리눅스 등의 운영체제에서는 기본적으로 SMTP 서버 구축을 지원한다.
또한 애플리케이션으로 SMTP 서버를 구축하는 방법도 있다(ex : Apache James)
하지만 직접 만든 서버는 도메인을 등록하기 전까지는 스팸으로 필터링되는 등 상용 서비스에 이용하기 위한 절차가 복잡하다.
따라서, 이 문서에서는 상용 SMTP 서비스(ex : Gmail)을 이용하여 메일을 발송하는 방법에 대해서 다룬다.
Gmail SMTP 사용 설정
Spring에서 Gmail을 이용하려면 보안 수준이 낮은 앱 접근 허용 설정을 해야한다.
여기 를 눌러서 설정 페이지로 이동할 수 있다.
Spring에서 Gmail을 발송하면 Gmail 입장에서는 외부 액세스이므로 이를 허용해야 한다.
JavaMailSender는 인터페이스 형태이며, 실제 구현체는 JavaMailSenderImpl이다.
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
senderImpl에 다음 정보를 설정한다.
Host : 이메일 서버의 주소를 설정한다.
Gmail의 경우 smtp.gmail.com으로 설정한다.
Naver의 경우 smtp.naver.com으로 설정한다.
Port : 이메일 서버의 포트를 설정한다.
587번 포트는 SSL 포트
465번 포트는 TLS 포트
Username : 이메일 서비스 계정을 설정한다.
Password : 이메일 서비스 계정의 비밀번호를 설정한다.
메일 작성
전송 도구를 생성했으면 이번에는 메시지를 작성해야 한다.
메시지는 다음 두 가지 형태로 사용한다.
SimpleMailMessage : 간편한 텍스트 메시지를 전송
MimeMessage : 다양한 형태의 메시지를 전송
현재 테스트 코드에서는 SimpleMailMessage를 사용한다.
SimpleMailMessage message = new SimpleMailMessage();
//.. 메시지 관련 설정
sender.send(message);
작성된 메시지는 JavaMailSender의 send() 를 이용하여 발송하며, 정보가 올바르지 않을 경우 예외가 발생한다.
메일 정보 설정
메일에는 다음 정보들을 설정할 수 있다.
수신자(to)
복수 지정 가능
참조(cc)
복수 지정 가능
숨은 참조(bcc)
복수 지정 가능
발신자(from)
외부 메일 서비스를 이용할 경우 사용 불가
제목(subject)
내용(text)
SSL vs TLS
SSL(Secure Socket Layers) 과 TLS(Transport Layer Security)는 모두 네트워크를 통해 작동하는 서버, 시스템, 응용프로그램 간의 인증 및 데이터 암호화를 제공하는 암호화 프로토콜이니다. SSL이 더 이전에 나온 프로토콜이며 TLS는 SSL 3.0을 기반으로 만들진 프로토콜이다.
SSL은 취약점이 발견되어 사용 중지되어가는 추세이며, TLS를 사용할 것을 권장하고 있다.