아이디 및 비밀번호를 잊어버렸을 때 이메일을 통하여 회원정보를 찾을 수 있도록 구현하였다.
비밀번호는 임의의 비밀번호를 발행하여 이메일로 전송하였다. 해당 API는 구글 API를 이용하였다.
본 포스팅은 프로젝트에 적용한 코드 설명이다.(API에 대한 자세한 사용방법은 맨 하단에 참고블로그 있음)
이메일 API에 필요한 jar파일
jar 파일은 프로젝트 경로의 - src - main - webapp - WEB-INF - lib 폴더에 넣도록 한다.
emailVO

이메일을 통하여 정보를 전송해야 하므로 email 변수에 대한 VO를 생성하였다.
아이디 찾기
1. findAccount.jsp(아이디/비밀번호찾기 페이지)

아이디를 찾기 위해서 사용자의 '이름'과 '이메일'이 필요하도록 하였다.

웹 페이지 UI 부분
2. ajax 부분

위에서 아이디와 이메일을 입력 후 '아이디 발송' 버튼 클릭 시, 이름 입력 input 태그와 이메일 입력 input 태그의 값을 상수로 저장하였다.
이후 sendIdEmail 경로를 통해 해당 데이터를 전송하였다.
3. sendIdEmail.java(서블릿 파일)


해당 경로 요청을 받으면 넘어온 데이터 값들을 각 VO의 멤버변수에 저장하고 이를 통해 sendIdMail 함수를 실행하도록 하였다.
4. emailIdDAO.java (DAO 파일)
package emailAPI;
import java.util.Date;
import java.util.Properties;
import javax.activation.CommandMap;
import javax.activation.MailcapCommandMap;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import member.MemberDAO;
import member.MemberVO;
public class emailIdDAO {
MemberDAO mDAO = new MemberDAO();
public String sendIdMail(MemberVO mvo) {
// 아이디 찾아서 set
mvo.setMid(mDAO.findId(mvo));
// 메일 인코딩
final String bodyEncoding = "UTF-8"; //콘텐츠 인코딩
String subject = "<VARCHAR> 비밀번호 찾기 안내"; //메일 제목
String fromEmail = "이메일을 보내는 사람의 이메일"; //발신자 이메일정보
String fromUsername = "<VARCHAR>"; //발신자 정보
String toEmail = mvo.getMemail(); // 콤마(,)로 여러개 나열
final String username = "구글계정";//구글 계정
final String password = "발급받은 앱 비밀번호";//발급받은 앱 비밀번호
// 메일에 출력할 텍스트
StringBuffer sb = new StringBuffer();
sb.append("안녕하세요 [VARCHAR] 입니다.\n");
if(mvo.getMid() != null) {
sb.append(mvo.getMname()+"님의 아이디는" + mvo.getMid() + "입니다.");
}
else {
sb.append("죄송합니다. 입력하신 하신 정보에 해당되는 아이디를 찾을 수 없습니다.");
}
String html = sb.toString();
// 메일 옵션 설정
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.quitwait", "false");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
String mid = mvo.getMid();
try {
// 메일 서버 인증 계정 설정
Authenticator auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
};
// 메일 세션 생성
Session session = Session.getInstance(props, auth);
// 메일 송/수신 옵션 설정
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(fromEmail, fromUsername));
message.setRecipients(RecipientType.TO, InternetAddress.parse(toEmail, false));
message.setSubject(subject);
message.setSentDate(new Date());
// 메일 콘텐츠 설정
Multipart mParts = new MimeMultipart();
MimeBodyPart mTextPart = new MimeBodyPart();
MimeBodyPart mFilePart = null;
// 메일 콘텐츠 - 내용
mTextPart.setText(html, bodyEncoding, "html");
mParts.addBodyPart(mTextPart);
// 메일 콘텐츠 설정
message.setContent(mParts);
// MIME 타입 설정
MailcapCommandMap MailcapCmdMap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
MailcapCmdMap.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
MailcapCmdMap.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
MailcapCmdMap.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
MailcapCmdMap.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
MailcapCmdMap.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(MailcapCmdMap);
// 메일 발송
Transport.send( message );
} catch ( Exception e ) {
e.printStackTrace();
}
return mid; //사용자 아이디
}
}
서블릿을 통해 함수를 실행하게 되는데, 이 때 사용자로부터 전달받은 데이터를 통해 DB에 비교하여 사용자의 아이디 존재여부를 확인한다.

발신자의 정보 입력

메일에 출력할 텍스트 설정
5. sendIdEmail.java(서블릿 파일)

함수를 실행한 후 다시 서블릿파일을 통하여 데이터를 전달한다.
6. ajax 부분

데이터를 전달 받았을 경우 웹에서 아이디가 전송되었다는 문구가 나오도록 하였다.
결과 값

아이디/이메일 정보 입력 후 발송버튼 클릭

사용자의 아이디가 존재한다면 '아이디 전송 완료' 문구 출력

사용자의 이메일로 아이디 정보 전달된 것 확인
비밀번호 찾기
비밀번호는 아이디 찾는 로직과 동일하다. 하지만 비밀번호는 랜덤 값으로 재발행되도록 설정하였다.
emailPwDAO.java(DAO 파일)
// 랜덤으로 비밀번호 재발행
StringBuffer temp = new StringBuffer();
Random rnd = new Random();
for (int i = 0; i < 10; i++) {
int rIndex = rnd.nextInt(3);
switch (rIndex) {
case 0:
// a-z
temp.append((char) ((int) (rnd.nextInt(26)) + 97));
break;
case 1:
// A-Z
temp.append((char) ((int) (rnd.nextInt(26)) + 65));
break;
case 2:
// 0-9
temp.append((rnd.nextInt(10)));
break;
}
}
String randomPw = temp.toString();
랜덤 함수를 사용하여 총 10자리의 랜덤 비밀번호를 생성한다.
0~2까지 3개의 경우를 두어 각 경우에 따라 ASCII 코드를 사용하여 문자열을 합쳤다.
int rIndex의 값이 0인 경우
a-z 사이의 랜덤 값 생성 후 합침
값이 1인 경우
A-Z 사이의 랜덤 값 생성 후 합침
값이 2인 경우
0-10까지의 정수 랜덤 값 생성 후 합침
참고 사이트
https://hyunmin1906.tistory.com/m/276
[Go] Google Gmail SMTP 설정 방법 및 메일 전송
■ SMTP 간이 우편 전송 프로토콜(Simple Mail Transfer Protocol)의 약자. 이메일 전송에 사용되는 네트워크 프로토콜이다. 인터넷에서 메일 전송에 사용되는 표준이다. 1982년 RFC821에서 표준화되어 현재
hyunmin1906.tistory.com
'프로젝트 & 실습 > VarChar_JSP_ver_Proj' 카테고리의 다른 글
[프로젝트] 반응형 중고차 웹 사이트 VarChar (0) | 2023.01.10 |
---|---|
[프로젝트] 문자 API (0) | 2023.01.10 |
[프로젝트] 주소 API (0) | 2023.01.08 |
[프로젝트] 아이디 중복검사 (0) | 2023.01.08 |
[프로젝트] 정렬기능 추가&필터검색 후 필터검색 값 유지하기 (0) | 2023.01.08 |
댓글