이메일 인증

2024. 6. 26. 18:45JSP+Spring Boot

이메일 인증은 저장할 요소가 아니기 때문에 Mapper가 필요하지 않고 Service에서만 구현한다.

 

가장 먼저 pom.xmlapplication.properties에 다음 구문들을 추가

 

pom.xml

		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-mail</artifactId>
		</dependency>
		<!-- 이메일 인증을 위한 기능 추가 -->

 

application.properties

#imap(공유하면서 저장) pop3(하나의 공간에 저장)
spring.mail.host=smtp.gmail.com
#이메일을 보낼 때 사용하는 포트번호 : 465 // gmail = 587
spring.mail.port=587
spring.mail.username=qwert850528@gmail.com
spring.mail.password=yfqe hnkt krsr qhjk
#smtp : 이메일 보내기 Simple Mail Transfer Protocol
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.timeout=5000
spring.mail.properties.mail.smtp.starttls.enable=true

#mybatis의 타입 별칭을 사용할 패키지
#mybatis.type-aliases-package=dto패키지위치

 

Service

package com.khmall.service;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor //@Autowired와 비슷. 외부에서 전체적으로 설정 -> lombok에서 만듦
//@Autowired = 클래스 내 변수마다 하나씩 지정 -> SpringBoot에서 만듦
public class MailService {
	
	//java에서 제공하는 이메일 보내기 기능 틀 -> 회사마다 규격이 다르기 때문
	private final JavaMailSender JavaMailSender;
	
	//이메일을 보낼 이메일 주소값
	private static final String senderEmail = "qwert850528@gmail.com"; //이메일을 보낼 담당자 이메일 작성
	//application.properties에서 가져온 이메일을 그대로 사용
	
	private static int number; //인증번호를 보낼 숫자 공간
	
	//랜덤으로 인증번호 생성하는 메서드 기능 설정
	public static void makingNumber() {
		//임의의 6자리 숫자를 생성
		number = (int)(Math.random() * (90000)) + 100000;
		// Math.random() * (90000) : 0.0 ~ 89999.999999....
		// + 100000 -> 100000 ~ 189999 사이의 숫자 6자리 생성
	}
	
	//메일 양식 기능 작성
	public MimeMessage createMail(String mail) {
		// MimeMessage : 이메일 본문 담당. 첨부파일, 헤더 같이 보낼 수 있음
		//java에서 제공하는 기능
		
		//인증번호 생성
		makingNumber();
		
		//생성된 인증번호를 담는 변수
		//메세지 보낼 공간 생성
		MimeMessage message = JavaMailSender.createMimeMessage();
		
		try {
			message.setFrom(senderEmail); //인증번호를 보내는 주최자의	 이메일 주소
			message.setRecipients(MimeMessage.RecipientType.TO, mail);// -> String 타입
//			message.setRecipient(MimeMessage.RecipientType.TO, mail); -> address 타입
			//태그로 img src 이미지 같이 보낼 수 있음
			//첨부파일 참조하는 태그들 이용해서 같이 보낼 수 있음
			message.setSubject("이메일 인증"); //보내는 제목
			String 이메일본문 = "";
			이메일본문 += "<h3>" + "요청하신 인증번호입니다." + "<h3>";
			이메일본문 += "<h1>" + number + "<h1>";
			message.setText(이메일본문, "utf-8", "html");
		} 
		catch (MessagingException e) {
			e.printStackTrace();
		}
		
		return message; // message.으로 작성한 모든 내용 담아서 전달
	}
	
	public int sendMail(String mail) {
		MimeMessage message = createMail(mail);
		JavaMailSender.send(message);
		return number;
		
	}
}

 

Controller

package com.khmall.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.khmall.service.MailService;

import lombok.RequiredArgsConstructor;

@Controller
@RequiredArgsConstructor
public class MailController {

	@Autowired
	private final MailService mailService;
	
	@GetMapping("/")
	public String MailPage() {
		return "index";
	}
	
	// 인증번호를 전송받은 값과 일치하는지 확인
	@ResponseBody
	@PostMapping("/mail")
	public String mailSend(String mail) {
		int number = mailService.sendMail(mail);
		String num = "" + number; //랜덤으로 생성된 숫자 가져오기
		
		//내가 전달받은 숫자가 맞는지 확인용으로 가져옴
		return num;
	}
}

 

자료형 앞에 final을 붙이는 이유 : 밑에서 변수명을 조작해서 회사에 문제가 생기는 것을 방지하기 위해
final -> 상시적으로 값이 고정되기 때문

@RequiredArgsConstructor : final로 작성된 필드를 도와주는 생성자

@ResponseBody : Serivce.java에 작성한 html 파일(코드)에서 작성된 내용을 json형식으로 변환해서
사용자에게 전달할 때 사용 -> ajax를 위해 사용

 

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>이메일 인증 구현하기</title>
</head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript">
    function sendNumber(){
        $("#mail_number").css("display","block");
        $.ajax({
            url:"/mail",
            type:"post",
            dataType:"json",
            data:{"mail" : $("#mail").val()},
            success: function(data){
                alert("인증번호 발송");
                $("#Confirm").attr("value",data);
            }
        });
    }

    function confirmNumber(){
        var number1 = $("#number").val();
        var number2 = $("#Confirm").val();

        if(number1 == number2){
            alert("인증되었습니다.");
        }else{
            alert("번호가 다릅니다.");
        }
    }
</script>
<body>
  <div id="mail_input" name="mail_input">
      <input type="text" name="mail" id="mail" placeholder="이메일 입력">
      <button type="button" id="sendBtn" name="sendBtn" onclick="sendNumber()">인증번호</button>
  </div>
      <br>
  <div id="mail_number" name="mail_number" style="display: none">
    <input type="text" name="number" id="number" placeholder="인증번호 입력">
    <button type="button" name="confirmBtn" id="confirmBtn" onclick="confirmNumber()">이메일 인증</button>
  </div>
  <br>
    <input type="text" id="Confirm" name="Confirm" style="display: none" value="">
</body>
</html>

 

 

html 파일을 실행하고 시험해보기

이메일 입력

 

메일을 받은 이메일 주소
인증 성공

 

 

'JSP+Spring Boot' 카테고리의 다른 글

공공 데이터 가져오기  (0) 2024.08.19
중복 확인하기(ajax)  (0) 2024.07.09
마이페이지 조회,수정, 삭제, 검색  (0) 2024.06.25
로그인  (0) 2024.06.25
이미지 파일 업로드하기(insert-image)  (0) 2024.06.21