[22/03/19] 임시비밀번호 이메일로 보내는 기능 구현
🧐 설계
- 사용자에게 회원가입 했던 이메일을 입력받는다.
- 이메일 중복체크를 재활용하여 이메일이 db에 있는지 조회한다. 있다면 pass 없다면 회원정보가 없다고 보여준다.
- 자바 Math.random()으로 임시 비밀번호를 생성한다.
- 해당 회원의 비번을 임시 비밀번호로 업데이트한다.
- 회원에게 보낼 메시지를 담는다.
- 이메일을 전송한다.
이메일을 보낼 스프링부트 gradle 설정
참고 https://javacoding.tistory.com/148
자바 SMTP 활용 - 네이버 메일 활용
SMTP란?
간이 전자 우편 전송 프로토콜(Simple Mail Transfer Protocol, SMTP)
인터넷에서 이메일을 보내기 위해 이용되는 프로토콜이다. 메일 서버간의 송수신뿐만 아니라,
메일 클라이언트에서 메일 서버로 메일을 보낼 때에도 사용되는 경우가 많다. (출처 : 위키피디아 )
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-mail'
}
application.yml 설정
이메일을 보낼 때 사용될 이메일 계정 설정
관리자의 이메일 계정과 비번을 적고,
깃허브에 올릴 때는 gitignore을 사용하여
깃허브에 올리는 것을 무시하여 보낸다.
적용해보았지만 잘 되지 않아서
급한대로 개발을 진행할 때와 시연할 때만
비밀번호를 입력하고 지웠다...
spring:
mail:
host: smtp.naver.com
port: 465
username: 아이디@naver.com
password: 이메일 비번
properties:
mail.smtp.auth: true
mail.smtp.ssl.enable: true
비밀번호 찾기 html
<!--임시 비번 모달-->
<div id="findPw" class="modal fade">
<div class="modal-dialog modal-dialog-centered modal-login">
<div class="modal-content">
<div class="modal-body">
<div class="container my-auto">
<div class="row">
<div class="card z-index-0 fadeIn3 fadeInBottom">
<div class="card-header p-0 position-relative mt-n4 mx-3 z-index-2">
<div class="bg-gradient-primary shadow-primary border-radius-lg py-3 pe-1">
<h4 class="text-white font-weight-bolder text-center mt-2 mb-0">비밀번호 찾기</h4>
</div>
</div>
<div class="card-body">
<form role="form" class="text-start" action="/member/sendEmail" method="post" name="sendEmail">
<p>입력한 이메일로 임시 비밀번호가 전송됩니다.</p>
<div class="input-group input-group-outline my-3">
<label class="form-label">Email</label>
<input type="email" id="userEmail" name="memberEmail" class="form-control" required>
</div>
<div class="text-center">
<button type="button" class="btn bg-gradient-primary w-100 my-4 mb-2"
id="checkEmail">비밀번호 발송</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<button type="button" class="btn btn-link" data-bs-toggle="modal"
data-bs-target="#findPw">비밀번호를 잊으셨나요?</button>
<script>
$("#checkEmail").click(function () {
const userEmail = $("#userEmail").val();
const sendEmail = document.forms["sendEmail"];
$.ajax({
type: 'post',
url: 'emailDuplication',
data: {
'memberEmail': userEmail
},
dataType: "text",
success: function (result) {
if(result == "no"){
// 중복되는 것이 있다면 no == 일치하는 이메일이 있다!
alert('임시비밀번호를 전송 했습니다.');
sendEmail.submit();
}else {
alert('가입되지 않은 이메일입니다.');
}
},error: function () {
console.log('에러 체크!!')
}
})
});
</script>
Mail.dto
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MailDTO {
private String address;
private String title;
private String message;
}
MemberController
// 이메일 보내기
@Transactional
@PostMapping("/sendEmail")
public String sendEmail(@RequestParam("memberEmail") String memberEmail){
MailDTO dto = ms.createMailAndChangePassword(memberEmail);
ms.mailSend(dto);
return "/member/login";
}
MemberService
// 메일 내용을 생성하고 임시 비밀번호로 회원 비밀번호를 변경
@Override
public MailDTO createMailAndChangePassword(String memberEmail) {
String str = getTempPassword();
MailDTO dto = new MailDTO();
dto.setAddress(memberEmail);
dto.setTitle("Cocolo 임시비밀번호 안내 이메일 입니다.");
dto.setMessage("안녕하세요. Cocolo 임시비밀번호 안내 관련 이메일 입니다." + " 회원님의 임시 비밀번호는 "
+ str + " 입니다." + "로그인 후에 비밀번호를 변경을 해주세요");
updatePassword(str,memberEmail);
return dto;
}
//임시 비밀번호로 업데이트
@Override
public void updatePassword(String str, String userEmail){
String memberPassword = str;
Long memberId = mr.findByMemberEmail(userEmail).getId();
mmr.updatePassword(memberId,memberPassword);
}
//랜덤함수로 임시비밀번호 구문 만들기
@Override
public String getTempPassword(){
char[] charSet = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
String str = "";
// 문자 배열 길이의 값을 랜덤으로 10개를 뽑아 구문을 작성함
int idx = 0;
for (int i = 0; i < 10; i++) {
idx = (int) (charSet.length * Math.random());
str += charSet[idx];
}
return str;
}
// 메일보내기
@Override
public void mailSend(MailDTO mailDTO) {
System.out.println("전송 완료!");
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(mailDTO.getAddress());
message.setSubject(mailDTO.getTitle());
message.setText(mailDTO.getMessage());
message.setFrom("보낸이@naver.com");
message.setReplyTo("보낸이@naver.com");
System.out.println("message"+message);
mailSender.send(message);
}
//비밀번호 변경
@Override
public void updatePassWord(Long memberId, String memberPassword) {
mmr.updatePassword(memberId,memberPassword);
}
잘 적용 되었다!
Author And Source
이 문제에 관하여([22/03/19] 임시비밀번호 이메일로 보내는 기능 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hellocdpa/220319-임시비밀번호-이메일로-보내는-기능-구현저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)