SMTP로 임시비밀번호 발급하기.

한민욱·2024년 6월 13일

팀 프로젝트로 임시 비밀번호도 만들어봤어요 지금 시작할게요.

우선 구글 이메일로 도전해봤는데
먼저 앱키(16자리)가 필요해요

구글 오른쪽 위 아이콘 클릭 -> 보안 -> 2단계 인증 -> 앱 비밀번호 만들기

build.gradle에

implementation 'org.springframework.boot:spring-boot-starter-mail'

추가하기.

application.properties에

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username='내 이메일'
spring.mail.password='내 앱키'
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

JavaMailSender를 사용하기 위해 필요한 것들~!@
우선 dto들부터

UserMailDTO

@Data
public class UserMailDTO {

	private String UName;
	
	private String UMail;
	
}

MailDTO

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MailDTO {
    private String address;
    private String title;
    private String message;
}

Controller

	@Transactional
	@GetMapping("/auth/findPw/{UName}")
	public ResponseEntity<String> findUPw(@ModelAttribute UserMailDTO dto, @PathVariable("UName") String UName,
			Model model) {
		String mail = dto.getUMail();
		String name = dto.getUName();

		MailDTO user = userService.checkMailAndName(mail, name);

		if (user != null) {

			userService.mailSend(user);
			return ResponseEntity.ok("success");
		} else {
			return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("fail");
		}

	}

이메일이랑 이름을 통해 비교를 해봤어요

Service

@Autowired
    private JavaMailSender mailSender;
public MailDTO checkMailAndName(String mail, String name) {
    	
    	String str = getTempPassword();
        MailDTO dto = new MailDTO();
        dto.setAddress(mail);
        dto.setTitle("아이디자인 임시비밀번호 안내 이메일 입니다.");
        dto.setMessage("안녕하세요. 아이디자인 임시비밀번호 안내 관련 이메일 입니다." + " 회원님의 임시 비밀번호는 "
                + str + " 입니다." + "로그인 후에 마이페이지에서 비밀번호 변경을 해주세요");
        UserEntity user = userRepository.findByUMail(mail);
        user.setUPw(passwordEncoder.encode(str));
        
        userRepository.save(user);
        
        return dto;
    }
    
  //랜덤함수로 임시비밀번호 구문 만들기
    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 < 6; i++) {
            idx = (int) (charSet.length * Math.random());
            str += charSet[idx];
        }
        return str;
    }
    // 메일보내기
    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("내 이메일");
        message.setReplyTo("내 이메일");
        System.out.println("message"+message);
        mailSender.send(message);
    }

이렇게 뜨면 성공 ~
JaavaMailSender를 주입하고 sendSimpleMessage 메서드를 통해 이메일을 보내봤네요.

사실 처음 DB에 있는 비밀번호를 알려주려고했는데 Security가 복호화하지 못하기도 하고 암호화를 해버려서...
그래서 그냥 임시 비밀번호를 발급받고 비밀번호를 변경하는 식으로 만들었어요.

참고자료

https://velog.io/@nick6253/%EC%9E%84%EC%8B%9C-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EB%B0%9C%EA%B8%89-%EA%B5%AC%ED%98%84SMTP

profile
나날이 성장하고 싶은 백엔드 개발자

0개의 댓글