728x90
반응형

 

회사에서 개발을 진행하는데 비밀번호 인증번호를 메일로 전송해야하는 상황이 생겼습니다.

 

Sprint Boot 로 개발을 해보려고 찾아보던중 간단하게 Mail을 전송하는 방법을 정리해보려고 합니다.

 

너무 많은 정보들 중에 꼭 필요한 부분만 처리해야하지만 복잡하게 설명이 되어있어 간략하게 진행해본뒤에 작성하는 글 입니다.

 

개발 환경은 Spring Boot 2.x + Gradle 입니다.

 

 

 

 

선행해야되는 부분은 발송설정을 Gmail 등록할땐 보안 수준이 낮은 앱의 액세서를 꼭 허용해야 합니다.

 

허용하지 않고 진행한다면 아래와같은 메일을 받으실 수 있습니다.

활동확인으로 보안수준이 낮은 앱 차단이 되고 있는지 알수 있습니다.

 

 

Google에서 액세스를 막고 있기 때문에 아래의 URL로 접속해서 허용을 해주시면 됩니다.

 

https://myaccount.google.com/lesssecureapps

 

로그인 - Google 계정

하나의 계정으로 모든 Google 서비스를 Google 계정으로 로그인

accounts.google.com

 

 

build.gradle 에 mail 관련 의존성 주입

/// Mail
implementation 'org.springframework.boot:spring-boot-starter-mail'

 

 

 

application.yml 에서 mail 설정

Gmail 기준으로 작성해보았습니다.

 

host 는 고정값이며, port 는 465 or 587 로 사용가능합니다.

 

id에 @gmail.com 생략 가능하고 password 도 입력해주시면 됩니다.

 

Gmail 인증관련의 TLS 설정을 해줍니다.

# ===============================

# = Email Config

# ===============================

spring:

    mail:

        # Gmail smtp

        host: smtp.gmail.com

 

        # 465 또는 587

        port: 587

 

        # id

        username: 아이디

 

        # password

        password: 비밀번호

 

        # TLS

        properties:

            mail:

                smtp:

                    auth: true

                    starttls:

                        enable: true

cs

 

 

 

 

Java 코드를 작성

EmailService 라는 class 를 생성해주었습니다.

 

@Service 어노테이션을 통해 Bean으로 등록해줍니다.

 

JavaMailSender 과 TemplateEngine 을 생성자로 의존성 주입을 받습니다.

 

받는 메일주소와 제목, 내용을 파라미터로 받고 MimeMessagePreparator 와 MimeMessageHelper 를 구현합니다.

 

build() 함수에서 Thymeleaf 파일경로를 잡아주고 Thymeleaf 에서 사용할 변수를 설정해줄 수 있습니다.

 

지금은 text 라는 변수만 생성해 주었으며 messageHelper.setText() 로 설정한 content 를 넣어주고 두번째 인자에선 html로 사용하겠다는 설정을 해주었습니다.

 

기본값은 text이기 때문에 <html> ... <html> 형태로 받게 되니 꼭 true 값을 넣어줍니다.

import org.springframework.mail.javamail.JavaMailSender;

import org.springframework.mail.javamail.MimeMessageHelper;

import org.springframework.mail.javamail.MimeMessagePreparator;

import org.springframework.stereotype.Service;

import org.thymeleaf.TemplateEngine;

import org.thymeleaf.context.Context;

 

@Service

public class EmailService {

 

    // Java 메일

    private JavaMailSender javaMailSender;

 

    // Thymeleaf Template 사용

    private TemplateEngine templateEngine;

 

    public EmailService(JavaMailSender javaMailSender, TemplateEngine templateEngine) {

        this.javaMailSender = javaMailSender;

        this.templateEngine = templateEngine;

    }

 

    public void sendSimpleMessage(String to, String subject, String text) {

        // Thymeleaf 사용

        MimeMessagePreparator message = mimeMessage -> {

            String content = build(text);

 

            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);

            messageHelper.setTo(to);

            messageHelper.setSubject(subject);

            messageHelper.setText(content, true);

        };

        javaMailSender.send(message);

    }

 

    /*

        Thymeleaf 셋팅

     */

    private String build(String text) {

        Context context = new Context();

        context.setVariable("text", text);

        return templateEngine.process("mail-template", context);

    }

}

Colored by Color Scripter

cs

 

 

 

 

메일을 전송했을때 보여주는 html 파일을 생성

Java에서 등록한 변수를 바로 사용할 수 있습니다.

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">

<head>

    <meta charset="UTF-8">

    <title>Mail Template</title>

</head>

<body>

 

    <span th:text="${text}"></span>

</body>

</html>

Colored by Color Scripter

cs

 

 

 

테스트 코드 작성

test package 에서 EmailSendTest 클래스를 생성하고 테스트를 진행해보면 됩니다.

 

테스트가 정상적으로 진행이 되면 메일을 확인할 수 있습니다.

import com.kcfinance.service.EmailService;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.test.context.junit4.SpringRunner;

 

@RunWith(SpringRunner.class)

@SpringBootTest

public class EmailSendTest {

 

    // 이메일 발송 테스트

    @Autowired

    private EmailService emailService;

 

 

    @Test

    public void sendEmail() {

        String to = "받는주소";

        String subject = "메일 테스트";

        String text = "메일 내용";

 

        emailService.sendSimpleMessage(to, subject, text);

    }

}

 

Colored by Color Scripter

cs

 

728x90
반응형

+ Recent posts