[그룹웨어] Java Mail Api 사용 (메일 발송 기능 구현)

yihyun·2024년 12월 24일

ERP 개발 프로젝트

목록 보기
10/11
post-thumbnail

프로젝트를 진행하며, 아이디 또는 비밀번호를 찾고자 할 경우 등록된 이메일을 통해 메일로 인증코드를 발송하는 기능을 개발하기로 했다.

해당 기능을 위해 Java Mail API를 사용해 메일 발송 기능을 구현했다.

자바 API 설정

이메일 전송에 Java API를 사용하기 위해선 먼저 간단한 설정을 해줘야 한다.

직접 라이브러리를 다운받는 방법과 프로젝트에 의존성을 추가해주는 방법이 있는데, 나는 Spring Boot를 사용하기 때문에 의존성을 추가해줬다!

<!-- java 메일 api -->
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
		
<!-- java 메일 기능 라이브러리 javax.activation -->
<!-- https://mvnrepository.com/artifact/com.sun.activation/javax.activation -->
<dependency>
    <groupId>com.sun.activation</groupId>
    <artifactId>javax.activation</artifactId>
    <version>1.2.0</version>
</dependency>

❗ 만약 직접 다운받아 사용하는 경우 아래 방법을 따르면 된다!

  1. JavaMail Api 다운로드 (jar 파일 다운로드!)
    https://github.com/javaee/javamail/releases

  2. javax 다운로드 (jar 파일 다운로드!)
    http://www.java2s.com/example/jar/j/download-javaxactivation120jar-file.html

  3. 프로젝트에 import

메일 SMTP 환경 설정 (메일을 보내는 내 계정)

나는 구글을 사용했기 때문에 구글을 설정해줬다.
다른 글들을 찾아보면 엑세스 설정 방식들이 나와있는데, 이 방법은 구글에서 서비스를 종료해 사용하지 못한다.. 😭

액세스 설정
내 계정 -> 보안 -> 보안 수준이 낮은 앱의 액세스 -> 사용 설정

그래서 앱 비밀번호를 사용해줘야 한다.

2단계 인증을 통해 앱 비밀번호를 발급받고 이를 기존의 PW 대신 입력하여 사용해주면 되는데 방법은 🔽

자신의 프로필 -> [Google 계정 관리] -> [보안] 페이지 -> [Google에 로그인] 중 [2단계 인증] 에서 2단계 인증을 설정하고, 앱 비밀번호 를 발급받아 기존 패스워드 대신 사용해주면 된다!

앱 비밀번호를 발급받으면 이렇게 생성된걸 확인할 수 있다!

이 과정을 거치지 않으면 javax.mail.AuthenticationFailedException 이 발생한다 💢

개발

  1. 먼저 발신자의 메일 계정과 비밀번호를 설정해준다.
    코드에 직접 작성해도 문제는 없지만.. 보안을 위해서 application.properties에 작성해 사용하는 방식을 활용했다.
    @Value("${spring.mail.username}") private String emailId;

    @Value("${spring.mail.password}") private String emailPw;
  1. 코드 작성
  • Property에 SMTP 서버 정보를 설정한다.
  • SMTP 서버 정보와 사용자 정보를 기반으로 Session 클래스의 인스턴스를 생성한다.
  • Message 클래스의 객체를 사용하여 수신자와 내용, 제목의 메시지를 작성한다.
  • Transport 클래스를 사용하여 작성한 메시지를 전달한다.
	private void sendMail(UserDTO dto) {
		
		logger.info("메일 발송");
		
		String receiverId = "받는 사람 이메일 주소";
		String subject = "메일 제목 작성";
		
		Properties props = new Properties();
		props.put("mail.smtp.host", "smtp.gmail.com");
		props.put("mail.smtp.port", "465");
		props.put("mail.smtp.auth", "true");
		props.put("mail.smtp.ssl.enable", "true");
		props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
		
		Session session = Session.getInstance(props, new Authenticator() {
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(emailId, emailPw);
			}
		});

		try {
			message.setFrom(new InternetAddress(emailId));
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(receiverId));
			message.setSubject(subject);
            message.setText("내용입력");
			
			Transport.send(message);
			
		} catch (MessagingException e) {
			e.printStackTrace();
			logger.info("이메일 전송 실패");
		}
		
	}

이렇게 하면 메일 발송이 완료된다!!

다음 글에서는 Thymeleaf 를 활용해 HTML로 메일 본문을 만들어 발송하는 내용을 다뤄볼 예정이다!

profile
개발자가 되어보자

0개의 댓글