gradle 에 다음과 같은 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-mail'
application.properties 에 다음 코드 추가
spring.mail.host=smtp.naver.com
spring.mail.port=465
spring.mail.username=네이버아이디@naver.com
spring.mail.password=네이버비밀번호
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true
임시 비밀번호 생성 클래스
public class TempPwdGenerator { //임시 비밀번호 생성 클래스
private static final String CHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final int pwd_length = 10; //임시 비밀번호 길이
public static String generateTempPasswd() {
SecureRandom random = new SecureRandom();
StringBuilder sb = new StringBuilder(pwd_length);
for (int i = 0; i < pwd_length; i++) {
int index = random.nextInt(CHAR.length());
sb.append(CHAR.charAt(index));
}
return sb.toString();
}
}
Controller
@Controller
public class EmailController {
@Autowired
private EmailService emailService;
@Autowired
private UserService userService;
@PostMapping("/user/findPW")
public String sendEmail(@RequestParam String email, @RequestParam String userid,
@RequestParam String username, Model model){
if(userService.findPasswd(userid, username, email)){
model.addAttribute("sendEmail", "임시 비밀번호를 이메일로 전송했습니다.");
String tempPWD = TempPwdGenerator.generateTempPasswd(); //tempPWD 에 임시비밀번호 저장
emailService.sendTempPasswd(email, tempPWD); //이메일로 임시 비밀번호 송신
userService.modifyPasswd(userid, username, email, tempPWD);
}
else{
model.addAttribute("error", "입력하신 정보는 존재하지 않습니다.");
}
return "findPwd";
}
}
Service
@Service
public class EmailService {
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}") //application.properties 에 있는 spring.mai.username 부분의 값을 가져옴
private String fromEmail;
public void sendTempPasswd(String toEmail, String tempPasswd){
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(toEmail);
message.setSubject("임시 비밀번호 발급"); //이메일 제목
message.setText("안녕하세요 요청하신 임시 비밀번호는 다음과 같습니다 : " + tempPasswd); //이메일 내용
message.setFrom(fromEmail);
javaMailSender.send(message);
}
}
비밀번호 찾기 기능의 html 코드
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>세이프 로드 : 비밀번호 찾기</title>
<style>
body {
font-family: 'Arial', sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f7f7f7;
}
.login-container {
width: 400px;
padding: 40px;
background-color: white;
border-radius: 8px;
box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.1);
text-align: center;
}
.login-container h2 {
margin-bottom: 30px;
}
.login-container input[type="text"],
.login-container input[type="email"] {
width: 100%;
padding: 12px 20px;
margin: 8px 0;
display: inline-block;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
font-size: 16px;
}
.login-container input[type="submit"] {
width: 100%;
background-color: #4CAF50;
color: white;
padding: 14px 20px;
margin: 8px 0;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
}
.login-container input[type="submit"]:hover {
background-color: #45a049;
}
.error-message {
color: red;
margin-bottom: 15px;
}
.hidden {
display: none;
}
</style>
</head>
<body>
<div class="login-container">
<h2>세이프 로드</h2>
<!-- 이메일로 전송완료했다는 메시지 (5초 후 사라짐) -->
<div id="sendEmailMsg" th:if="${sendEmail}" th:text="${sendEmail}"></div>
<!-- 에러 메시지 출력 -->
<div th:if="${error}" class="error-message" th:text="${error}"></div>
<form th:action="@{/user/findPW}" method="POST">
<input type="text" name="userid" placeholder="아이디를 입력하세요." required>
<input type="text" name="username" placeholder="이름을 입력하세요." required>
<input type="email" name="email" placeholder="이메일을 입력하세요." required>
<input type="submit" value="비밀번호 찾기">
<a th:href="@{/user/login}">로그인 화면으로 되돌아가기</a>
</form>
</div>
<!-- 3초 뒤에 성공 메시지를 숨기는 스크립트 -->
<script>
// 페이지가 로드되면 실행
window.onload = function() {
var sendEmailMsg = document.getElementById('sendEmailMsg');
if (sendEmailMsg) { // 메시지가 존재하면
setTimeout(function() {
sendEmailMsg.classList.add('hidden'); // 3초 후에 메시지를 숨김
}, 5000); // 3000ms = 3초
}
};
</script>
</body>
</html>
실행결과
'SpringBoot > 기능구현' 카테고리의 다른 글
[인가 기능] - Jwt 토큰 활용 (0) | 2025.01.07 |
---|