코딩/Spring 쇼핑몰 프로젝트

Spring [쇼핑몰프로젝트] - 인증번호 이메일 전송 환경 세팅[6]

유미._. 2023. 4. 20. 09:45
728x90

 

 

오늘은 회원가입시 이메일 인증을 하기 전 환경 설정에 대해 포스팅 해보겠습니다 ヾ(•ω•`)o

 

 

 

구현 순서

 

1. 이메일 전송이란?

2. 메일 계정 보안 설정

3. pom.xml 설정

4. mailSender Bean 등록

5. Controller 메서드 추가

6. 메일 전송 테스트

 

 

1. 이메일 전송이란?

 

스프링프레임워크에서 메일서버(STMP)를 이용하여 메일을 전송하는 방법에 대해 알아보고자 합니다. SMTP는 Simple Mail Transfer Protocol로서 전자 메일 전송을 위한 표준 프로토콜입니다. 따라서 SMTP Server란 이메일을 송신하는 서버입니다. 

 

메일 전송 기능을 구현하기 위해선 4가지가 필요합니다.

1. pom.xml 설정

2. mailSender Bean 등록

3. Controller 메서드 추가

4. 메일 계정 보안 설정

 

메일서버를 통해 메일을 전송할 때는 두가지 방법이 있습니다.

 

첫번째, 메일 서버가 릴레이(relay)를 허용하는 경우 

**relay란 외부 네트워크에서 해당 메일서버를 경우해서 외부로 메일을 보내는 것.

- 계정이 존재하지 않아도 메일을 발송할 수 있습니다.

- 릴레이를 허용할 경우, 스팸메일로 악용 될 수 있기 때문에 특정 IP에서만 릴레이가 되도록 하는게 일반적입니다.

 

두번째, 메일 서버에 계정 인증 후 메일을 전송하는 방법

 

위 두가지 방법 선택은 mailSender Bean 등록에서 이루어집니다. 

 

 

2. 메일 계정 보안 설정

 

SMTP Server를 통해서 메일 전송 기능을 구현하기 위해선 사용하고자 하는 메일의 SMTP 보안 단계를 낮춰야 합니다. 네이버의 경우 로그인시 휴대폰승인을 통한 보안 단계까지 설정이 되어 있을 경우 아래의 설정만으로는 부족합니다.

 

2-1. 네이버

네이버에 로그인 후 -> 메일 -> (왼쪽하단) 환경설정 -> (상단목록 중) POM3/IMAP 설정 -> 사용함으로 체크 후 확인!

 

 

 

2-2. 다음

다음 로그인 후 -> 메일 -> (왼쪽하단) 환경설정 -> (상단목록 중) IMAP/POM3 설정 -> 사용함으로 체크 후 확인!

 

 

 

 

 

3. pom.xml 설정

 

Maven Repository에 가서 mail을 검색후 버전 1.4.7 라이브러리를 추가해 줍니다.

 

 

 

pom.xml에 복사해온 코드를 넣어 줍니다.

자바에서 메일을 보내기 위해 필요로한 라이브러리입니다.

spring-context-support 라이브러리를 사용할 것이기 때문에 mail 라이브러리에선 javax.mail.internet.mimeMessage만 사용됩니다.

 

 

 

Spring Context Support 라이브러리도 추가해 줍니다.

JavaMailSender 인터페이스를 사용하기 위해 필요합니다. mail 라이브러리를 일일이 세팅 할 필요 없이 몇 가지의 설정만으로도 사용될 수 있도록 도와줍니다.

 

 

 

4. mailSender Bean 등록

 

root-context.xml에서 Bean을 등록해주면 됩니다. 

 

릴레이를 허용하는 서버를 사용한 경우의 빈설정을 알아본 후, 아이디/비밀번호로 인증 후 발송하는 빈 설정을 알아보도록 하겠습니다.

 

 

 

4-1. 메일 서버가 릴레이를 허용하는 경우

 

❗저는 naver로 진행했습니다.❗

root-context.xml에 아래의 코드를 추가해줍니다. 

 

<!-- navermail설정 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
 <property name="host" value="smtp.naver.com"/> <!-- 메이서버 호스트 -->
 <property name="port" value="465"/> <!-- 메이서버 포트번호 -->
 <property name="username" value="your_email"/> <!-- 자신의 이메일 아이디 -->
 <property name="password" value="your_password"/> <!-- 자신의 비밀번호 -->
   <!-- 보안연결 SSL과 관련된 설정 -->
 <property name="javaMailProperties">
  <props>
  <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>

 

  - host : "smtp.naver.com" 입력

  - port : "465" 입력

  - username : 자신의 이메일 아이디 입력

  - password : 자신의 이메일 비밀번호 입력

  - javaMailProperties인 <property> 태그에 삽입된 코드는 SSL 인증 코드입니다.

 

 

 

5. Controller 메서드 추가

 

MimeMessage 객체를 직접 생성하여 메일을 발송하는 방법과 MimeMessagePreparator를 사용해서 메일을 전송하는 방법이 있습니다. 두가지 모두 알아보도록 하겠습니다.

 

의존성 주입을 위해 MemberController에 아래의 코드를 작성해 줍니다.

 

 

 

 

5-1. MimeMessage 객체를 직접 생성하여 메일을 발송하는 방법

주의 해야 할 점은 업로드할 파일이 해당 경로에 있어야 합니다.

 

//MimeMessage 객체를 직접 생성하여 메일 전송
	@RequestMapping(value = "/sendMail", method = RequestMethod.GET)
	public void sendMailTest() throws Exception{
		String subject = "test 메일";
		String content = "메일 테스트 내용" + "<img src=\"https://blog.kakaocdn.net/dn/cssZNA/btsbtefJFRI/Aq8KgwKe18GyXPRiWbu6KK/img.jpg\">";
		String from = "ooo@naver.com";
		String to = "oooo@naver.com";
		
		
		try {
			MimeMessage mail = mailSender.createMimeMessage();
			MimeMessageHelper mailHelper = new MimeMessageHelper(mail,true,"UTF-8");
			//true는 멀티파트 메세지를 사용하겠다는 의미
			
			/*단순한 텍스트 메세지만 사용시엔 아래의 코드도 사용 가능하다
			MimeMessageHelper mailHandler = new MimeMessageHelper(mail,true,"UTF-8");*/
			
			mailHelper.setFrom(from); 
			//빈에 아이디 설정한 것은 단순히 smtp 인증을 받기 위해 사용 따라서 보내는이(setForm()) 반드시 필요
			
			mailHelper.setTo(to);
			mailHelper.setSubject(subject);
			mailHelper.setText(content,true);
			//true는 HTML을 사용하겠다는 의미 (이미지 첨부 가능)
			
			FileSystemResource file = new FileSystemResource(new File("C:\\upload.txt"));
			mailHelper.addAttachment("업로드파일.형식", file);
			
			mailSender.send(mail);
			
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

 

 

5-2. MimeMessagePreparator를 사용하여 메일을 전송하는 방법

 

//MimeMessagePreparator를 사용하여 메이을 전송
	@RequestMapping(value = "/sandMail", method = RequestMethod.GET)
	public void sendMailTest2() throws Exception{
		String subject = "test 메일";
		String content = "메일 테스트 내용";
		String from = "ooo@naver.com";
		String to = "oooo@naver.com";
		
		final MimeMessagePreparator preparator = new MimeMessagePreparator() {
			
			public void prepare(MimeMessage mimeMessage) throws Exception{
				final MimeMessageHelper mailHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
				
				mailHelper.setFrom(from);
				mailHelper.setTo(to);
				mailHelper.setSubject(subject);
				mailHelper.setText(content, true);
			}
		};
	
		try {
			mailSender.send(preparator);
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

 

 

 

6. 메일 전송 테스트

 

 

테스트를 위해 src/test/java 파일의 com.angel.controller 패키지에 MailTestController.java 파일을 생성해 줍니다.

 

package com.angel.controller;

import java.io.File;

import javax.mail.internet.MimeMessage;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class MailTestController {

		@Autowired
	    JavaMailSenderImpl mailSender;
	    
	    // MimeMessage 객체를 직접 생성하여 메일을 발송하는 방법
	    @Test
	    public void mailSendTest() throws Exception{
	        
	    	String subject = "test 메일";
			String content = "메일 테스트 내용" + "<img src=\"https://blog.kakaocdn.net/dn/cssZNA/btsbtefJFRI/Aq8KgwKe18GyXPRiWbu6KK/img.jpg\">";
			String from = "ooo@naver.com";
			String to = "oooo@naver.com";
	        
	        try {
	            MimeMessage mail = mailSender.createMimeMessage();
	            MimeMessageHelper mailHelper = new MimeMessageHelper(mail, "UTF-8");
	            
	            mailHelper.setFrom(from);
	            mailHelper.setTo(to);
	            mailHelper.setSubject(subject);
	            mailHelper.setText(content, true);
	            
	            FileSystemResource file = new FileSystemResource(new File("C:\\test.txt")); 
	            mailHelper.addAttachment("test.txt", file);            
	            
	            mailSender.send(mail);
	            
	        } catch(Exception e) {
	            e.printStackTrace();
	        }
	        
	    }
	    
	    // MimeMessagePreparator를 사용해서 메일을 전송하는 방법
	    @Test
	    public void mailSendTest2() throws Exception{
	        
	    	String subject = "test 메일";
			String content = "메일 테스트 내용" + "<img src=\"https://blog.kakaocdn.net/dn/cssZNA/btsbtefJFRI/Aq8KgwKe18GyXPRiWbu6KK/img.jpg\">";
			String from = "ooo@naver.com";
			String to = "oooo@naver.com";
	        
	        try {
	            final MimeMessagePreparator preparator = new MimeMessagePreparator() {
	                
	                public void prepare(MimeMessage mimeMessage) throws Exception{
	                    final MimeMessageHelper mailHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
	                    
	                    mailHelper.setFrom(from);
	                    mailHelper.setTo(to);
	                    mailHelper.setSubject(subject);
	                    mailHelper.setText(content, true);
	                    
	                    FileSystemResource file = new FileSystemResource(new File("C:\\test.txt")); 
	                    mailHelper.addAttachment("test.txt", file);
	                    
	                }
	                
	            };
	            
	            mailSender.send(preparator);
	            
	        } catch(Exception e) {
	            e.printStackTrace();
	        }
	        
	        
	        
	    }
}

 

 

 

두개의 메서드 중 하나만 JUnit 테스트를 실행합니다.

이미지 파일과 텍스트가 메일로 온걸 확인 하실 수 있습니다 👍

 

 

 

 

 

 

 

 

 

이상입니다. ╰(*°▽°*)╯

 

 

 

추가 설명 덧붙일 예정...(┬┬﹏┬┬)

 

 

 

 

 

 

 

참고 : Kim VamPa (tistory.com) 👍

728x90
반응형