1. JavaMail 라이브러리 다운로드하기
https://mvnrepository.com/artifact/javax.mail/mail/1.4.7
2. 최근 구글의 업데이트 이후에 보안 수준이 낮은 앱 사용이 불가능 해졌다..
그래서 구글 2차 비밀번호 설정을 하여 앱 비밀번호를 설정하여 MyAuthentication 비번 넣는 부분에 그 앱 비밀번호를 입력해주면 된다...
2차 비밀번호 세팅하기


이후 2단계 인증 완료 후 앱 비밀번호 생성




잘 저장해놓은 비밀번호를 아래 코드에 사용한다!!
import javax.mail.PasswordAuthentication;
import javax.mail.Authenticator;
public class MyAuthentication extends Authenticator{
PasswordAuthentication pa;
public MyAuthentication(){
String id = "자신의 구글 이메일 아이디"; //구글 이메일 아이디
String pw = "발급받은 앱 비밀번호"; //구글 비밀번호
pa = new PasswordAuthentication(id, pw);
}
// 시스템에서 사용하는 인증정보
public PasswordAuthentication getPasswordAuthentication() {
return pa;
}
}
원래는 스레드 없이도 비밀번호 찾기 기능이 충분히 가능하지만 프로젝트할 때 메일 전송이 메인 스레드에서 실행하게 되면 페이지 넘어가는 게 메일 전송될 시간까지 잡아먹어 시간이 오래 걸려서 따로 스레드를 넣어서 동작시켜 페이지 이동이 원활하게 만들었다.
그리고 html 형식으로 인코딩하여 이메일을 전송하는 방식을 선택하였다.
import java.util.Date;
import java.util.Properties;
import java.util.Random;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.SecureRandom;
public class MailController extends Thread{
Properties p = System.getProperties();
Authenticator auth = new MyAuthentication();//발신자(관리자)의 아이디비번을 가지고있는 개체
//session 생성 및 MimeMessage생성
Session session = Session.getDefaultInstance(p, auth);
MimeMessage msg = new MimeMessage(session);
private String id;
private String email;
private String fakePw;
public MailController() {
}
public MailController(String id,String email,String fakePw){
p.put("mail.smtp.starttls.enable", "true"); // gmail은 true 고정
p.put("mail.smtp.host", "smtp.gmail.com"); // smtp 서버 주소
p.put("mail.smtp.auth","true"); // gmail은 true 고정
p.put("mail.smtp.port", "587"); // 구글 포트
this.id=id;
this.email=email;
this.fakePw=fakePw;
}
@Override
public void run() {
sendPw();
}
public void sendPw() {
try {
msg.setSentDate(new Date());
InternetAddress from=new InternetAddress();
from= new InternetAddress("발신자 이메일","발신자 이름"); //발신자 아이디
// 이메일 발신자
msg.setFrom(from);
// 이메일 수신자
InternetAddress to = new InternetAddress(email);//임시비밀번호를 받아야할 회원의 이메일주소로 전송
msg.setRecipient(Message.RecipientType.TO, to);
// 이메일 제목
msg.setSubject("Pet sitting FINDPW", "UTF-8");
//이메일 내용
String testtest="<table class=\"body-wrap\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; background-color: #f6f6f6; margin: 0;\" bgcolor=\"#f6f6f6\">\r\n"
+ " <tbody>\r\n"
+ " <tr style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;\">\r\n"
+ " <td style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;\" valign=\"top\"></td>\r\n"
+ " <td class=\"container\" width=\"600\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; display: block !important; max-width: 600px !important; clear: both !important; margin: 0 auto;\" valign=\"top\">\r\n"
+ " <div class=\"content\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; max-width: 600px; display: block; margin: 0 auto; padding: 20px;\">\r\n"
+ " <table class=\"main\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" itemprop=\"action\" itemscope=\"\" itemtype=\"http://schema.org/ConfirmAction\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; border-radius: 3px; margin: 0; border: none;\">\r\n"
+ " <tbody><tr style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;\">\r\n"
+ " <td class=\"content-wrap\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;padding: 30px;border: 3px solid #67a8e4;border-radius: 7px; background-color: #fff;\" valign=\"top\">\r\n"
+ " <meta itemprop=\"name\" content=\"Confirm Email\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;\">\r\n"
+ " <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;\">\r\n"
+ " <tbody><tr style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;\">\r\n"
+ " <td class=\"content-block\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;\" valign=\"top\">\r\n"
+"<b>"+id+"</b> 님 반드시 비밀번호를 변경하시길 바랍니다\r\n"
+ " </td>\r\n"
+ " </tr>\r\n"
+ " <tr style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;\">\r\n"
+ " <td class=\"content-block\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;\" valign=\"top\">\r\n"
+ " 요청하신 임시비밀번호를 발급해 드렸습니다. 로그인 후 반드시 비밀번호 변경을 하시길 바랍니다.\r\n"
+ " </td>\r\n"
+ " </tr>\r\n"
+ " <tr style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;\">\r\n"
+ " <td class=\"content-block\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;\" valign=\"top\">\r\n"
+ "<h2>"+"임시비밀번호 발급: <b>"+fakePw+"</b></h2>"
+ " </b></td>\r\n"
+ " </tr>\r\n"
+ " <tr style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;\">\r\n"
+ " <td class=\"content-block\" itemprop=\"handler\" itemscope=\"\" itemtype=\"http://schema.org/HttpActionHandler\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;\" valign=\"top\">\r\n"
+ " <a href=\"localhost:8080/ThrowsGG/join.jsp\" class=\"btn-primary\" itemprop=\"url\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; color: #FFF; text-decoration: none; line-height: 2em; font-weight: bold; text-align: center; cursor: pointer; display: inline-block; border-radius: 5px; text-transform: capitalize; background-color: #f06292; margin: 0; border-color: #f06292; border-style: solid; border-width: 8px 16px;\">로그인 하러 가기</a>\r\n"
+ " </td>\r\n"
+ " </tr>\r\n"
+ " <tr style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;\">\r\n"
+ " <td class=\"content-block\" style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;\" valign=\"top\">\r\n"
+ " <b>Ki-Chang Ma</b>\r\n"
+ " <p>Support Team</p>\r\n"
+ " </td>\r\n"
+ " </tr>\r\n"
+ "\r\n"
+ " <tr style=\"font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;\">\r\n"
+ " <td class=\"content-block\" style=\"text-align: center;font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0;\" valign=\"top\">\r\n"
+ " © 2022 sunmoon\r\n"
+ " </td>\r\n"
+ " </tr>\r\n"
+ " </tbody></table>\r\n"
+ " </td>\r\n"
+ " </tr>\r\n"
+ " </tbody></table>\r\n"
+ " </div>\r\n"
+ " </td>\r\n"
+ " </tr>\r\n"
+ " </tbody>\r\n"
+ "</table>";
//이메일 내용
// msg.setText("안녕하세요 "+id+"님 요청하신 임시비밀번호를 발급해드립니다 임시비밀번호: "+fakePw,"UTF-8");
msg.setContent(testtest, "text/html; charset=UTF-8"); //html 형식으로 메일 셋팅
javax.mail.Transport.send(msg,msg.getAllRecipients());
}catch (AddressException addr_e) {
addr_e.printStackTrace();
}catch (MessagingException msg_e) {
msg_e.printStackTrace();
}catch (Exception msg_e) {
msg_e.printStackTrace();
}
}
public String getRandomPw() {// 임시비밀번호를 만들어서 메일로 보내기위해 만든 메소드
final String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
SecureRandom random = new SecureRandom();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 8; i++) {
int randomIndex = random.nextInt(chars.length());
sb.append(chars.charAt(randomIndex));
}
return sb.toString();
}
}
mvc패턴을 선택해서 컨트롤러 부분은 아래 코드이다

비밀번호 찾기 화면이다..

아래는 비밀번호 찾기 화면 구현 코드이다
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="css/style.css">
</head>
<style>
body {
margin-top: 20px;
}
.form-control:not(textarea) {
height: 44px;
}
.form-control {
padding: 0 18px 3px;
border: 1px solid #dbe2e8;
border-radius: 22px;
background-color: #fff;
color: #606975;
font-family: "Maven Pro", Helvetica, Arial, sans-serif;
font-size: 14px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
.form-group label {
margin-bottom: 8px;
padding-left: 18px;
font-size: 13px;
font-weight: 500;
cursor: pointer;
}
.form-text {
padding-left: 18px;
}
.text-muted {
color: #9da9b9 !important;
}
</style>
<script>
document.getElementById('alert-danger').style.display = 'none';
</script>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="js/jquery.min.js"></script>
<script src="js/jquery-migrate-3.0.1.min.js"></script>
<script src="js/jquery.easing.1.3.js"></script>
<script src="js/jquery.waypoints.min.js"></script>
<script src="js/jquery.stellar.min.js"></script>
<script src="js/jquery.animateNumber.min.js"></script>
<script src="js/jquery.timepicker.min.js"></script>
<script src="js/jquery.magnific-popup.min.js"></script>
<script>
function sendMail() {
var loginid = document.getElementById('loginid');
var loginEmail = document.getElementById('emailpass');
$.ajax({
type : "post",
url : "checkMail.lg",
dataType : "text",
data : {
id : loginid.value,
email : loginEmail.value,
}
}).done(function(data) {
if (data == "true") {
var loginid = document.getElementById('loginid');
var loginEmail = document.getElementById('emailpass');
$.ajax({
type : "post",
url : "sendMail.lg",
dataType : "text",
data : {
id : loginid.value,
email : loginEmail.value,
}
}).done(function(){
window.location.href = "./afterSendPw.jsp?";
})
} else {
document.getElementById('alert-danger').style.display = '';
}
}).error(function(data) {
alert("mail error");
})
}
</script>
<body>
<jsp:include page="Nav.jsp"></jsp:include>
<div class="container padding-bottom-3x mb-2">
<div class="row justify-content-center">
<div class="col-lg-8 col-md-10">
<h2>Forgot your password?</h2>
<p>Change your password in three easy steps. This helps to keep your new password secure.</p>
<ol class="list-unstyled">
<li><span class="text-primary text-medium">1. </span>Fill in your email address below.</li>
<li><span class="text-primary text-medium">2. </span>We'll email you a temporary code.</li>
<li><span class="text-primary text-medium">3. </span>Use the code to change your password on our secure website.</li>
</ol>
<div class="card mt-4">
<div class="card-body">
<div class="form-group">
<label for="email-for-pass">Enter your email address</label> <input class="form-control" type="text" name="emailpass" id="emailpass" required=""><small class="form-text text-muted">Type in the email address you used when you registered. Then we'll email a code to this address.</small>
<label for="loginid">Enter your ID</label> <input class="form-control" type="text" name="loginid" id="loginid" required="">
</div>
<div class="alert alert-danger" id="alert-danger" style="display:none">이메일 또는 ID가 존재하지 않습니다</div>
</div>
<div class="card-footer">
<button class="btn btn-primary" onclick="sendMail();">Get New Password</button></div>
</div>
</div>
</div>
</div>
</body>
</html>
이후 이메일 전송 후 화면

이메일 전송 후 화면 코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<title>Insert title here</title>
<link rel="stylesheet" href="css/style.css">
</head>
<style>
body{margin-top:20px;}
.mail-seccess {
text-align: center;
background: #fff;
border-top: 1px solid #eee;
}
.mail-seccess .success-inner {
display: inline-block;
}
.mail-seccess .success-inner h1 {
font-size: 100px;
text-shadow: 3px 5px 2px #3333;
color: #006DFE;
font-weight: 700;
}
.mail-seccess .success-inner h1 span {
display: block;
font-size: 25px;
color: #333;
font-weight: 600;
text-shadow: none;
margin-top: 20px;
}
.mail-seccess .success-inner p {
padding: 20px 15px;
}
.mail-seccess .success-inner .btn{
color:#fff;
}
</style>
<body>
<jsp:include page="Nav.jsp"></jsp:include>
<section class="mail-seccess section">
<div class="container">
<div class="row">
<div class="col-lg-6 offset-lg-3 col-12">
<!-- Error Inner -->
<div class="success-inner">
<h1><i class="fa fa-envelope"></i><span>We Sent Your temporary password Successfully!</span></h1>
<p> 귀하의 이메일로 임시비밀번호를 전송 완료하였습니다.</p>
<a href="join.jsp" class="btn btn-primary btn-lg">로그인하러 가기</a>
</div>
<!--/ End Error Inner -->
</div>
</div>
</div>
</section>
</body>
</html>
처음 해본 jsp이어서 그런지 살짝 스파게티 코드처럼 되었다.. 앞으로 몰입형 과정을 통하여 학습 후 이러한 부분을 개선해야겠다.
'세미프로젝트' 카테고리의 다른 글
| 팀 프로젝트 - 유기동물 입양+쇼핑몰+ 커뮤니티 사이트 (0) | 2022.09.01 |
|---|
댓글