본문 바로가기
Language/JAVA

JavaMail로 회원가입 시 이메일 인증처리하기

by 박살낼겨 2021. 7. 28.

들어가기 앞서 사용 기술에 대해 알아보자

SMTP는 무엇인가?

SMTP(Simple Mail Transfer Protocol)
인터넷 상 이메일을 전송하기 위해 사용되는 통신규약

쉽게 음..약간 서버같은 느낌이다

 

여튼 SMTP로 환경을 구축해줘야된다 그 이유는? 아래 코드에 보면

 

 

1. SMTP 설정하기
**SMTP 환경설정부분**
<context-email.xml 파일>

<?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 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">


	<!-- 메일 보내기 -->
	<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
		<property name="host" value="smtp.gmail.com" />
		<property name="port" value="587" />
		<property name="username" value="실제 이메일을 보낼 이메일 계정" />
		<property name="password" value="이메일 계정의 실제 비밀번호" />


		<!-- email 요청시는 SMTP -->
		<property name="javaMailProperties">
			<props>
				<prop key="mail.transport.protocol">smtp</prop>
				<prop key="mail.smtp.auth">true</prop>
				<prop key="mail.smtp.starttls.enable">true</prop>
				<prop key="mail.debug">true</prop>
			</props>
		</property>
	</bean>


</beans>

"smtp.gmail.com" : gmail(=google)은 SMTP를 제공해준단다 그래서 쓴다.

 

 

그리고!!

 

<prop key="mail.transport.protocol">smtp</prop>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.debug">true</prop>

요 녀석들이 핵심인 것 같다. 서버설정 부분이라고 보면 되니 그대로...복..부...ㅌ;;

 

 

**mvnrepository.com에서 JavaMail 라이브러리 다운**
**pom.xml**		
        
        <!-- 메일인증 -->
		<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
			<version>1.4.7</version>
		</dependency>

말이 다운이지 저거 pom.xml에 복붙하면 끝.

이 아니고 

 

 

 메이븐 빌드를 꼭 해줘야 적용된다. 휴..

 

 

이제 직접사용한 코드를 보자(※스압주의)

 

 

2. JavaMail 사용하기
MailController.java
package kr.or.ddit.web;

import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import kr.or.ddit.service.customer.MailService;

@Controller
public class MailController {

	@Autowired
	private MailService mailService;

	public void setMailService(MailService mailService) {
		this.mailService = mailService;
	}

	@ResponseBody
	@RequestMapping(value = "/checkEmailAjax.do")
	public Map<String, String> sendMail(@RequestBody Map<String, String> map, HttpSession session) {

		System.out.println("/checkEmail.do에 들어옴");
		System.out.println("입력받은 email의 값 : " + map.get("email"));

		int random = new Random().nextInt(100000) + 10000; // 10000 ~ 99999
		System.out.println("random의 값 : " + random);

		String joinCode = String.valueOf(random);
		System.out.println("joinCode의 값 : " + joinCode);

		session.setAttribute("joinCode", joinCode);

		String subject = "회원가입 인증 코드 입니다.";
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("안녕하세요. '빨래통'입니다.\r귀하의 인증 코드는  <" + joinCode + "> 입니다.");
		System.out.println(stringBuilder.toString());

		boolean finishSend = this.mailService.send(subject, stringBuilder.toString(), "TongAdmin", map.get("email"));
		System.out.println("성공이냐 실패냐 : " + finishSend);

		map.put("joinCode", joinCode);

		System.out.println(map);

		return map;
	}

}

 

 

MailService.java
package kr.or.ddit.service.customer;

public interface MailService {


	/** 메일 전송
     *  @param subject 제목
     *  @param text 내용
     *  @param from 보내는 메일 주소
     *  @param to 받는 메일 주소  **/
    public boolean send(String subject, String text, String from, String to);

}

 

 

MailServiceImpl.java
package kr.or.ddit.service.customer.impl;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import kr.or.ddit.service.customer.MailService;

@Service("mailService")
public class MailServiceImpl implements MailService {

	// org.springframework.mail.javamail.JavaMailSender
	@Autowired
	JavaMailSender javaMailSender;

	public void setJavaMailSender(JavaMailSender javaMailSender) {
		System.out.println("들어오냐");
		this.javaMailSender = javaMailSender;
	}

	@Override
	public boolean send(String subject, String text, String from, String to) {
		System.out.println("send에 들어옴");
		// javax.mail.internet.MimeMessage
		MimeMessage message = javaMailSender.createMimeMessage();
		System.out.println("message의 값 : " + message);

		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);

			javaMailSender.send(message);
			return true;

		} catch (MessagingException e) {
			e.printStackTrace();
		}
		return false;
	}

}

 

 

Script
	function fn_sendEmail_Ajax() {
		var userEmail = $("#email").val().trim();
// 		var inputCode = $("#inputCode").val().trim();

		// 메일이 입력 안되면 튕기기
		if (userEmail == "" || userEmail == null) {
			flag_dupl_mail = false;
			alert("이메일 주소를 입력해야 합니다.");
			return;
		}
		if(flag_dupl_use_mail == false){
			flag_dupl_mail = false;
			$("#resultMailBox").html("이미 가입된 이메일 입니다").css('color', 'red');
			return;
		}

		var form = {
			email : userEmail
// 			joinCode : inputCode

		}

		$.ajax({
			url : "/checkEmailAjax.do",
			data : JSON.stringify(form),
			dataType : "JSON",
			type : "post",
			contentType : "application/json; charset=utf-8;",
			async : false,
			success : function(data) {
				alert("입력하신 이메일 주소에서 발급된 코드를 확인하세요.");

				resultCode = data.joinCode;

				$("#checkCodeDiv").show();

			},
			error : function() {
				alert("네트워크가 불안정합니다. 다시 시도해 주세요.222");
			}
		})

	}

 

 

signIn.jsp
<div class="count-box">
<p>
	<strong id ="resultMailBox">Email</strong>
</p>
	<i class="bi bi-at"></i>
	<span class="userEmail">
		<input style="width: 60%; display: inline;" placeholder="이메일을 입력하세요" class="form-control" type="text" id="email" name="email"  oninput="fn_emailChk_Ajax()"/>
		<button type="button" class="btn btn-outline-primary" id="showDiv" onclick = "fn_sendEmail_Ajax()">
			<i class="fa fa-search"></i>이메일 인증
		</button>
    <div style="display: none;" id="checkCodeDiv">
      <input type="text" id="inputCode" style="width: 60%; display: inline;" placeholder="인증코드 입력" class="form-control"  />
      <button type="button" class="btn btn-outline-primary" onclick="fn_checkCode()">확인</button>
    </div>
  	<h6 style="color: green;">※ 이메일을 입력해주세요</h6>
  	</span>
</div>