본문 바로가기

일경험

[국민취업지원제도 일경험프로그램 58일차] 구글 SMTP 이메일 인증 기능

반응형

58일 차 특이사항

1. api 사용하기

- 이메일 인증하기 (https://gwamssoju.tistory.com/108 코드를 참고하여 변형함) 

- 이메일 인증이 필요한 이유 : 사용자의 신원 확인, 보안 강화, 스팸 및 무단 가입을 방지할 수 있다.

- 관리자 입장에서 필요한 기능이다. 

 

이메일 인증하기 환경설정 (구글 SMTP)

1. 의존성 추가 

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.5.5</version>
</dependency>

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

 

2. 구글 SMTP 설정하기

 

1) 구글 Gmail 톱니바퀴 클릭 

2) 전달 및 POP/IMAP에서 IMAP 사용 체크 

 

 

3) 위 설정을 완료하면 인증 문자가 날아온다. 

 

 

4) 2단계 인증에 들어가서 앱 비밀번호를 설정한다. 

 

5) 위 과정으로 만들어진 아이디, 비밀번호를 사용할 것이다. 

 

6)  servlet-context.xml (application.properties) 설정하기 

- 아이디는 STMP에 등록된 구글 이메일을 복사 붙여 넣기 

- 설정한 앱 비밀번호 그대로 복사 붙여 넣기(띄어쓰기 그대로) 

<!-- 이메일 인증 -->
	<beans:bean id="mailSender"	class="org.springframework.mail.javamail.JavaMailSenderImpl">
	    <beans:property name="host" value="smtp.gmail.com" />
	    <beans:property name="port" value="465" /> 
	    <beans:property name="username" value="[구글 아이디]" />
	    <beans:property name="password" value="[비번]" />
	    <beans:property name="defaultEncoding" value="utf-8" />
	    <beans:property name="javaMailProperties">
	        <beans:props>
	            <beans:prop key="mail.transport.protocol">smtp</beans:prop>
	            <beans:prop key="mail.smtp.auth">true</beans:prop>
	            <beans:prop key="mail.smtp.port">587</beans:prop>
	            <beans:prop key="mail.debug">true</beans:prop>
	            <beans:prop key="mail.smtp.ssl.trust">smtp.gmail.com</beans:prop>
	            <beans:prop key="mail.smtp.ssl.protocols">TLSv1.2</beans:prop>
	            <beans:prop key="mail.smtp.ssl.enable">false</beans:prop>
	            <beans:prop key="mail.smtp.starttls.enable">true</beans:prop>
	            <beans:prop key="mail.smtp.socketFactory.class">
	            javax.net.ssl.SSLSocketFactory</beans:prop>
	        </beans:props>
	    </beans:property>
	</beans:bean>

 

7) 여기까지 하면 환경 설정은 끝. 코드를 작성해보자. 

 

구글 이메일 인증하기 코드 

코드는 컨트롤러, JSP, SERVICE로 구성된다. 

 

1. SignUp.jsp 

 

1) HTML

  이메일 : <div id="mail_input" name="mail_input">
            <input type="text" size="15" name="email1" id = "email1" value="" >@
            <input type="text" size="15" name="email2" id = "email2" value="">
            <select name="emailselect" id="emailselect" required> 
              <option value="">선택</option> 
              <option value="naver">naver.com</option> 
              <option value="gmail">gmail.com</option> 
              <option value="nate">nate.com</option> 
              <option value="daum">daum.net</option> 
              <option value="choice">직접입력</option> 
            </select> 
            <button type="button" id="sendBtn" name="sendBtn" onclick="sendNumber()">인증번호</button>
        </div>
        <div id="mail_number" name="mail_number" style="display: none">
            <input type="text" name="number" id="number" placeholder="인증번호 입력">
            <button type="button" name="confirmBtn" id="confirmBtn" onclick="confirmNumber()">이메일 인증</button>
        </div>
       <br>
       <input type="text" id="Confirm" name="Confirm" style="display: none" value="">

 

2) SCRIPT

<script>
 $(document).ready(function() {
	    $('#emailselect').on('change', function() {
	        var selectedOption = $(this).val();
	        if (selectedOption === 'naver') {
	            $('#email2').val('naver.com');
	        } else if (selectedOption === 'gmail') {
	            $('#email2').val('gmail.com');
	        } else if (selectedOption === 'nate') {
	            $('#email2').val('nate.com');
	        } else if (selectedOption === 'daum') {
	            $('#email2').val('daum.net');
	        } else {
	            $('#email2').val('');
	        }

	    });
	});

 function sendNumber() {
	    var email1 = $("#email1").val();
	    var email2 = $("#email2").val();

	    // 이메일 주소 생성
	    var email = email1 + "@" + email2;

	    if (email1 && email2) {
	        $("#mail_number").css("display", "block");
	        $.ajax({
	            url: "mailconfirm",
	            type: "post",
	            dataType: "json",
	            data: { "mail": email },
	            success: function(data) {
	                alert("인증번호 발송");
	                $("#Confirm").attr("value", data);
	            }
	        });
	    } else {
	        alert("이메일 주소를 모두 입력하세요.");
	    }
	}


 function confirmNumber(){
     var number1 = $("#number").val();
     var number2 = $("#Confirm").val();

     if(number1 == number2){
         alert("인증되었습니다.");
     }else{
         alert("번호가 다릅니다.");
     }
 }
 </script>

 

2. EmailController.java

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class EmailController {
    	private final MailService mailService;
    	
        public EmailController(MailService mailService) {
            this.mailService = mailService;
        }
        
	    @ResponseBody
	    @PostMapping("mailconfirm")
	    public String MailSend(String mail){

	       int number = mailService.sendMail(mail);

	       String num = "" + number;	//""를 붙여주면 문자열로 변환됨

	       return num;
	    }
}

 

3. MailService.java

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;


@Service
public class MailService {

    private final JavaMailSender javaMailSender;
    
    public MailService(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }
    
    private static final String senderEmail= "tmdgh4199@gmail.com";
    private static int number;

    public static void createNumber(){
       number = (int)(Math.random() * (90000)) + 100000;// (int) Math.random() * (최댓값-최소값+1) + 최소값
    }

    public MimeMessage CreateMail(String mail){
        createNumber();
        MimeMessage message = javaMailSender.createMimeMessage();

        try {
            message.setFrom(senderEmail);
            message.setRecipients(MimeMessage.RecipientType.TO, mail);
            message.setSubject("이메일 인증");
            String body = "";
            body += "<h3>" + "요청하신 인증 번호입니다." + "</h3>";
            body += "<h1>" + number + "</h1>";
            body += "<h3>" + "감사합니다." + "</h3>";
            message.setText(body,"UTF-8", "html");
        } catch (MessagingException e) {
            e.printStackTrace();
        }

        return message;
    }

    public int sendMail(String mail){

        MimeMessage message = CreateMail(mail);

        javaMailSender.send(message);

        return number;
    }
}

 

이메일 인증 구글SMTP

이메일 인증 오류

javax.mail.SendFailedException: No recipient addresses

이런 경우 없는 주소거나 입력이 잘못된 경우다. 인증번호 버튼을 누르면 유효성검사가 진행되도록 해주는 것이 좋다. 

 

 

 

 

 

 

반응형