본문 바로가기

JAVA

[JAVA] 이메일 인증 구현하기

728x90
반응형

SpringBoot/JAVA 환경에서 이메일 인증 기능을 구현하고자 한다. 각각 구글과 네이버의 SMTP 서버를 사용하고 전송 데이터에 텍스트뿐만이 아닌 HTML을 넣어서 전송하는 이메일 인증 기능을 구현해 볼 것이다.

 

 

 

 

 

 

1. SMTP 서버 설정

우선 구글에서 설정하는 법이다. 

우선 구글 로그인 후 구글 계정 관리로 들어간다. 그리고 아래 사진과 같이 검색 창에 '앱 비밀번호' 를 입력한다.

 

 

 

 

앱 비밀번호 창에서 원하는 앱 이름을 입력하고 만들어주면 앱 비밀번호가 생성이 된다.

해당 비밀번호를 복사하여 따로 잘 저장해두면 구글 SMTP 설정은 끝났다.

 

 

 

 

다음으로 네이버에서 설정하는 법이다.

네이버 로그인 후 메일 환경설정에서 POP3/IMAP 설정 탭으로 이동해 준 뒤 아래 사진과 같이 설정 후 저장하면 된다.

 

 

 

 

네이버엔 POP3와 IMAP 2가지 방식이 있는데 이에 대해 네이버에서 정리한 내용이니 참고해 주자

https://help.worksmobile.com/ko/use-guides/mail/settings/pop3-imap-smtp/

 

POP3/IMAP - 네이버웍스

메일 프로그램에서 POP3/SMTP 또는 IMAP/SMTP를 설정하여 네이버웍스 메일을 보내고 받을 수 있습니다. 단, 관리자가 사용을 허용하지 않은 경우 '' 설정이 노출되지 않습니다. IMAP과 POP3의 차이점 IMAP

help.worksmobile.com

 

반응형

 

 

 

 

 

 

 

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();
    }
}

 

 

 

메일 전송을 실행했을 때 오류 메시지가 발생하면 아래 사이트를 참고해 주면 된다.

 

마이메일러 I SaaS형 대량메일 솔루션

독립서버, 고정 IP제공, 발송량에 따라 분산서버 확장 가능

mymailer.io

 

728x90

 

 

 

 

 

 

 

 

전체 코드는 아래와 같다. 

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();
		}
	}

}

 

 

 

 

 

이제 실행 후 전송할 이메일로 가서 확인을 해보면 전송이 잘된 것을 확인할 수 있다.

 

Google SMTP

 

 

Naver SMTP

 

 

 

 

 

 

 

 

 

 

728x90
반응형

'JAVA' 카테고리의 다른 글

[JAVA] HttpURLConnection, HttpClient 사용하기  (0) 2024.07.08
[JAVA] 공공데이터 오픈 API 사용하기  (0) 2024.06.25