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;
	}

완료 사진

 

참고 링크 

- https://sgdev.tistory.com/12

- https://velog.io/@tjddus0302/Spring-Boot-%EB%A9%94%EC%9D%BC-%EB%B0%9C%EC%86%A1-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-Gmail

- https://velog.io/@yu_oolong/SpringFramework-%EC%9D%B4%EB%A9%94%EC%9D%BC-%EC%9D%B8%EC%A6%9D-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0feat.-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%A9%94%EC%9D%BC