ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SpringBoot] - 이메일 인증 기능 구현(구글 SMTP)
    Spring 2024. 6. 13. 22:31
    반응형

     

    • 구글 SMTP 서비스 설정하기

    1. 자신의 Gmail로 접속하여 우측 상단의 톱니바퀴를 클릭하여 모든 설정 보기를 클릭한다.

    2. 우측의 화면과 같이 IMAP 사용 설정을 해준다.

     

    3. 화면을 빠져나와 구글 계정관리로 접속한다.

    4. 보안에서 2단계 인증으로 접속한다.(설정하지 않았다면 설정을 해주면 된다.)

    5. 2단계 인증을 클릭 후 제일 하단에 앱 비밀번호 메뉴를 선택해주고 사용 할 이름을 적은 후 만들기 버튼을 클릭하여 비밀번호 생성을 완료한다. 이 해당 비밀번호는 꼭 기억해두어야한다.

     

     


     

    Build.gradle - 의존성 추가

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

     

    Application.yml

    #Email 인증
    mail:
      host: smtp.gmail.com
      port: 587
      username: "이메일 주소"
      password: "초기 설정에서 발급 받은 비밀번호"
      properties:
        mail:
          smtp:
            auth: true
            starttls:
              enable: true
              required: true
            connectiontimeout: 5000
            timeout: 5000
            writetimeout: 5000
      auth-code-expiration-millis: 1800000  # 30 * 60 * 1000 == 30?

     

    MailConfig.Config

    @Configuration
    public class MailConfig {
        @Bean
        public JavaMailSender javaMailSender() {
            JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
            mailSender.setHost("smtp.gmail.com");
            mailSender.setPort(587);
            mailSender.setUsername("설정 한 이메일 주소");
            mailSender.setPassword("발급 받은 비밀번호");
    
            Properties props = mailSender.getJavaMailProperties();
            props.put("mail.transport.protocol", "smtp");
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.debug", "true");
    
            return mailSender;
        }
    }

     

    MailService

    @Service
    @RequiredArgsConstructor
    public class MailService {
    
        private final JavaMailSender javaMailSender;
        private static final String senderEmail = "메일을 보낼 구글 이메일";
    
        // 랜덤으로 숫자 생성
        public String createNumber() {
            Random random = new Random();
            StringBuilder key = new StringBuilder();
    
            for (int i = 0; i < 8; i++) { // 인증 코드 8자리
                int index = random.nextInt(3); // 0~2까지 랜덤, 랜덤값으로 switch문 실행
    
                switch (index) {
                    case 0 -> key.append((char) (random.nextInt(26) + 97)); // 소문자
                    case 1 -> key.append((char) (random.nextInt(26) + 65)); // 대문자
                    case 2 -> key.append(random.nextInt(10)); // 숫자
                }
            }
            return key.toString();
        }
    
        public MimeMessage createMail(String mail, String number) throws MessagingException {
            MimeMessage message = javaMailSender.createMimeMessage();
    
            message.setFrom(senderEmail);
            message.setRecipients(MimeMessage.RecipientType.TO, mail);
            message.setSubject("이메일 인증");
            String body = "";
            body += "<h3>요청하신 인증 번호입니다.</h3>";
            body += "<h1>" + number + "</h1>";
            body += "<h3>감사합니다.</h3>";
            message.setText(body, "UTF-8", "html");
    
            return message;
        }
    
        // 메일 발송
        public String sendSimpleMessage(String sendEmail) throws MessagingException {
            String number = createNumber(); // 랜덤 인증번호 생성
    
            MimeMessage message = createMail(sendEmail, number); // 메일 생성
            try {
                javaMailSender.send(message); // 메일 발송
            } catch (MailException e) {
                e.printStackTrace();
                throw new IllegalArgumentException("메일 발송 중 오류가 발생했습니다.");
            }
    
            return number; // 생성된 인증번호 반환
        }
    }

     

     

     

    MailDto

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class MailDTO {
        private String email;
    }

     

     

    MailController

    @RestController
    @RequiredArgsConstructor
    public class MailController {
    
        private final MailService mailService;
    
        @ResponseBody
        @PostMapping("/emailCheck") // 이 부분은 각자 바꿔주시면 됩니다.
        public String emailCheck(@RequestBody MailDTO mailDTO) throws MessagingException, UnsupportedEncodingException {
            String authCode = mailService.sendSimpleMessage(mailDTO.getEmail());
            return authCode; // Response body에 값을 반환
        }
    }

     

     

    이렇게 간단하게 이메일 인증 서비스를 완료할 수 있다. 테스트를 해보자 

    PostMan을 통해 해당 url로 이메일 받을 사람을 입력하여 요청한다면 아래와같이 인증번호가 출력되어나온다. 

     

     

    실제 확인이 가능한 이메일 주소로 요청한 경우 해당 메일함을 확인한다면 이와같이 인증번호가 전송되어 나온다. 

    반응형

    댓글

Designed by Tistory.