Spring

SMTP 프로토콜을 이용한 Spring 에서 메일 보내기 (gmail)

검정95 2021. 6. 30. 19:29

1. pom.xml 에 dependency 추가

 

2. Biz / Service 부분에 메소드 추가하기

@Override
	public void sendEmail(UserDto dto) {
		// 네이버일 경우 네이버 계정, gmail일 경우 gmail 계정
		final String user = "@gmail.com";
		// 위의 계정 패스워드
		final String password = "";

		String msg = "";
		msg += "<div align='center' style='border:1px solid black; font-family:verdana'>";
		msg += "<h3 style='color: blue;'>";
		msg += dto.getUserid() + "님의 임시 비밀번호 입니다. 비밀번호를 변경하여 사용하세요.</h3>";
		msg += "<p>임시 비밀번호 : ";
		msg += dto.getPassword() + "</p></div>";
		
		//SMTP 서버 정보 설정하기
		Properties prop = new Properties();
		prop.put("mail.smtp.host", "smtp.gmail.com");
		prop.put("mail.smtp.port", 465);
		prop.put("mail.smtp.auth", "true");
		prop.put("mail.smtp.ssl.enable", "true");
		prop.put("mail.smtp.ssl.trust", "smtp.gmail.com");
		
		Session session = Session.getDefaultInstance(prop, new Authenticator() {
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(user, password);
			}
		});
		
		try {
			MimeMessage message = new MimeMessage(session);
			message.setFrom(new InternetAddress(user));
			
			// 수신자 메일 주소
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(dto.getUseremail()));
			
			// Subject 메일 제목을 입력하는 부분
			message.setSubject("*** 임시 비밀번호 입니다.");
			
			// Text 메일 내용을 입력하는 부분
			message.setContent(msg, "text/html;charset=UTF-8");
			
			// send the message
			Transport.send(message); // 전송
			System.out.println("메일 성공적으로 전송");
			
		} catch (AddressException e) {
			e.printStackTrace();
		} catch (MessagingException e) {
			e.printStackTrace();
		}
		
	}

	//비밀번호찾기
	@Override
	public void findPw(UserDto dto) throws Exception {
		
			// 임시 비밀번호 생성
			String pw = "";
			for (int i = 0; i < 12; i++) {
				pw += (char) ((Math.random() * 26) + 97);
			}
			
			dto.setPassword(pw);
			
			// 비밀번호 변경
			dao.updatePw(dto);
			
			// 비밀번호 변경 메일 발송
			sendEmail(dto);
	
		}	
	}

dto에 대한 부분은 생략하였다.

 

3. findpw.jsp 부분

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>비밀번호 찾기</title>
</head>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

<script type="text/javascript">
// 이메일 정규식
var mailJ = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;
// 아이디 정규식
var idJ = /^[a-z0-9][a-z0-9_\-]{4,19}$/; 

	$(document).ready(function(){
		
		$("#emailresult").hide();
		$("#idresult").hide();
		
		$("#findemailBtn").click(function(){
			
			var useremail = $("#useremail").val().trim();
			
			var userid = $("#userid").val().trim();
			
			var findpwVal = {
					"useremail" : useremail,
					"userid" : userid
			}
			
			if(mailJ.test(useremail) && idJ.test(userid) && useremail != null && useremail != '' && userid != null && userid != '') {
				
				$.ajax({
					type:"post",
					url:"findpw.do",
					data: JSON.stringify(findpwVal),
					contentType: "application/json",
					dataType:"json",
					success:function(result) {
						switch (result) {
						case 1:
							alert("가입된 아이디가 없습니다. 아이디를 확인해 주세요.");
							return false;
							break;
						case 2:
							alert("가입된 이메일이 없습니다. 이메일을 확인해 주세요.")
							return false;
							break;
						default:
							alert("가입된 이메일로 임시 비밀번호를 전송하였습니다. 메일을 확인해주세요.");
							break;
						}
					},
					error:function() {
						alert("이메일 전송에 실패하였습니다.");
						return false;
					}
				});
			} else if(idJ.test(userid) == false || userid == null || userid == '') {
				alert("아이디를 확인해 주세요.");
				$("#idresult").show();
				$("#userid").focus();
				$("#idresult").html("아이디 입력을 확인해 주세요.").css("color", "red");
				return false;
		
			} else if(mailJ.test(useremail) == false || useremail == null || useremail == '') {
				alert("이메일 입력을 확인해 주세요.");
				$("#useremail").focus();
				$("#emailresult").show();
				$("#emailresult").html("이메일 입력을 확인해 주세요.").css("color", "red");
				return false;
			} 
		});
		
	});
</script>
<body>

	<h3>비밀번호 찾기</h3>
	
	<label>아이디</label>
	<input id="userid" type="text" placeholder="아이디를 입력해 주세요.">
	
	<div id="idresult"></div>
	
	<label>이메일</label>
	<input id="useremail" type="text" placeholder="이메일을 입력해 주세요." name="useremail">
	
	<div id="emailresult"></div>
	
	<button id="findemailBtn" type="button">이메일전송</button>
	
</body>
</html>

 

4. Controller 부분 ajax 보내주는 부분 비동기 처리

 

5. 결과

네이버로 메일 주소가 저장되어있는 회원에게 보내보았다. 네이버 메일에서 확인이 가능했다.