build.gradle
// 이메일 인증 라이브러리
implementation group: 'javax.mail', name: 'mail', version: '1.4.7'
1. 가입했을시 작성한 이메일(PK)로 아이디(username) 찾기
UserRespository
네이티브 쿼리 사용
@Query(value = " select * from User where email = ?1 ", nativeQuery = true)
Optional<User> findByEmail(String email);
UserService
@Transactional
public User searchUserEmail(String email) {
return userRepository.findByEmail(email).orElseThrow(() -> {
return new IllegalArgumentException();
});
}
UserApiController
// 아이디 찾기
@PostMapping("/search")
public ResponseDto<?> selectEamil(@RequestBody User user) {
User userEntity = userService.searchUserEmail(user.getEmail());
return new ResponseDto<>(true, userEntity.getUsername());
}
2. 아이디와 이메일을 이용하여 가입시 작성한 이메일주소로 임시 비밀번호 발송하기
UserRespository
@Query(value = " select * from user where username = ?1 and email = ?2 ", nativeQuery = true)
Optional<User> findByPassword(String username, String email);
UserService
// 임시비밀번호 생성
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;
}
// 임시비밀번호로 DB저장
@Transactional
public String searchPasswordChange(String email) {
User userEntity = userRepository.findByEmail(email).orElseThrow(() -> {
return new IllegalArgumentException("찾을 수 없는 회원입니다.");
});
String rawPassword = "";
if (userEntity.getLoginType() == null || userEntity.getLoginType().equals("")) {
rawPassword = getTempPassword();
String encPassword = encoder.encode(rawPassword);
userEntity.setPassword(encPassword);
}
return rawPassword;
}
// 비밀번호 찾기
@PostMapping("/send-mail")
public ResponseDto<?> mailSend(@RequestBody User user) {
User userEntity = userService.searchPassword(user.getUsername(), user.getEmail());
LoginType lognType;
try {
lognType = userEntity.getLoginType();
} catch (Exception e) {
lognType = LoginType.CLICKGO;
}
if(lognType != LoginType.CLICKGO) {
return new ResponseDto<String>(false, new String("소셜회원은 아이디/비밀번호를 찾을 수 없습니다. 관리자에게 문의해주세요"));
}
return new ResponseDto<>(true, naverMailSend(userEntity.getEmail()));
}
public int naverMailSend(String email) {
String host = "smtp.naver.com";
// 테스트후 개인정보 보안상 비밀번호는 지워주세요
// SMTP 서버 정보를 설정한다.
Properties props = new Properties(); // Properties는 java.util의 Properties입니다.
props.put("mail.smtp.host", host); // smtp의 호스트
props.put("mail.smtp.port", 587); // 587 포트 사용
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.protocols", "TLSv1.2"); // 이 설정을 안붙이면 TLS Exception이 뜨더라구요. (버전이 안맞아서)
Session session = Session.getDefaultInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(id, password);
}
});
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(id)); // 발신자의 이메일
// 수신자 이메일
message.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
// 메일 제목
message.setSubject("Click-Go");
// 메일 내용
String temporary = userService.searchPasswordChange(email);
message.setText("안녕하세요.\n 저희 클릭고 입니다. \n 임시비밀번호 : " + temporary); // 랜덤인 임시비밀번호를 생성
// send the message
Transport.send(message);
return 0;
} catch (MessagingException e) {
e.printStackTrace();
return -1;
}
}
application.yml
mail:
id: 발신자 이메일(네이버 아이디) 주소
pw: 발시자 비밀번호(네이버 비밀번호)
'개발일지 > 스프링' 카테고리의 다른 글
Spring application.xml 트랜잭션 적용 (0) | 2024.03.04 |
---|---|
Spring AOP (개념, 용어, 원리, 포인트컷 표현식, JoinPoint API) (0) | 2024.03.03 |
spring boot 로그인 기능 (form태그 로그인하기) (0) | 2022.12.20 |
spring boot 회원가입 기능 (0) | 2022.12.20 |
csrf적용한 로그인(아웃), 회원가입,댓글(작,삭),게시글(작,수,삭),회원정보(수정) (1) | 2022.12.20 |
댓글