파이널 프로젝트를 진행하면서 이메일 연동 부분을 구현하게 되었고,
다양한 코드들이 올라왔지만 spring특성상
설정이 워낙 다양하고 복잡해서 생각보다 더 시간이 걸렸다.
우선 우리조는 spring기반으로 xml이 아닌 java클래스로 구현했다.
연동 이메일은 네이버, 다음 등을 사용할 수도 있지만
gmail계정을 새로 만들어 사용하느라 gmail기반으로 작성하였음.
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.5</version>
</dependency>
->poem설정도 여러가지가 다양하고, 회원가입시 필요한 poem설정은 또 다르다.
우선 비밀번호 임시 발급을 위한 추가 dependency는 이 설정 한개뿐이다.
(maven 업데이트 꼭 해줄것)
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");
}
}
-> 메일을 보내기 위한 클래스 기본 설정과 네이버 및 다음, 구글등 어떠한 경로로 메일을 보낼지 등에 대한 설정도 이곳에서 이루어짐 메일을 보내는 관리자 메일주소 및 비밀번호 설정 부분이 있는데 깃 연동등을 통해 프로젝트를 진행한다면 주의해야 한다.
메일주소를 직접 적지 않고 실행 할 수도 있지만 이번 프로젝트에서는 직접 입력하는 방법으로 진행하기로 함.
@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로 생성
이 부분도 오류가 발생 했는데, 참고 했던 블로그에서는 발급받은 임시 비밀번호를 암호화해서 먼저 저장하고 그 비밀번호를 업데이트 하라고 했었는데, 그렇게 되면
업데이트 된 비밀번호로 로그인이 안되는 오류가 발생했다.
실행순서 하나에도 내용이 완전히 뒤바뀌고, 오류가 발생하니까 주의할 것
//아이디와 이메일이 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>
<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>