[22/03/19]一時パスワードによる電子メール送信機能の実装

36932 ワード

🧐 デザイン

  • ユーザーに会員登録のEメールを入力します.
  • Eメールチェックを繰り返して、dbにEメールがあるかどうかを確認します.もしあれば、passがなければ、会員情報がないことを示します.
  • Java Math.random()を使用して一時パスワードを生成します.
  • 会員のパスワードを一時パスワードに更新します.
  • 会員に送信された情報が含まれています.
  • Eメールを送信します.
  • スプリングガイド勾配を設定してEメールを送信


    https://javacoding.tistory.com/148
    Java SMTP利用—NAVERメール利用

    SMTPとは?


    簡易メール転送プロトコル(SMTP)
    これは、インターネット上で電子メールを送信するためのプロトコルです.メールサーバ間の送受信.
    メールクライアントからメールサーバにメールを送信する際にもよく使われます.(出典:ウィキペディア)
    	dependencies {
    	implementation 'org.springframework.boot:spring-boot-starter-mail'
    }

    application.yml設定


    Eメール送信時に使用するEメールアカウントの設定
    管理者のEメールアカウントとパスワードを記録します.
    羽状バニラの上に置くときは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);
        }
    
    

    よく応用されています!