1. 현재(2026) 기준 빠른 가이드

1) 의존성 예시 (Spring Boot)

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2) 설정 예시 (application.yml)

spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: your_id@gmail.com
    password: your_app_password
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

3) 전송 예시 (JavaMailSender)

@Service
public class MailService {
  private final JavaMailSender mailSender;

  public MailService(JavaMailSender mailSender) {
    this.mailSender = mailSender;
  }

  public void sendAuthMail(String to, String link) throws MessagingException {
    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
    helper.setTo(to);
    helper.setSubject("[이메일 인증]");
    helper.setText("<p>아래 링크로 인증을 완료하세요.</p><a href='" + link + "'>인증하기</a>", true);
    mailSender.send(message);
  }
}

4) 보안 주의사항

  • Gmail의 “보안 수준이 낮은 앱 허용” 옵션은 현재 중단됨
  • 앱 비밀번호 또는 OAuth2 사용이 권장됨
  • TODO: 사용 중인 메일 제공자의 정책/포트/보안 옵션 확인 필요

2. 2017 기준 구현 흐름 (원문 요약)

[spring] 자바로 mail보내기 구현

mailsend

1. 구글에서 보안수준이 낮은 앱 허용 : 사용으로 변경 (현재는 중단됨)

<!-- mail library -->
<dependency>
	<groupId>javax.mail</groupId>
	<artifactId>mail</artifactId>
	<version>1.4.7</version>
</dependency>

<!-- mail 서포트 -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>${org.springframework-version}</version>
</dependency>

2. pom.xml 추가

  • javax.mail : 자바로 메일 보내기 위한 라이브러리
  • spring-support : 스프링에서 자주 쓰는건 아니지만 부가 기능들 제공 (캐쉬, 메일, 스케줄링, UI 등등)
// MailHandler.java
public class MailHandler { // 메일보내기 유틸 클래스
	private JavaMailSender mailSender;
	private MimeMessage message;
	private MimeMessageHelper messageHelper;

	public MailHandler(JavaMailSender mailSender) throws MessagingException {
		this.mailSender = mailSender;
		message = this.mailSender.createMimeMessage();
		messageHelper = new MimeMessageHelper(message, true, "UTF-8");
	}

	public void setSubject(String subject) throws MessagingException {
		messageHelper.setSubject(subject);
	}

	public void setText(String htmlContent) throws MessagingException {
		messageHelper.setText(htmlContent, true);
	}

	public void setFrom(String email, String name) throws UnsupportedEncodingException, MessagingException {
		messageHelper.setFrom(email, name);
	}

	public void setTo(String email) throws MessagingException {
		messageHelper.setTo(email);
	}

	public void addInline(String contentId, DataSource dataSource) throws MessagingException {
		messageHelper.addInline(contentId, dataSource);
	}

	public void send() {
		mailSender.send(message);
	}

}

// TempKey.java
public class TempKey { // 인증키 생성 클래스
	private boolean lowerCheck;
	private int size;

	public String getKey(int size, boolean lowerCheck) {
		this.size = size;
		this.lowerCheck = lowerCheck;
		return init();
	}

	private String init() {
		Random ran = new Random();
		StringBuffer sb = new StringBuffer();
		int num = 0;
		do {
			num = ran.nextInt(75) + 48;
			if ((num >= 48 && num <= 57) || (num >= 65 && num <= 90) || (num >= 97 && num <= 122)) {
				sb.append((char) num);
			} else {
				continue;
			}
		} while (sb.length() < size);
		if (lowerCheck) {
			return sb.toString().toLowerCase();
		}
		return sb.toString();
	}

}

3. MailHandler.java / TempKey.java 파일 만들기

<!-- root-context.xml -->
<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="아이디@gmail.com" />
	<property name="password" value="비밀번호" />

	<property name="javaMailProperties">
		<props>
			<prop key="mail.transport.protocol">smtp</prop>
			<prop key="mail.smtp.auth">true</prop>
			<prop key="mail.smtp.starttls.enable">true</prop>
			<prop key="mail.debug">true</prop>
		</props>
	</property>
</bean>

4. root-context.xml 파일 설정

  • 보낼 메일 설정 정보 (여기선 구글메일로 보냅니다.)
<!-- mapper.xml -->
<insert id="createAuthKey">
	insert into userAuth values(#{userEmail}, #{authKey})
</insert>

<update id="userAuth">
	<![CDATA[update user set userCertification = 1 where (select count(*) from userAuth where userEmail = #{userEmail}) > 0]]>
</update>

5. userMapper.xml 파일 수정 / 인증테이블(userAUth)에 인증키와 메일을 추가 한 후 인증 테이블에 해당메일이 있으면 유저테이블(user) 인증칼럼(userCertification)을 0 -> 1로 변경 (인증 여부 확인)

// dao
@Override
public void createAuthKey(String userEmail, String authKey) throws Exception { // 인증키 DB에 넣기
	Map<String, Object> map = new HashMap<String, Object>();

	map.put("userEmail", userEmail);
	map.put("authKey", authKey);

	session.selectOne(namespace + ".createAuthKey", map);
}

@Override
public void userAuth(String userEmail) throws Exception { // 인증키 일치시 DB칼럼(인증여부) false->true 로 변경
	session.update(namespace + ".userAuth", userEmail);
}

6. 인증키생성 DAO 와 인증여부확인 DAO 생성

// service
@Transactional
@Override
public void create(UserVO vo) throws Exception {
	dao.create(vo); // 회원가입 DAO
	String key = new TempKey().getKey(50, false); // 인증키 생성
	dao.createAuthKey(vo.getUserEmail(), key); // 인증키 DB저장
	MailHandler sendMail = new MailHandler(mailSender);
	sendMail.setSubject("[홈페이지 이메일 인증]"); // 메일제목
	sendMail.setText( // 메일내용
			"<h1>메일인증</h1>" +
			"<a href='http://localhost/user/emailConfirm?userEmail=" + vo.getUserEmail() +
			"&key=" + key +
			"' target='_blenk'>이메일 인증 확인</a>");
	sendMail.setFrom("아이디@gmail.com", "보낼사람 이름"); // 보낸이
	sendMail.setTo(vo.getUserEmail()); // 받는이
	sendMail.send();
}

@Override
public void userAuth(String userEmail) throws Exception {
	dao.userAuth(userEmail);
}

7. service에서 트랜잭션으로 처리 후 메일 보내기 / 사용자는 메일에서 링크 클릭시 localhost/user/emailConfirm 이동

userAuth 메서드는 인증여부 칼럼 변경 메서드

// controller
@RequestMapping(value = "/regUser", method = RequestMethod.GET) // 회원가입창 보기
public String registerGet() throws Exception {
	return "/user/userJoin";
}

@RequestMapping(value = "/regUser", method = RequestMethod.POST)
public String registerPost(UserVO vo, RedirectAttributes rttr) throws Exception { // 회원가입하기
	service.create(vo);
	rttr.addFlashAttribute("msg", "regSuccess");

	return "redirect:/";
}

@RequestMapping(value = "/emailConfirm", method = RequestMethod.GET)
public String emailConfirm(String userEmail, Model model) throws Exception { // 이메일 인증 확인창
		service.userAuth(userEmail);
		model.addAttribute("userEmail", userEmail);

		return "/user/emailConfirm"; // emailConfirm.jsp
}

8. Controller 에서 인증여부를 false -> true 로 바꾼 후 jsp로 반환

<!-- emailConfirm.jsp -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<script type="text/javascript">
		var userEmail = '${userEmail}';

		alert(userEmail + '님 회원가입을 축하합니다. 이제 로그인이 가능 합니다.');

		window.open('', '_self', ''); // 브라우저창 닫기
		window.close(); // 브라우저 창 닫기
	</script>
</body>
</html>

9. 사용자가 인증 후 인증창은 닫히고 이제 로그인 가능


참고사이트 : 사이트 이동

chanhee.kim's profile image

chanhee.kim

2017-11-27 14:12

Read more posts by this author