Spring
SMTP를 활용하여 이메일 보내기
yuno82
2024. 1. 4. 10:57
회원가입 구현시 ID/PW가 잃어버렸을때 이메일 인증 및 검증로직이 필요하여 작성
설정파일 (pom.xml)
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework-version}</version>
</dependency>
- alt+F5로 업데이트 해줄것
- javax.mail -> 스프링에서 제공하는 메일 관련 라이브러리
- spring-context-support -> JavaMail 에 대한 추상화 기능을 제공하며 밑의 service에서 MailSender를 사용하기 위해서 입력
설정파일 (root-context)
<!-- username과 password의 value에는 사용할 자신의 네이버 또는 구글의 ID와 비밀번호 -->
<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="(내 id)"/>
<property name="password" value="(PW)"/>
<!-- 보안연결 SSL과 관련된 설정 -->
<property name="javaMailProperties">
<props>
<!-- 구글 -->
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<!-- 네이버는 (SSL 필요) -->
<!-- <prop key="mail.smtp.auth">true</prop> -->
<!-- <prop key="mail.smtp.starttls.enable">true</prop> -->
<!-- <prop key="mail.smtps.checkserveridentity">true</prop> -->
<!-- <prop key="mail.smtps.ssl.trust">*</prop> -->
<!-- <prop key="mail.debug">true</prop> -->
<!-- <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop> -->
</props>
</property>
</bean>
- alt+F5로 업데이트 해줄것
- 내 id는 asdf123@naver.com가 아닌 asdf123만 입력할것
- port는 작성일 기준 구글은 587 네이버는 465 고정이다 (상단의 코드는 google로 진행)
jsp 페이지
<form action="/sendEmail" method="post">
<div class="content">
<div class="radioSelectBox">
<div class="radioEmailBox">
<sec:csrfInput />
<div>
<span>이메일 주소</span>
<input type="text" id="member_email" class="inputTextEmail"><span> @naver.com </span>
</div>
<div>
<input type="text" placeholder="인증번호 6자리 입력" maxlength="6" disabled="disabled" id="certNum_ID">
<button type="button" id="IDmailRequestBtn"><span>인증번호 받기</span></button>
</div>
<div>
<button type="button" id="idCompairBtn">인증번호 확인<span id="mailCheckMsg"></span>
</div>
</div>
</div>
</div>
</form>
ㅡㅡㅡㅡajax활용ㅡㅡㅡㅡㅡ
<script>
var csrfToken = $("input[name='_csrf']").val(); // CSRF 토큰 저장
//ID인증번호 보내기
$(document).ready(function() {
$('#IDmailRequestBtn').click(function() {
var email = $('#member_email').val();
$.ajax({
url: '/survey/sendEmailID',
type: 'POST',
headers: {
'X-CSRF-TOKEN': csrfToken
},
data: {
email: email
},
success: function(response) {
alert('인증번호가 발송되었습니다.');
$('#certNum_ID').prop('disabled', false); // 인증번호 입력 필드 활성화
},
error: function(xhr, status, error) {
alert('유효한 이메일이 아닙니다');
}
});
});
</script>
컨트롤러 코드
@PostMapping("/sendEmailID")
public ResponseEntity<?> sendIDEmail(@RequestParam("email") String email, HttpSession session) {
if (memberDAO.memberInfoByEmail(email) != null) {
// 세션에 인증용 번호 저장
email = email + "@naver.com";
int checknum = memberService.sendIDEmail(email);
session.setAttribute("authCode", checknum);
return ResponseEntity.ok(checknum);
} else {
return null;
}
}
초기에 void를 사용했으나 정상적으로 작동했음에도 error가 나타났다 이를 찾아보니
AJAX 요청은 응답 본문(return)이 없는 경우 클라이언트 측 JavaScript나 jQuery에서 이를 오류로 해석할 수 있습니다.
즉, return이 null이라 작동되어도 error가 나타났던것이다.
ResponseEntity<?> 반환 타입
AJAX 요청의 경우, ResponseEntity를 사용응답 본문(예를 들어, JSON 객체)과 함께 상태 코드를 반환함으로써 클라이언트 측에서 예상하는 응답 형식을 충족시킬 수 있습니다.
ResponseEntity의 경우 return과 동시에 상태코드(200, 300...)를 반환하기에 ajax에서도 이게 실패했는지 아닌지 명확하게 인지할수 있게된다.
서비스 코드
랜덤 난수 생성으로 이를 통한 검증진행
@Autowired
JavaMailSenderImpl mailSender;
public int sendIDEmail (String email) { //난수의 범위 111111 ~ 999999 (6자리 난수)
Random random = new Random();
int checkNum = random.nextInt(888888)+111111;
//이메일 보낼 양식
String toMail = email;
String title = "회원가입 인증 이메일 입니다.";
String content = "인증 코드는 " + checkNum + " 입니다." +
"<br>" +
"해당 인증 코드를 인증 코드 확인란에 기입하여 주세요.";
try {
MimeMessage message = mailSender.createMimeMessage(); //Spring에서 제공하는 mail API
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
helper.setTo(toMail);
helper.setSubject(title);
helper.setText(content, true);
mailSender.send(message);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("랜덤숫자 : " + checkNum);
return checkNum;
}
완료 사진
참고 링크