spring email 임시비밀번호 발급

염지은·2022년 1월 26일
0

spring

목록 보기
1/4

파이널 프로젝트를 진행하면서 이메일 연동 부분을 구현하게 되었고,
다양한 코드들이 올라왔지만 spring특성상
설정이 워낙 다양하고 복잡해서 생각보다 더 시간이 걸렸다.

우선 우리조는 spring기반으로 xml이 아닌 java클래스로 구현했다.
연동 이메일은 네이버, 다음 등을 사용할 수도 있지만
gmail계정을 새로 만들어 사용하느라 gmail기반으로 작성하였음.

poem

        <dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-email</artifactId>
			<version>1.5</version>
		</dependency>

->poem설정도 여러가지가 다양하고, 회원가입시 필요한 poem설정은 또 다르다.
우선 비밀번호 임시 발급을 위한 추가 dependency는 이 설정 한개뿐이다.
(maven 업데이트 꼭 해줄것)

MailUtil

public class MailUtil {
	@Autowired UserService service;
	
	public void sendEmail(UserVo vo) throws Exception{
		
		//Mail Server 설정
		String charSet="utf-8";
		String hostSMTP="smtp.gmail.com";
		String hostSMTPid=""; //관리자 이메일 아이디
		String hostSMTPpw=""; //관리자 이메일 비밀번호
		
		//보내는 사람 
		String fromEmail=""; //보내는 사람 이메일 
		String fromName=""; //보내는 사람 이름
		
		String subject=""; //메일 제목
		String msg="";
		
		msg +="<div align='lift'";
		msg +="<h3>";
		msg +=vo.getUi_id() + "님의 임시 비밀번호입니다. <br>로그인 후 비밀번호를 변경해 주세요</h3>";
		msg +="<p>임시 비밀번호:";
		msg +=vo.getUi_pwd() + "</p></div>";
		
		//email전송
		String mailRecipient=vo.getUi_email();//받는 사람 이메일 주소
		try {
			//객체 선언
			HtmlEmail mail = new HtmlEmail();
			mail.setDebug(true);
			mail.setCharset(charSet);
			mail.setSSLOnConnect(true);
			mail.setHostName(hostSMTP);
			mail.setSmtpPort(587); 
			mail.setAuthentication(hostSMTPid, hostSMTPpw);
			mail.setStartTLSEnabled(true);
			mail.addTo(mailRecipient,charSet);
			mail.setFrom(fromEmail, fromName, charSet);
			mail.setSubject(subject);
			mail.setHtmlMsg(msg);
			mail.send();
			
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	public void findPw(HttpServletResponse response,UserVo vo) {
		response.setContentType("text/html;charset=utf-8");
		
	}

}

-> 메일을 보내기 위한 클래스 기본 설정과 네이버 및 다음, 구글등 어떠한 경로로 메일을 보낼지 등에 대한 설정도 이곳에서 이루어짐 메일을 보내는 관리자 메일주소 및 비밀번호 설정 부분이 있는데 깃 연동등을 통해 프로젝트를 진행한다면 주의해야 한다.
메일주소를 직접 적지 않고 실행 할 수도 있지만 이번 프로젝트에서는 직접 입력하는 방법으로 진행하기로 함.

UserServiceController

@RestController
public class UserMailController {
@Autowired private UserService service;
	

	@GetMapping(value = "/finduserpwd",produces = {MediaType.APPLICATION_JSON_VALUE})
	public @ResponseBody String findPw(UserVo vo) throws Exception {
		BCryptPasswordEncoder encoder= new BCryptPasswordEncoder();
		String result=null;
		
		//회원정보 불러오기
		UserVo vo1 = service.searchPwd(vo);
		System.out.println(vo1);
		
		//가입된 이메일이 존재한다면 이메일 전송
		if(vo1!=null) {
			
			//임시 비밀번호 생성(UUID이용)
			String tempPw=UUID.randomUUID().toString().replace("-", "");//-를 제거
			tempPw = tempPw.substring(0,10);//tempPw를 앞에서부터 10자리 잘라줌
			
			vo1.setUi_pwd(tempPw);//임시 비밀번호 담기
	
			MailUtil mail=new MailUtil(); //메일 전송하기
			mail.sendEmail(vo1);
			
			service.updatePwd(vo1);
			
			String securePw = encoder.encode(vo1.getUi_pwd());//회원 비밀번호를 암호화하면 vo객체에 다시 저장
			vo1.setUi_pwd(securePw);
				
			result="true";
			

		}else {
			result="false";
		}
		return result;
	}

}

->dao가 아닌 mapper와 mapperinterface를 사용해서 controller와 service부분을 혼동했었다. mailutil을 생성해 주고 service=controller로 생성

이 부분도 오류가 발생 했는데, 참고 했던 블로그에서는 발급받은 임시 비밀번호를 암호화해서 먼저 저장하고 그 비밀번호를 업데이트 하라고 했었는데, 그렇게 되면
업데이트 된 비밀번호로 로그인이 안되는 오류가 발생했다.
실행순서 하나에도 내용이 완전히 뒤바뀌고, 오류가 발생하니까 주의할 것

Mapper

//아이디와 이메일이 DB에 존재하는지 먼저 검사
<select id="searchPwd" parameterType="com.jhta.project.vo.user.UserVo" resultType="com.jhta.project.vo.user.UserVo">
		select * from user_information where ui_id=#{ui_id} and ui_email=#{ui_email}
	</select>
    //임시비밀번호 발급을 위한 업데이트
	<update id="updatePwd" parameterType="com.jhta.project.vo.user.UserVo">
		update user_information  set ui_pwd=#{ui_pwd} where ui_id=#{ui_id} and ui_email=#{ui_email}
	</update>

FindPwd.jsp

<script type="text/javascript">
	$(function(){
		$("#btn").click(function(){
			let ui_id=$("input[name='ui_id']").val();
			let ui_email=$("input[name='ui_email']").val();
			$.ajax({
				url:"/project/finduserpwd",
				dataType:'json',
				data:{"ui_id":ui_id,"ui_email":ui_email},
				success:function(data){
					if(data==true){
						alert("임시 비밀번호가 발급되었습니다.메일함을 확인해 주세요");
						console.log(data);
					}else{
						alert("아이디 또는 이메일을 정확하게 입력해 주세요");
						console.log(data);
				}
		   	}
		});
	});
});
</script>
</head>
<body>
<form action="${cp}/finduserpwd" method="post">
	<h2>임시 비밀번호 발급</h2>
	아이디<br>
	<input type="text" name="ui_id"><br>
	이메일<br>
	<input type="email" name="ui_email"><br>
	<input type="button" value="임시비밀번호 발급" id="btn"><br> 
	<a href="${cp }/loginuser">로그인</a> | <a href="${cp }/insertuser">회원가입</a>  
</form>
</body>
</html>

0개의 댓글