http://vip00112.tistory.com/24
Spring MVC기반 RESTfull 사이트를 개발中..
이메일 관련한 기능을 추가로 작업해주길 요청 받았다.
Spring 프레임워크와 Gmail SMTP를 이용하면 어렵지 않게 해당 기능을 구현 가능 하다.
- 추가 요청 기능
1. 회원가입시 이메일 인증
1) 회원정보 입력 전 이메일로 인증 코드 발송
2) 시간내 일치하는 인증 코드 입력 후 다음 프로세스 진행(회원정보 입력)
2. 이메일 기반 아이디/비밀번호 찾기
1) 아이디 찾기: 입력한 이메일로 가입된 정보가 있을시 해당 이메일로 아이디 전송
2) 비밀번호 찾기: 입력한 이메일/아이디로 일치하는 회원 정보가 있을시 해당 이메일로 임시 비밀번호 전송
- 필요한 라이브러리
1. spring-context-support-4.2.5.RELEASE.jar (프로젝트에 사용된 spring 버전과 일치해야 함)
2. javax.mail-1.5.6.jar
3. maven일 경우
1 2 3 4 5 | < dependency > < groupId >javax.mail</ groupId > < artifactId >mail</ artifactId > < version >1.4</ version > </ dependency > |
- 프로세스
1. view페이지 에서 이메일 입력 후 전송 버튼 클릭
- Controller에 mapping된 url로 form submit
2. Controller에서 인증 코드 생성 및 session의 Attribute에 저장
3. Service에서 실제 메일 전송
- xml 설정 및 소스 코드
1. MailService Interface 및 이를 구현한 MailServiceImpl 클래스 생성
1 2 3 4 5 6 7 8 9 10 11 12 | // Interface public interface MailService { /** 메일 전송 * @param subject 제목 * @param text 내용 * @param from 보내는 메일 주소 * @param to 받는 메일 주소 * @param filePath 첨부 파일 경로: 첨부파일 없을시 null **/ public boolean send(String subject, String text, String from, String to, String filePath); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | // MailService Interface 구현 클래스 @Service public class MailServiceImpl implements MailService { // org.springframework.mail.javamail.JavaMailSender private JavaMailSender javaMailSender; public void setJavaMailSender(JavaMailSender javaMailSender) { this .javaMailSender = javaMailSender; } @Override public boolean send(String subject, String text, String from, String to, String filePath) { // javax.mail.internet.MimeMessage MimeMessage message = javaMailSender.createMimeMessage(); try { // org.springframework.mail.javamail.MimeMessageHelper MimeMessageHelper helper = new MimeMessageHelper(message, true , "UTF-8" ); helper.setSubject(subject); helper.setText(text, true ); helper.setFrom(from); helper.setTo(to); // 첨부 파일 처리 if (filePath != null ) { File file = new File(filePath); if (file.exists()) { helper.addAttachment(file.getName(), new File(filePath)); } } javaMailSender.send(message); return true ; } catch (MessagingException e) { e.printStackTrace(); } return false ; } } |
2. applicationContext.xml에 bean 등록
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <!-- 이메일 관련 --> < bean id = "javaMailSender" class = "org.springframework.mail.javamail.JavaMailSenderImpl" > < property name = "host" value = "smtp.gmail.com" /> < property name = "port" value = "587" /> < property name = "username" value = "아이디@gmail.com" /> < property name = "password" value = "비밀번호" /> < property name = "javaMailProperties" > < props > < prop key = "mail.smtp.ssl.trust" >smtp.gmail.com</ prop > < prop key = "mail.smtp.starttls.enable" >true</ prop > < prop key = "mail.smtp.auth" >true</ prop > </ props > </ property > </ bean > < bean id = "mailService" class = "service.other.MailServiceImpl" > < property name = "javaMailSender" ref = "javaMailSender" /> </ bean > |
3. view페이지의 요청을 받아서 처리할 MailController 클래스 생성
- userService관련 내용은 여기서 따로 다루지 않는다. (개별 구현 할것)
- captcha는 이메일과 상관없이 따로 구현한 기능이다. (생략 가능)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | @Controller public class MailController { private UserService userService; private MailService mailService; public void setUserService(UserService userService) { this .userService = userService; } public void setMailService(MailService mailService) { this .mailService = mailService; } // 회원가입 이메일 인증 @RequestMapping (value = "/sendMail/auth" , method = RequestMethod.POST, produces = "application/json" ) @ResponseBody public boolean sendMailAuth(HttpSession session, @RequestParam String email) { int ran = new Random().nextInt( 100000 ) + 10000 ; // 10000 ~ 99999 String joinCode = String.valueOf(ran); session.setAttribute( "joinCode" , joinCode); String subject = "회원가입 인증 코드 발급 안내 입니다." ; StringBuilder sb = new StringBuilder(); sb.append( "귀하의 인증 코드는 " + joinCode + " 입니다." ); return mailService.send(subject, sb.toString(), "아이디@gmail.com" , email, null ); } // 아이디 찾기 @RequestMapping (value = "/sendMail/id" , method = RequestMethod.POST) public String sendMailId(HttpSession session, @RequestParam String email, @RequestParam String captcha, RedirectAttributes ra) { String captchaValue = (String) session.getAttribute( "captcha" ); if (captchaValue == null || !captchaValue.equals(captcha)) { ra.addFlashAttribute( "resultMsg" , "자동 방지 코드가 일치하지 않습니다." ); return "redirect:/find/id" ; } User user = userService.findAccount(email); if (user != null ) { String subject = "아이디 찾기 안내 입니다." ; StringBuilder sb = new StringBuilder(); sb.append( "귀하의 아이디는 " + user.getId() + " 입니다." ); mailService.send(subject, sb.toString(), "아이디@gmail.com" , email, null ); ra.addFlashAttribute( "resultMsg" , "귀하의 이메일 주소로 해당 이메일로 가입된 아이디를 발송 하였습니다." ); } else { ra.addFlashAttribute( "resultMsg" , "귀하의 이메일로 가입된 아이디가 존재하지 않습니다." ); } return "redirect:/find/id" ; } // 비밀번호 찾기 @RequestMapping (value = "/sendMail/password" , method = RequestMethod.POST) public String sendMailPassword(HttpSession session, @RequestParam String id, @RequestParam String email, @RequestParam String captcha, RedirectAttributes ra) { String captchaValue = (String) session.getAttribute( "captcha" ); if (captchaValue == null || !captchaValue.equals(captcha)) { ra.addFlashAttribute( "resultMsg" , "자동 방지 코드가 일치하지 않습니다." ); return "redirect:/find/password" ; } User user = userService.findAccount(email); if (user != null ) { if (!user.getId().equals(id)) { ra.addFlashAttribute( "resultMsg" , "입력하신 이메일의 회원정보와 가입된 아이디가 일치하지 않습니다." ); return "redirect:/find/password" ; } int ran = new Random().nextInt( 100000 ) + 10000 ; // 10000 ~ 99999 String password = String.valueOf(ran); userService.updateInfo(user.getNo(), "password" , password); // 해당 유저의 DB정보 변경 String subject = "임시 비밀번호 발급 안내 입니다." ; StringBuilder sb = new StringBuilder(); sb.append( "귀하의 임시 비밀번호는 " + password + " 입니다." ); mailService.send(subject, sb.toString(), "아이디@gmail.com" , email, null ); ra.addFlashAttribute( "resultMsg" , "귀하의 이메일 주소로 새로운 임시 비밀번호를 발송 하였습니다." ); } else { ra.addFlashAttribute( "resultMsg" , "귀하의 이메일로 가입된 아이디가 존재하지 않습니다." ); } return "redirect:/find/password" ; } |
4. DispatcherServle xml에 Controller bean 등록 (xml 이름은 프로젝트마다 상이할 수 있습니다.)
- web.xml에서 지정한 DispatcherServlet xml파일
- 해당 프로젝트에서는 owm-servlet.xml 이다.
1 2 3 4 | < bean class = "controller.MailController" > < property name = "userService" ref = "userService" /> < property name = "mailService" ref = "mailService" /> </ bean > |
5. view 페이지 작성
- 대표로 아이디 찾기 form만 남긴다.
- captcha는 이메일과 상관없이 따로 구현한 기능이다. (생략 가능)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | < form action = "/sendMail/id" id = "findForm" method = "post" > < fieldset > < legend class = "screen_out" >아이디 찾기 폼</ legend > < div class = "box email" > < label for = "email" >이메일</ label > < input type = "text" id = "email" name = "email" autofocus autocomplete = "off" required /> </ div > <!-- // .box.email --> < div class = "box captcha" > < div class = "loading" ></ div > <!-- // .loading --> < label for = "captcha" >자동 방지 코드</ label > < input type = "text" id = "captcha" name = "captcha" autocomplete = "off" required /> < img src = "/captcha" alt = "캡차 이미지" title = "클릭시 새로고침" /> </ div > <!-- // .box.captcha --> < div class = "box btn" > < button type = "submit" class = "btn join" > < i class = "fa fa-envelope" ></ i > 이메일 전송 </ button > </ div > <!-- // .box.btn --> </ fieldset > </ form >
|
'Web > 스프링' 카테고리의 다른 글
mybatis <string,string> 방식 map 리턴... 못찾음 (0) | 2017.06.20 |
---|---|
mybatis에서 selectKey 사용법 (0) | 2017.06.20 |
[Mybatis] 동적 쿼리 작성 (가변 컬럼) (0) | 2017.06.14 |
[스프링시큐리티] Spring Security 로그인 후 이전 페이지로 이동 (0) | 2017.06.09 |
스프링 시큐리티 utf-8 충돌나서 한번더 인코딩함. (스프링 시큐리티 적용시 인코딩 필터 동작안할경우) (0) | 2017.05.25 |
댓글