JSP Team Project [Space Music] - 이메일 전송(코드와 설명)

diddbsckd456·2022년 12월 7일
0

🚀SpaceMusics🛸

목록 보기
5/5
post-thumbnail

메일 전송을 위해 생성한 파일

  • GoogleEmailAction.java
  • MailAuth.java

jar파일

  • mail.jar - Oracle에서 다운로드 받을 수 있다.

🔸 signup.jsp

<label for="user_email" class="email__label"> Email </label>
// 이메일 입력받는 부분
<input id="user_email" name="user_email" class="email_check_input" type="text" autocomplete="off" value="이메일을 입력하세요" />
// 인증메일 보내기 버튼
<button class="email_check_button" type="button" onclick="fn_ConfirmEmailSend()">인증메일 보내기</button>
          
<label for="user_email_chk" class="email__label"> 인증번호 </label>

// 인증번호 입력받는 부분
<input id="user_email_chk" name="user_email_chk" class="email_check_input" type="text" autocomplete="off" value="인증번호를 입력하세요" />
// 인증번호 확인하기 버튼 
<button class="email_check_button" type="button" onclick="fn_EmailConfirm()">이메일 인증하기</button>
<input id="authenticationEmail" type="hidden"/>
// 인증번호 hidden으로 저장해놓는 부분
<input id="authenticationNum" value="${authenticationNum }" type="hidden"/>
  • 이 부분에서는 사용자가 입력한 이메일, 인증번호를 signup.js의 fn_ConfirmEmailSend()과fn_EmailConfirm()으로 보내서 메일을 발송하고, 인증번호가 맞는지 확인한다.
  • hidden값으로 숨겨진 input부분은 사용자의 메일로 보낸 인증번호를 저장하여 값이 같은지 비교할 때 사용한다.
  • authenticationEmail에는 signup.jsp 전체가 담겨있다. 이 안에 담긴 값으로 비교를 하는 것 같은데 잘 모르겠다. 일단 없으면 인증이 안되긴한다. 확실히 하고 싶으면 아이디인증때 사용했던 PringWriter를 사용하면 될 것 같다.

🔹 signup.js


let useremail = $("#user_email"); //위에서 미리 저장해둠

//------------------------이메일 인증번호 보내기-----------------------------------
function fn_ConfirmEmailSend() {

	if (!fn_emailAuthentication()) { // 이메일 형식 검사 function
		return false; // 이메일 형식에 맞지 않는 경우
	}

	let user_email = useremail.val();

	$.ajax({
		type: 'post',
		url: 'http://localhost:8081/sendEmail.sm',
		data: { user_email: user_email },
		success: function(data) {
			alert("인증번호가 전송되었습니다.");
			$("#authenticationEmail").html(data);
			console.log(data);
		},
		error: function(xhr, status, error) {
			//오류 발생 시 처리
			alert("이메일을 다시 입력해주세요.");
		}
	});
}

function fn_emailAuthentication() {
	let email_chk = /^[A-Za-z0-9_\.\-]+@[A-Za-z0-9\-]+\.[A-Za-z0-9\-]+/;
	let email_value = $("#user_email").val();
	let flag = true;
	if (!email_chk.test(email_value)) {
		alert("이메일 형식에 맞춰 입력해주세요");
		$("#user_email").val("");
		$("#user_email").focus();
		flag = false;
	}
	return flag;
}
//------------------------이메일 인증번호 보내기 끝--------------------------------

//------------------------이메일 인증번호 확인하기---------------------------------
function fn_EmailConfirm() {
	let user_email_chk = $("#user_email_chk").val();
	let authenticationNum = $("#authenticationNum").val();

	if (user_email_chk == authenticationNum) {
		alert("인증되었습니다.");
		return false;
	} else {
		alert("인증에 실패하였습니다.");
		return false;
	}
}
//------------------------이메일 인증번호 확인하기 끝------------------------------
  • 먼저 signup.jsp에서 가져온 user_email값을 fn_emailAuthentication()에서 이메일 형식에 맞는지 확인한다.
  • 이메일 형식에 맞다면 FrontController의 sendEmail.sm 케이스로 전송하고 인증 번호가 담긴 이메일을 보낸다.
  • fn_EmailConfirm()에서는 user_email_chk에 사용자가 입력한 인증번호를 담고, authenticationNum에는 GoogleEmailAction에서 리턴받은 인증번호를 담아서 둘을 비교한 후, 값이 같으면 "인증되었습니다." 값이 다르면 "인증에 실패하였습니다."를 사용자에게 보여준다.

🔸 SpaceMusicFrontController.java

// 이메일 인증 하는 경우
		case "/sendEmail.sm":
			forward = new GoogleEmailAction().execute(req, resp);
			break;
  • sendEmail.sm URL로 넘어온 값을 GoogleEmailAction.java으로 보내준다.

🔹 MailAuth.java

public class MailAuth extends Authenticator { // 인증번호 보내는 메일 정보 입력하는 클래스

	PasswordAuthentication pa;

	public MailAuth() {
		String mail_id = "spacemusic2222@gmail.com";
		String mail_pw = "abcdefghijklmnop";

		pa = new PasswordAuthentication(mail_id, mail_pw);
	}	// MailAuth()

	public PasswordAuthentication getPasswordAuthentication() {
		return pa;
	}	
}	// MailAuth class
  • MailAuth는 메일을 발송하게 될 계정에 대한 정보를 입력한다.
  • mail_id에는 메일을 발송할 email을 적어주고, mail_pw에는 전에 생성한 앱 비밀번호 16자리를 넣어준다.

🔸 GoogleEmailAction().java

public class GoogleEmailAction implements Action { // 이메일 인증하는 action

	// 경로 설정 메소드
	public ActionForward execute(HttpServletRequest req, HttpServletResponse resp) {
		ActionForward forward = new ActionForward();

		HashMap<String, String> maildata = new HashMap<>();
		maildata.put("user_email", req.getParameter("user_email"));

		req.setAttribute("authenticationNum", welcomeMailSend(maildata.get("user_email")));

		forward.setRedirect(false);
		forward.setPath("/signup.jsp");

		return forward;

	} // execute()

// ----------------------------------------------------------------------------

	// 난수(인증번호) 설정 메소드
	public String RandomNum() {
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < 6; i++) {
			int n = (int) (Math.random() * 10);
			buffer.append(n);
		}
		return buffer.toString();

	} // RandomNum()

	//-------------------------------------------------------------------------
	
	// 인증번호 메일 보내는 메소드
	public String welcomeMailSend(String recipient){
		// user_email을 recipient 파라미터로 받아온다.

		Properties prop = System.getProperties();

		// 로그인시 TLS를 사용할 것인지 설정
		prop.put("mail.smtp.starttls.enable", "true");

		// 이메일 발송을 처리해줄 SMTP서버
		prop.put("mail.smtp.host", "smtp.gmail.com");

		// SMTP 서버의 인증을 사용한다는 의미
		prop.put("mail.smtp.auth", "true");

		// TLS의 포트번호는 587이며 SSL의 포트번호는 465이다.
		prop.put("mail.smtp.port", "587");

		prop.put("mail.smtp.ssl.trust", "smtp.gmail.com");
		prop.put("mail.smtp.ssl.protocols", "TLSv1.2");

		Authenticator auth = new MailAuth();

		Session session = Session.getDefaultInstance(prop, auth);

		MimeMessage msg = new MimeMessage(session);

		// 난수 설정 메소드
		String authenticationNum = RandomNum();

		try {
			// 보내는 날짜 지정
			msg.setSentDate(new Date());

			// 발송자를 지정한다. 발송자의 메일, 발송자명
			msg.setFrom(new InternetAddress("spacemusic2222@gmail.com", "표시될 이름"));

			// 수신자의 메일을 생성한다.
			InternetAddress to = new InternetAddress(recipient);

			// Message 클래스의 setRecipient() 메소드를 사용하여 수신자를 설정한다. setRecipient() 메소드로 수신자, 참조,
			// 숨은 참조 설정이 가능하다.
			// Message.RecipientType.TO : 받는 사람
			// Message.RecipientType.CC : 참조
			// Message.RecipientType.BCC : 숨은 참조
			msg.setRecipient(Message.RecipientType.TO, to);

			// 메일의 제목 지정
			msg.setSubject("SpaceMusic 인증번호", "UTF-8");

			// 메일의 내용 작성
			msg.setText("인증번호 : " + authenticationNum, "UTF-8");
			
			// Transport는 메일을 최종적으로 보내는 클래스로 메일을 보내는 부분이다.
			Transport.send(msg);

		} catch (AddressException ae) {
			System.out.println("AddressException : " + ae.getMessage());
		} catch (MessagingException me) {
			System.out.println("MessagingException : " + me.getMessage());
		} catch (UnsupportedEncodingException e) {
			System.out.println("UnsupportedEncodingException : " + e.getMessage());
		}

		return authenticationNum;

	} // welcomeMailSend()

} // GoogleEmailAction class

◼ execute 메소드

  • FrontController에서 파라미터로 넘어온 user_email 값을 maildata라는 HashMap에 user_email이라는 key값으로 담아준다.
  • welcomeMailSend 메서드로 maildata에 담겨있는 user_email값을 파라미터로 넘겨서 메일을 발송한다.
  • welcomeMailSend에서 authenticationNum이라는 key값으로 난수를 리턴받아서 Attribute에 담는다.
  • signup.jsp로 값을 보낸다.

◼ RandomNum 메소드

메일로 전송할 6자리 난수를 생성하는 메서드이다.


◼ welcomeMailSend 메소드

  • 처음 부분에 google메일 설정할때 확인해뒀던 값들을 적어준다.
  • MailAuth 객체를 생성해서 Session에 담아준다.
  • Session을 다시 MimeMessage 객체에 담아준다.
  • 난수 설정 메소드에서 난수를 받아온다.
  • try~catch안에서 필요한 값들을 적어주고 Transport.send(msg);에서 msg에 담긴 값들을 이용해 메일을 전송한다.

전체 코드가 있는 GitHub

0개의 댓글