[22/03/19] 임시비밀번호 이메일로 보내는 기능 구현

Que Lin·2022년 3월 19일
4
post-thumbnail

🧐 설계

  • 사용자에게 회원가입 했던 이메일을 입력받는다.
  • 이메일 중복체크를 재활용하여 이메일이 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);
    }

잘 적용 되었다!

profile
1일 1커밋 1일 1벨로그!

0개의 댓글