SpringBoot/JAVA 환경에서 이메일 인증 기능을 구현하고자 한다. 각각 구글과 네이버의 SMTP 서버를 사용하고 전송 데이터에 텍스트뿐만이 아닌 HTML을 넣어서 전송하는 이메일 인증 기능을 구현해 볼 것이다.
1. SMTP 서버 설정
우선 구글에서 설정하는 법이다.
우선 구글 로그인 후 구글 계정 관리로 들어간다. 그리고 아래 사진과 같이 검색 창에 '앱 비밀번호' 를 입력한다.
앱 비밀번호 창에서 원하는 앱 이름을 입력하고 만들어주면 앱 비밀번호가 생성이 된다.
해당 비밀번호를 복사하여 따로 잘 저장해두면 구글 SMTP 설정은 끝났다.
다음으로 네이버에서 설정하는 법이다.
네이버 로그인 후 메일 환경설정에서 POP3/IMAP 설정 탭으로 이동해 준 뒤 아래 사진과 같이 설정 후 저장하면 된다.
네이버엔 POP3와 IMAP 2가지 방식이 있는데 이에 대해 네이버에서 정리한 내용이니 참고해 주자
https://help.worksmobile.com/ko/use-guides/mail/settings/pop3-imap-smtp/
2. 메일 전송 구현
우선 build.gradle에 메일 전송을 위한 의존성을 추가해 준다.
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '2.6.3'
다음으로 랜덤코드를 생성할 메서드와 SMTP 설정을 위한 메서드를 작성해 준다.
// Main.java
// 6자리 랜덤코드 생성
public static String authRandomCode() {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 6; i++) {
if(Math.random() < 0.5) {
sb.append( (char)((int)(Math.random() * 10) + '0') );
} else {
sb.append( (char)((int)(Math.random() * 26) + 'A') );
}
}
return sb.toString();
}
SMTP 설정은 구글 또는 네이버 중 자신이 원하는 것을 선택하여 작성해 주면 된다.
Naver SMTP 설정 시엔 ssl enable을 true로 해주어야 한다.
// Main.java
// GOOGLE UserName & Password 설정
private static final String ADMIN_EMAIL = SMTP를 설정한 구글 이메일;
private static final String ADMIN_PASSWORD = SMTP를 설정한 구글 앱 비밀번호;
// NAVER UserName & Password 설정
private static final String ADMIN_EMAIL = SMTP를 설정한 네이버 이메일;
private static final String ADMIN_PASSWORD = SMTP를 설정한 네이버 로그인 비밀번호;
// SMTP 설정
private static Session sendMailSession() {
Properties props = new Properties();
// GOOGLE SMTP 설정
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
// NAVER SMTP 설정
props.put("mail.smtp.host", "smtp.naver.com");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.ssl.enable", "true");
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(ADMIN_EMAIL, ADMIN_PASSWORD);
}
});
return session;
}
SMTP 추가 설정이 필요할 경우 자신의 환경에 맞게 설정해 주면 되겠다.
이제 전송할 메시지를 작성하여 전송을 해보자.
public static void main(String[] args) {
SpringApplication.run(PopulationMapBeApplication.class, args);
try {
String authCode = authRandomCode();
Message message = new MimeMessage(sendMailSession()); // 설정한 SMTP SESSION 주입
message.setHeader("Content-Type", "text/plain; charset=UTF-8");
// 메일 송신자
message.setFrom(new InternetAddress(ADMIN_EMAIL, "시스템 관리자"));
// 메일 수신자
message.setRecipient(Message.RecipientType.TO, new InternetAddress("전송할 이메일"));
// 메일 제목
message.setSubject("[AUTH-TEST] 인증 요청 메일입니다.");
// 메일 내용
message.setText("인증번호는 " + authCode + "입니다.");
// 메일 전송
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
메일 전송을 실행했을 때 오류 메시지가 발생하면 아래 사이트를 참고해 주면 된다.
전체 코드는 아래와 같다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
@EnableScheduling
@SpringBootApplication
public class PopulationMapBeApplication {
// GOOGLE UserName & Password 설정
private static final String ADMIN_EMAIL = SMTP를 설정한 구글 이메일;
private static final String ADMIN_PASSWORD = SMTP를 설정한 구글 앱 비밀번호;
// NAVER UserName & Password 설정
private static final String ADMIN_EMAIL = SMTP를 설정한 네이버 이메일;
private static final String ADMIN_PASSWORD = SMTP를 설정한 네이버 로그인 비밀번호;
// 6자리 랜덤코드 생성
public static String authRandomCode() {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 6; i++) {
if(Math.random() < 0.5) {
sb.append( (char)((int)(Math.random() * 10) + '0') );
} else {
sb.append( (char)((int)(Math.random() * 26) + 'A') );
}
}
return sb.toString();
}
// SMTP 설정
private static Session sendMailSession() {
Properties props = new Properties();
// GOOGLE SMTP 설정
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
// NAVER SMTP 설정
props.put("mail.smtp.host", "smtp.naver.com");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.ssl.enable", "true");
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(ADMIN_EMAIL, ADMIN_PASSWORD);
}
});
return session;
}
public static void main(String[] args) {
SpringApplication.run(PopulationMapBeApplication.class, args);
try {
String authCode = authRandomCode();
Message message = new MimeMessage(sendMailSession()); // 설정한 SMTP SESSION 주입
message.setHeader("Content-Type", "text/plain; charset=UTF-8");
// 메일 송신자
message.setFrom(new InternetAddress(ADMIN_EMAIL, "시스템 관리자"));
// 메일 수신자
message.setRecipient(Message.RecipientType.TO, new InternetAddress("전송할 이메일"));
// 메일 제목
message.setSubject("[AUTH-TEST] 인증 요청 메일입니다.");
// 메일 내용
message.setText("인증번호는 " + authCode + "입니다.");
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
이제 실행 후 전송할 이메일로 가서 확인을 해보면 전송이 잘된 것을 확인할 수 있다.
'JAVA' 카테고리의 다른 글
[JAVA] HttpURLConnection, HttpClient 사용하기 (0) | 2024.07.08 |
---|---|
[JAVA] 공공데이터 오픈 API 사용하기 (0) | 2024.06.25 |