이메일 인증
2024. 6. 26. 18:45ㆍJSP+Spring Boot
이메일 인증은 저장할 요소가 아니기 때문에 Mapper가 필요하지 않고 Service에서만 구현한다.
가장 먼저 pom.xml과 application.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 |