개인 프로젝트/프로젝트

SpringLegacyProject(MVC)_이메일인증_ID/PWD찾기

Leo.K 2022. 7. 15. 12:46

지난 시간에 적용한 네아로를 이어서 이번에는 메일보내기 Api를 사용해보고자 한다. 원래는 휴대폰 인증을 하고 싶었지만,, 유료서비스이기 때문에 메일 보내기로 대체해서 사용자 인증을 진행해보고자 한다. 필자의 프로젝트 내에서 이메일이 유니크이기 때문에 이메일을 가지고 아이디를 찾고, 찾은 아이디와 이메일이 동일한 사용자로 매핑되는 경우 메일로 인증번호를 보내고 비밀번호를 찾고 변경할 수 있도록 구현하고자 한다. 이메일 인증은 생각보다 간단하니 바로 진행해보자.

1. 환경설정(pom.xml)

두 개의 라이브러리를 pom.xml파일에 추가해야 한다. 이때 중요한 것은 spring-context-support의 버전은 독자가 사용하고 있는 springframework버전과 반드시 동일하게 해야 한다. 

[ root-context.xml ]

메일을 보내기 위한 기본 환경설정 파일이다. 기본적으로 네이버에서 사용하는 SMTP포트는 465번이고 구글, 다음 등 각 메일 포털 사이트 별로 포트가 다르다. 이를 사용 설정하는 부분은 글의 말미에서 설명하도록 하겠다.

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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!-- Root Context: defines shared resources visible to all other web components -->
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.naver.com" />
        <property name="port" value="465" />    
        <property name="username" value="{메일을 보낼 메일 아이디}" />
        <property name="password" value="{메일 비밀번호}" />
        <property name="defaultEncoding" value="utf-8" />
        
        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.starttls.enable">true</prop>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtps.ssl.checkserveridentity">true</prop>
                <prop key="mail.smtps.ssl.trust">*</prop>
                <prop key="mail.debug">true</prop>
                <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
            </props>
        </property>
    </bean>
    
        
</beans>
 
cs

 

[ Controller ]

  1. 사용자에게 전송할 6자리 난수를 생성한다. 
  2. 사용자가 입력한 이메일이 DB에 저장된 이메일과 동일하다면 메일을 보낼 준비를 한다. 
  3. 발신자 이메일, 수신자 이메일, 메일 내용을 작성한다. 
  4. mailSender는 위의 환경설정 파일에서 생성한 bean객체의 id이고, controller에 의존성 주입을 시켜주어야 한다. 
  5. mailSender.send(msg)를 입력하면 사용자의 이메일로 인증코드가 담긴 이메일이 발송된다.
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
//이메일 발송을 위한 정보 받기 
@RequestMapping("findAuth.do")
@ResponseBody
public Map findAuth(TekaMemberVo vo, Model model) {
    
    Map map = new HashMap();
    
    //사용자가 작성한 아이디를 기준으로 존재하는 사용자인지 확인한다.(id는 회원가입시 중복 체크를 했기 때문에 유니크하다.)
    TekaMemberVo isUser = member_dao.selectOneById(vo.getM_id());
    
    if(isUser != null) {//회원가입이 되어있는, 존재하는 사용자라면
        Random r = new Random();
        int num = r.nextInt(999999); //랜덤 난수 
        
        StringBuilder sb = new StringBuilder();
        
        // DB에 저장된 email            입력받은 email
        if(isUser.getM_email().equals(vo.getM_email())) {//이메일 정보 또한 동일하다면 
    
            String setFrom = "ict04@naver.com";//발신자 이메일
            String tomail = isUser.getM_email();//수신자 이메일
            String title = "[TEKA] 비밀번호 변경 인증 이메일입니다.";
            sb.append(String.format("안녕하세요 %s님\n", isUser.getM_nickname()));
            sb.append(String.format("TEKA 비밀번호 찾기(변경) 인증번호는 %d입니다.", num));
            String content = sb.toString();
            
            try {
                MimeMessage msg = mailSender.createMimeMessage();
                MimeMessageHelper msgHelper = new MimeMessageHelper(msg, true"utf-8");
                
                msgHelper.setFrom(setFrom);
                msgHelper.setTo(tomail);
                msgHelper.setSubject(title);
                msgHelper.setText(content);
                
                //메일 전송
                mailSender.send(msg);
                
            }catch (Exception e) {
                // TODO: handle exception
                System.out.println(e.getMessage());
            }
            
            //성공적으로 메일을 보낸 경우
            map.put("status"true);
            map.put("num", num);
            map.put("m_idx", isUser.getM_idx());
            return map;
            
        }
    }
    
}
cs

 

아래 이미지와 같이 이메일이 도착했다.!

 

다음으로 네이버에서 smtp 사용 환경설정 하는 방법을 알아보자. 이는 받는 사람은 상관없이 보내는 이메일에서 설정해야 한다. 

네이버로그인을 진행한 후에 네이버 메일에 들어간다. 네이버 메일 에서 가장 아래쪽에 아주 작은 부분으로 환경설정 버튼이 있다. 

 

아래의 버튼을 체크 한다. 가장 밑 부분에 있는 smtp서버명, 포트번호를 환경설정에서 사용하는 것이다. 

 

전체 소스 코드는 필자의 깃허브 주소에 있다.

https://github.com/yhn032/TEKASpring

 

GitHub - yhn032/TEKASpring: 기술 면접 학습 플래시 카드 웹 서비스

기술 면접 학습 플래시 카드 웹 서비스. Contribute to yhn032/TEKASpring development by creating an account on GitHub.

github.com