본문 바로가기
개발 지식/정리

Spring 회원가입 email 인증

by 꾸준함 2023. 4. 1.

1. Spring gradle 설정

implementation 'org.springframework.boot:spring-boot-starter-mail:2.x.x'

 

 

2. MailConfig 설정

Spring 에서 메일 서버를 사용하기 위해서는 메일 서버와 연결해야한다.

Spring 내부에서 메일을 보내고 받는 것이 아닌 smtp 메일 서버를 사용해서 메일을 보내기 때문에 Spring에서 어떤 메일 서버와 연결하는지 서버 도메인 주소, 접속 가능한 아이디, 비밀번호가 필수로 있어야한다.

→ 네이버 설정에서

 

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import java.util.Properties;

@Configuration
public class MailConfig {

    @Bean
    public JavaMailSender javaMailSender(){
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        javaMailSender.setHost("smtp.naver.com");   //smtp 서버주소
        javaMailSender.setUsername("ID");    //아이디
        javaMailSender.setPassword("xptmxm123!"); //비밀번호

        javaMailSender.setPort(465);    //메일 인증서버 포트

        javaMailSender.setJavaMailProperties(getMailProperties());  //메일 인증 서버 정보 가져오기
    }

    private Properties getMailProperties() {
        Properties properties = new Properties();
        properties.setProperty("mail.transport.protocol", "smtp");  //프로토콜 설정
        properties.setProperty("mail.smtp.auth","true");    //smtp  인증
        properties.setProperty("mail.smtp.starttls.enable", "true");    //smtp starttles 사용
        properties.setProperty("mail.debug","true");    //디버그 사용
        properties.setProperty("mail.smtp.ssl.trust","smtp.nave.com");    //ssl 인증 서버
        properties.setProperty("mail.smtp.ssl.enable","true");    //ssl 사용

        return properties;
    }
}

 

 

3. 메일 내용 작성 및 보내기 클래스(Service)

package com.example.Starbucks.Mail.service;

import lombok.RequiredArgsConstructor;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.util.Random;

@Service
@RequiredArgsConstructor
public class MailServiceImpl implements MailService{

    private final JavaMailSender mailSender;  //
    private String ePw; //인증 번호

    public MimeMessage createMessage(String to) throws MessagingException, UnsupportedEncodingException{
        MimeMessage message = mailSender.createMimeMessage();

        message.addRecipients(Message.RecipientType.TO,to); //보내는 대상
        message.setSubject("회원가입 인증 메일"); // 제목

        String msgg = "";
        msgg += "<div style='margin:100px;'>";
        msgg += "<h1> 안녕하세요</h1>";
        msgg += "<h1> test 입니다</h1>";
        msgg += "<br>";
        msgg += "<p>아래 코드를 회원가입 창으로 돌아가 입력해주세요<p>";
        msgg += "<br>";
        msgg += "<div align='center' style='border:1px solid black; font-family:verdana';>";
        msgg += "<h3 style='color:blue;'>회원가입 인증 코드입니다.</h3>";
        msgg += "<div style='font-size:130%'>";
        msgg += "CODE : <strong>";
        msgg += ePw + "</strong><div><br/> "; // 메일에 인증번호 넣기
        msgg += "</div>";
        message.setText(msgg, "utf-8", "html");// 내용, charset 타입, subtype
        // 보내는 사람의 이메일 주소, 보내는 사람 이름
        message.setFrom(new InternetAddress("ID", "test"));// 보내는 사람

        return message;

    }

    // 랜덤 인증 코드 전송
    public String createKey() {
        StringBuffer key = new StringBuffer();
        Random rnd = new Random();

        for (int i = 0; i < 8; i++) { // 인증코드 8자리
            int index = rnd.nextInt(3); // 0~2 까지 랜덤, rnd 값에 따라서 아래 switch 문이 실행됨

            switch (index) {
                case 0:
                    key.append((char) ((int) (rnd.nextInt(26)) + 97));
                    // a~z (ex. 1+97=98 => (char)98 = 'b')
                    break;
                case 1:
                    key.append((char) ((int) (rnd.nextInt(26)) + 65));
                    // A~Z
                    break;
                case 2:
                    key.append((rnd.nextInt(10)));
                    // 0~9
                    break;
            }
        }

        return key.toString();
    }

    // 메일 발송
    // sendSimpleMessage 의 매개변수로 들어온 to 는 곧 이메일 주소가 되고,
    // MimeMessage 객체 안에 내가 전송할 메일의 내용을 담는다.
    // 그리고 bean 으로 등록해둔 javaMail 객체를 사용해서 이메일 send
    @Override
    public String sendSimpleMessage(String to) throws Exception {

        ePw = createKey(); // 랜덤 인증번호 생성

        // TODO Auto-generated method stub
        MimeMessage message = createMessage(to); // 메일 발송
        try {// 예외처리
            mailSender.send(message);
        } catch (MailException es) {
            es.printStackTrace();
            throw new IllegalArgumentException();
        }


        return ePw; // 메일로 보냈던 인증 코드를 서버로 반환
    }


}