Java/Spring Boot

[Java] Spring Boot Mail 이해하고 활용하기 -1 : 텍스트, HTML 기반 메일 전송

adjh54 2024. 11. 11. 23:24
반응형
해당 글에서는 Spring Boot 환경에서 Mail 라이브러리를 활용하여 텍스트 기반 전송과 HTML 기반 메일 전송하는 방법에 대해 알아봅니다.




1) Spirng Boot Mail


💡 Spirng Boot Mail

- Java 애플리케이션에서 이메일을 쉽게 보낼 수 있도록 지원하는 Spring Framework의 모듈입니다.
- 이 모듈은 JavaMail API를 추상화하여 개발자가 복잡한 저수준 설정 없이도 효율적으로 이메일 기능을 구현할 수 있게 해 줍니다.
특징 설명
간편한 설정 Spring Boot의 자동 구성 기능으로 최소한의 설정으로 이메일 서비스 구축 가능
다양한 프로토콜 지원 SMTP, POP3, IMAP 등 다양한 이메일 프로토콜 지원
템플릿 엔진 통합 Thymeleaf, FreeMarker 등의 템플릿 엔진과 쉽게 통합하여 동적 이메일 내용 생성 가능
첨부 파일 지원 이메일에 첨부 파일을 쉽게 추가 가능
비동기 전송 대량의 이메일을 비동기적으로 전송할 수 있는 기능 제공

 

1. Mail 프로토콜


💡 Mail 프로토콜

- 이메일을 주고받는 데 사용되는 규칙과 절차를 정의하는 통신 규약입니다. 주요 메일 프로토콜에는 SMTP, POP3, IMAP이 있습니다.
- 이러한 프로토콜들은 이메일 시스템의 기반을 형성하며, 각각의 특성에 따라 다양한 이메일 서비스와 클라이언트에서 활용됩니다.

 

1.1. SMTP (Simple Mail Transfer Protocol)


💡 SMTP (Simple Mail Transfer Protocol)

- 이메일을 보내는 데 사용되는 프로토콜로, 클라이언트에서 서버로, 또는 서버 간 이메일 전송을 담당합니다.

- 일반적으로 포트 25, 587(TLS/STARTTLS), 또는 465(SSL)를 사용합니다.

 

1.2. POP3 (Post Office Protocol version 3)


💡 POP3 (Post Office Protocol version 3)

- 이메일을 받는 데 사용되는 프로토콜로, 서버에서 클라이언트로 이메일을 다운로드하고 일반적으로 서버에서 메일을 삭제합니다.

- 일반적으로 포트 110(비암호화) 또는 995(SSL/TLS)를 사용합니다.

 

1.3. IMAP (Internet Message Access Protocol)


💡 IMAP (Internet Message Access Protocol)

- POP3와 마찬가지로 이메일을 받는 데 사용되지만, 서버에 이메일을 보관하면서 여러 기기에서 동기화가 가능하고 고급 기능을 제공합니다.

- 일반적으로 포트 143(비암호화) 또는 993(SSL/TLS)을 사용합니다.

 
 

2. 송신자(Sender)의 SMTP 프로토콜을 통한 메일 전송 과정 / 수신자(Recipient)의 IAMP / POP3를 통한 메일 수신 과정


💡 송신자(Sender)의 SMTP 프로토콜을 통한 메일 전송 과정

1. 메일 작성 및 전송
- 이메일 전송자(Sender)는 클라이언트에게 메시지를 작성하고 ‘보내기’를 클릭합니다.

2. SMTP 클라이언트
- 이메일 클라이언트의 SMTP 모듈이 메시지를 SMTP 서버로 전송합니다.

3. 발신자의 SMTP 서버(Sender’s Mail Server)
- 메시지를 받아 수신자의 도메인을 확인하고, DNS를 통해 수신자의 메일 서버를 찾습니다.

4. 수신자 SMTP 서버 전달
- 발신자의 SMTP 서버가 수신자의 SMTP 서버로 메시지를 전달합니다.

5. 메일박스 저장
- 수신자의 SMTP 서버(Recipient’s Mail Server)가 메시지를 받아 수신자의 메일박스에 저장합니다.

💡 수신자(Recipient)의 IAMP / POP3를 통한 메일 수신 과정

1. 메일 확인 요청
- 수신자가 이메일 클라이언트를 열어 새 메일을 확인합니다.

2. 서버 연결
- 클라이언트가 IMAP 또는 POP3 프로토콜을 사용하여 메일 서버에 연결합니다.

3. 메시지 검색 및 다운로드
- POP3의 경우: 서버에서 메시지를 다운로드하고 일반적으로 서버에서 삭제합니다.
- IMAP의 경우: 서버와 클라이언트 간 메시지를 동기화하고, 메시지는 서버에 유지됩니다.

4. 메시지 표시
- 다운로드되거나 동기화된 메시지가 사용자의 이메일 클라이언트에 표시됩니다.

https://www.cloudns.net/blog/smtp-simple-mail-transfer-protocol-explained/

 

[ 더 알아보기 ]

💡 메일 박스(Mail Box)

- 이메일 시스템에서 사용자의 이메일 메시지를 정하고 관리하는 가상의 저장소입니다.

1. 개인화된 공간: 각 사용자마다 고유한 메일 박스가 할당됩니다.
2. 메시지 저장: 받은 이메일, 보낸 이메일, 임시 저장 메일 등을 보관합니다.
3. 폴더 구조: 사용자가 메일을 체계적으로 정리할 수 있도록 폴더 시스템을 제공합니다.
4. 용량 제한: 일반적으로 메일 서비스 제공자가 정한 저장 용량 제한이 있습니다.
5. 접근 방식: IMAP이나 POP3 프로토콜을 통해 접근 가능합니다.

 
 

3. Spring Boot Mail 클래스 구조


💡 Spring Boot Mail 클래스 구조

- Spring Boot Mail 라이브러리를 사용하는 경우에 사용되는 클래스/인터페이스 구조에 대해 알아봅니다.
클래스 / 인터페이스 분류 설명
MailMessage 인터페이스 이메일 메시지의 기본 인터페이스로, 메시지의 기본 속성을 정의합니다.
SimpleMailMessage 인터페이스 구현체(클래스) 간단한 텍스트 이메일을 위한 구현체로, 기본적인 이메일 속성만을 포함합니다.
MimeMessage 인터페이스 구현체(클래스) 복잡한 이메일(HTML, 첨부파일 등)을 위한 구현체로, 다양한 MIME 타입을 지원합니다.
     
MailSender 인터페이스 이메일 전송을 위한 기본 인터페이스로, SimpleMailMessage 전송 메서드를 제공합니다.
JavaMailSender 인터페이스 MailSender를 확장한 인터페이스로, MimeMessage 및 첨부파일 지원 등 추가 기능을 제공합니다.
JavaMailSenderImpl 인터페이스 구현체(클래스) JavaMailSender 인터페이스의 실제 구현체로, SMTP 서버 설정 및 이메일 전송 로직을 포함합니다.
     
MailMessagePreparator 인터페이스 MimeMessage 객체를 준비하기 위한 콜백 인터페이스입니다.
MimeMessageHelper 클래스 MimeMessage 생성을 돕는 유틸리티 클래스로, 복잡한 이메일 작성을 간소화합니다.

https://www.javatpoint.com/spring-java-mail-tutorial

 
 

4. Spring Boot Mail 구조


💡 Spring Boot Mail 이메일 구조

- 이메일 전송을 위해 MailMessage 인터페이스를 호출하여 두 개의 인터페이스 구현체(SimpleMailMessage, MimeMessage) 사용이 가능합니다.

- SimpleMailMessage의 경우는 간단한 텍스트 기반의 이메일을 보내는 용도이며, MimeMessage의 경우는 HTML, 텍스트, 멀티파트, 첨부 파일 등 고급 기능을 이용하는 데 사용되는 용도입니다.

 

4.1. SimpleMailMessage


💡 SimpleMailMessage

- 간단한 텍스트 기반 이메일을 보내는 데 사용되며 보낸 사람, 받는 사람, 참조 등을 추가하여 간단한 메시지 전송에 사용이 됩니다.
특징 설명
텍스트 전용 일반 텍스트 형식의 이메일만 지원합니다.
간단한 구조 받는 사람, 제목, 내용 등 기본적인 이메일 필드만 설정할 수 있습니다.
첨부 파일 미지원 파일 첨부 기능이 없습니다.
사용 편의성 간단한 이메일을 빠르게 작성하고 보내는 데 적합합니다.

 
 

💡 간단 예시

- SimpleMailMessage를 사용하여 텍스트 형식의 이메일을 구성하여 JavaMailSender를 통해 이메일을 보내는 코드입니다
@Autowired
private JavaMailSender mailSender;

public void sendSimpleMessage(String to, String subject, String text) {
    SimpleMailMessage message = new SimpleMailMessage();
    message.setFrom("noreply@example.com");
    message.setTo(to);
    message.setSubject(subject);
    message.setText(text);
    mailSender.send(message);
}
 

SimpleMailMessage (Spring Framework 6.1.14 API)

Models a simple mail message, including data such as the from, to, cc, subject, and text fields. Consider JavaMailSender and JavaMail MimeMessages for creating more sophisticated messages, for example messages with attachments, special character encodings,

docs.spring.io

 

4.2. MimeMessage


💡 MimeMessage

- SimpleMailMessage에 비해 상대적으로 더 복잡하고 다양한 형식(HTML, 텍스트, 멀티파트 등)의 이메일을 보내는 데 사용이 됩니다.
특징 설명
다양한 형식 지원 HTML, 텍스트, 멀티파트 등 다양한 형식의 이메일을 작성할 수 있습니다.
첨부 파일 지원 이메일에 파일을 첨부할 수 있습니다.
고급 기능 CC, BCC, 우선순위 설정 등 다양한 이메일 옵션을 설정할 수 있습니다.
유연성 복잡한 구조의 이메일을 세밀하게 제어할 수 있습니다.

 
 

💡 간단 예시

- MimeMessage를 사용하여 HTML 형식의 이메일을 구성하여 JavaMailSender를 통해 이메일을 보내는 코드입니다.
@Autowired
private JavaMailSender mailSender;

public void sendHtmlMessage(String to, String subject, String htmlBody) throws MessagingException {
    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
    
    helper.setFrom("sender@example.com");
    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(htmlBody, true); // true는 HTML 형식을 의미합니다
    
    mailSender.send(message);
}
 

MimeMessage (Jakarta EE Platform API)

Output the message as an RFC 822 format stream. Note that, depending on how the messag was constructed, it may use a variety of line termination conventions. Generally the output should be sent through an appropriate FilterOutputStream that converts the li

jakarta.ee

 
 

4.3. MimeMessageHelper


💡 MimeMessageHelper

- MimeMessage를 좀 더 쉽게 사용할 수 있도록 해주는 래퍼 클래스입니다. 이를 통해 복잡한 이메일 구성을 간단하게 만들어줍니다.

 
 

💡 사용 예시

- MimeMessage 직접 사용하는 경우와 MimeMessageHelper를 사용하는 경우가 있습니다.

- MimeMessage의 경우는 직접 사용하면 세부적인 제어가 가능하지만, 복잡한 API를 다뤄야 합니다.
- MimeMessageHelper의 경우는 MimeMessage 생성을 간소화하고, 편리한 메서드를 제공합니다. 이를 통해 복잡한 이메일 구성을 간단하게 만들어줍니다.
// MimeMessage 직접 사용
MimeMessage message = mailSender.createMimeMessage();
message.setSubject("제목");
message.setText("내용");
message.setRecipients(Message.RecipientType.TO, "recipient@example.com");

// MimeMessageHelper 사용
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
helper.setSubject("제목");
helper.setText("내용", true); // HTML 지원
helper.setTo("recipient@example.com");
helper.addAttachment("파일명.pdf", new File("경로/파일명.pdf"));

 
 

반응형


 

2) Spirng Boot Mail 공통 기본 설정


 

1. 개발 환경


개발 환경 버전
java 17
Spring Boot 3.3.5
spring-boot-starter-web 3.3.5
spring-boot-starter-mail 3.3.5
lombok -
SMTP Google, Naver

 

2. 의존성 추가


💡 의존성 추가

- API 호출로 데이터를 받아서 메일을 전송하는 구조로 구성하였습니다. 또한 html 이메일 전송을 위해 thymeleaf 의존성을 추가하였습니다.
dependencies {
    // [Spring Boot Starter]
    implementation "org.springframework.boot:spring-boot-starter-web"
    implementation "org.springframework.boot:spring-boot-starter-mail"
    implementation "org.springframework.boot:spring-boot-starter-thymeleaf"
}

Maven Repository: org.springframework.boot » spring-boot-starter-mail
 
 
 

3. SMTP 설정


💡 SMTP 설정

- Google, NAVER를 통해서 메일을 전송하기 위해 SMTP 설정이 필요합니다.
- 아래의 글을 참고하시면 설정하실 수 있습니다.

 
https://adjh54.tistory.com/597
 

 

[Java] NAVER 메일 SMTP 환경 설정 방법

해당 글에서는 NAVER 메일의 SMTP 환경 설정방법에 대해 알아봅니다.1) NAVER 메일 활성화 과정 -1 : IMAP 활성화 1. 네이버 로그인 > 환경설정 버튼을 누릅니다.   2. POP3/IMAP 설정 > POP3/ISMTP 내에서 '사

adjh54.tistory.com

 
 
 
 
 

4. Properties 파일 설정


 

spring:
  mail:
    host: smtp.gmail.com          # 구글 SMTP 서버 주소
    port: 587                     # 구글 SMTP 포트 번호
    username: xxxxxxxx@gmail.com  # 사용자 이메일
    password: xxxx xxxx xxxx xxxx # 사용자 앱 비밀번호
    properties:
      mail:
        smtp:
          auth: true              # 사용자 인증 여부
          timeout: 5000           # 이메일 전송 타임아웃 시간
          starttls:
            enable: true          # TLS를 통해 안전한 통신 사용 여부

 
 

3) Spirng Boot Mail 활용하기 -1 : 텍스트 기반 메일 전송


💡 Spirng Boot Mail 활용하기 -1 : 텍스트 기반 메일 전송

- 해당 구성에서는 API 호출로 데이터가 전달이 되었을 때, 텍스트 기반의 메일을 전송하도록 구성하였습니다.

 

1. MailTxtSendDto


💡 MailTxtSendDto

- 간단한 구조로 수신자 이메일, 이메일 제목, 이메일 내용 형태로 객체를 클라이언트로부터 전달받는 구조로 구성하였습니다.
package com.adjh.springbootmail.dto;

import lombok.Builder;
import lombok.Getter;

/**
 * SimpleMailMessage 기반 텍스트 메일 전송 DTO
 *
 * @author : jonghoon
 * @fileName : MailTxtSendDto
 * @since : 11/11/24
 */
@Getter
public class MailTxtSendDto {

    private String emailAddr;                   // 수신자 이메일

    private String subject;                     // 이메일 제목

    private String content;                     // 이메일 내용

    @Builder
    public MailTxtSendDto(String emailAddr, String subject, String content) {
        this.emailAddr = emailAddr;
        this.subject = subject;
        this.content = content;
    }
}

 
 

2. MailSendService


💡 MailSendService

- 이메일 전송에 대한 반환값을 받을 수는 없기에 MailTxtSendDto 객체를 파라미터로 전달하여 비즈니스 로직을 처리하도록 하는 인터페이스를 구성하였습니다.
package com.adjh.springbootmail.service;

import com.adjh.springbootmail.dto.MailTxtSendDto;
import org.springframework.stereotype.Service;

/**
 * 이메일 전송 서비스
 *
 * @author : jonghoon
 * @fileName : MailSendService
 * @since : 11/11/24
 */
@Service
public interface MailSendService {
    void sendTxtEmail(MailTxtSendDto mailTxtSendDto);       // SimpleMailMessage를 활용하여 텍스트 기반 메일을 전송합니다.
}

 
 

3. MailSendServiceImpl


 💡 MailSendServiceImpl

- 이메일 전송에 대한 인터페이스의 구현체로 JavaMailSender를 주입받아서 메일을 전송하는 구조입니다.
- SimpleMailMessage 객체를 통해서, 받는 사람 이메일, 제목, 내용을 구성하여 JavaMailSender를 통해서 텍스트 기반 이메일을 전송하는 구조입니다.
package com.adjh.springbootmail.service.impl;

import com.adjh.springbootmail.dto.MailTxtSendDto;
import com.adjh.springbootmail.service.MailSendService;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

/**
 * 이메일 전송 서비스의 구현체
 *
 * @author : jonghoon
 * @fileName : MailSendServiceImpl
 * @since : 11/11/24
 */
@Service
public class MailSendServiceImpl implements MailSendService {
    private final JavaMailSender mailSender;

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

    /**
     * 텍스트 기반 메일 전송
     *
     * @param mailTxtSendDto
     */
    @Override
    public void sendTxtEmail(MailTxtSendDto mailTxtSendDto) {
        SimpleMailMessage smm = new SimpleMailMessage();
        smm.setTo(mailTxtSendDto.getEmailAddr());      // 받는 사람 이메일
        smm.setSubject(mailTxtSendDto.getSubject());            // 이메일 제목
        smm.setText(mailTxtSendDto.getContent());               // 이메일 내용
        try {
            mailSender.send(smm);                   // 메일 보내기
            System.out.println("이메일 전송 성공!");
        } catch (MailException e) {
            System.out.println("[-] 이메일 전송중에 오류가 발생하였습니다 " + e.getMessage());
            throw e;
        }
    }
}

 
 

4. 결과 확인


💡 결과 확인

- Controller 부분은 제외하였지만, 해당 서비스를 호출하여 데이터를 전달하는 구조로 되어 있습니다.
- @requestBody로 아래와 같은 객체 형태로 데이터를 전달하면 이메일이 전송됩니다.

 
 

4) Spirng Boot Mail 활용하기 -2 : HTML 기반 메일 전송


💡 Spirng Boot Mail 활용하기 -2 : HTML 기반 메일 전송

- 텍스트 자체로 메일을 보내는 경우도 있지만, 일정 틀을 갖추고 디자인이 적용된 이메일을 전송하고자 할 때 이를 이용합니다.

 

1. MailHtmlSendDto


💡 MailHtmlSendDto

- 이전에 구성한 텍스트 메일과 동일한 구조에서 target 멤버 변수를 추가하여 각기 다른 메시지를 출력하도록 하는 동적 메일을 전송하기 위해 추가하였습니다.
package com.adjh.springbootmail.dto;

import lombok.Getter;

/**
 * MimeMessageHelper 기반의 HTML 메일 전송
 *
 * @author : jonghoon
 * @fileName : MailHtmlSendDto
 * @since : 11/11/24
 */
@Getter
public class MailHtmlSendDto {

    private String emailAddr;                   // 수신자 이메일

    private String subject;                     // 이메일 제목

    private String content;                     // 이메일 내용

    private String target;                      // 이메일 대상 타겟을 지정합니다.

    public MailHtmlSendDto(String emailAddr, String subject, String content, String target) {
        this.emailAddr = emailAddr;
        this.subject = subject;
        this.content = content;
        this.target = target;
    }
}

 
 

2. MailSendService


💡 MailSendService

- sendHtmlEmail()에서도 동일하게 이메일 전송에 대한 반환값을 받을 수는 없기에 mailHtmlSendDto 객체를 파라미터로 전달하여 비즈니스 로직을 처리하도록 하는 인터페이스를 구성하였습니다.
package com.adjh.springbootmail.service;

import com.adjh.springbootmail.dto.MailHtmlSendDto;
import com.adjh.springbootmail.dto.MailTxtSendDto;
import org.springframework.stereotype.Service;

/**
 * 이메일 전송 서비스
 *
 * @author : jonghoon
 * @fileName : MailSendService
 * @since : 11/11/24
 */
@Service
public interface MailSendService {
    void sendHtmlEmail(MailHtmlSendDto mailHtmlSendDto);    // MimeMessageHelper를 활용하여 HTML 기반 메일을 전송합니다.
}

 
 

3. MailSendServiceImpl


💡 MailSendServiceImpl

- 이메일 전송에 대한 인터페이스의 구현체로 JavaMailSender를 주입받아서 메일을 전송하는 구조입니다.

- 추가로 Thymeleaf로 구성한 html 파일 자체를 메일로 전송하기 위해 TemplateEngine을 주입받았습니다.
- sendHtmlEmail() 메서드에서는 MimeMessageHelper 클래스를 통해서 간단한 HTML 메시지를 구성합니다.

- Thymeleaf 템플릿 엔진을 사용하여 동적 HTML 콘텐츠를 생성합니다.
1. subject : 전달받은 객체로 메일 제목을 설정합니다.
2. message : 전달받은 객체로 메일 내용을 설정합니다.
3. userType : 전달받은 객체 중 “target”이라는 값에 따라서 유동적으로 텍스트를 출력하도록 구성하였습니다.
4. ogoImage : 프로젝트 static/images/logo.png에 있는 파일을 불러와서 base64로 변환하였습니다.

- 최종적으로 mailSender를 통해서 메일을 전송합니다.
package com.adjh.springbootmail.service.impl;

import com.adjh.springbootmail.dto.MailHtmlSendDto;
import com.adjh.springbootmail.dto.MailTxtSendDto;
import com.adjh.springbootmail.service.MailSendService;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.util.StreamUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.IOException;
import java.util.Base64;

/**
 * 이메일 전송 서비스의 구현체
 *
 * @author : jonghoon
 * @fileName : MailSendServiceImpl
 * @since : 11/11/24
 */
@Service
public class MailSendServiceImpl implements MailSendService {
    private final JavaMailSender mailSender;
    private final TemplateEngine templateEngine;

    public MailSendServiceImpl(JavaMailSender mailSender, TemplateEngine templateEngine) {
        this.mailSender = mailSender;
        this.templateEngine = templateEngine;
    }

    /**
     * html 기반 메일 전송
     *
     * @param mailHtmlSendDto
     */
    @Override
    public void sendHtmlEmail(MailHtmlSendDto mailHtmlSendDto) {
        try {
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");

            Context context = new Context();
            context.setVariable("subject", mailHtmlSendDto.getSubject());
            context.setVariable("message", mailHtmlSendDto.getContent());
            if (mailHtmlSendDto.getTarget().equals("user")) {
                context.setVariable("userType", "일반 사용자");
            } else if (mailHtmlSendDto.getTarget().equals("admin")) {
                context.setVariable("userType", "관리자");
            }

            // MailSendServiceImpl.java 내부
            String base64Image = getBase64EncodedImage("static/images/logo.png");
            context.setVariable("logoImage", base64Image);

            String htmlContent = templateEngine.process("email-template", context);
            helper.setTo(mailHtmlSendDto.getEmailAddr());
            helper.setSubject(mailHtmlSendDto.getSubject());
            helper.setText(htmlContent, true);
            mailSender.send(message);
            System.out.println("Thymeleaf 템플릿 이메일 전송 성공!");
        } catch (MessagingException e) {
            System.out.println("[-] Thymeleaf 템플릿 이메일 전송 중 오류 발생: " + e.getMessage());
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // 이미지를 Base64로 인코딩하는 메서드
    private String getBase64EncodedImage(String imagePath) throws IOException {
        Resource resource = new ClassPathResource(imagePath);
        byte[] bytes = StreamUtils.copyToByteArray(resource.getInputStream());
        return Base64.getEncoder().encodeToString(bytes);
    }

}

 
 

4. email-template.html


💡 email-template.html

- themelaf는 기본적인 설정을 하지 않는다면, resources/templates를 기본 경로로 인식을 하기에, 기본 경로에 email-template.html이라는 파일을 구성하였습니다.
- static/images 경로에 logo.png 파일을 추가하여 프로젝트 내의 이미지를 메일에 포함하도록 구성하였습니다.

 

💡 비즈니스 로직에서 Context로 지정한 속성 값에 따라서 해당 themelaf의 html의 변수 값이 지정이 됩니다.

- 추가로 logoImage 변수는 base64로 변환된 상태이기에 그 자체로 출력을 합니다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title th:text="${subject}"></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<div style="display: flex;">
    <p th:text="${userType}"/>
    <p>님, 안녕하세요!</p>
</div>
<br/>
<p th:text="${message}"></p>
<img img th:src="'data:image/png;base64,' + ${logoImage}" alt="로고 이미지"/>
</body>
</html>

 
 

5. 결과 확인 -1


💡 결과 확인 -1

- 아래와 같이 지정한 엔드포인트로 구성 객체 값을 전송하였습니다.
- 해당 부분에서는 target을 “user”로 지정하여 전송하였습니다.

 
 

💡target= “user”인 경우 일반 사용자라고 출력하도록 구성하였기에 아래와 같이 출력되었고, 프로젝트에 있는 이미지를 이메일에 포함하여 출력하였습니다.

 

 
 
 

6. 결과 확인 -2


💡 결과 확인 -2

- 아래와 같이 지정한 엔드포인트로 구성 객체 값을 전송하였습니다.
- 해당 부분에서는 target을 “admin”로 지정하여 전송하였습니다.

💡 target= “admin”인 경우 “관리자”로 출력하도록 구성하였기에 아래와 같이 출력되었고, 프로젝트에 있는 이미지를 이메일에 포함하여 출력하였습니다.

 

 
 
 

💡 [참고] 해당 구성 소스코드는 아래에서 확인이 가능합니다.
 

blog-codes/spring-boot-mail at main · adjh54ir/blog-codes

Contributor9 티스토리 블로그 내에서 활용한 내용들을 담은 레포지토리입니다. Contribute to adjh54ir/blog-codes development by creating an account on GitHub.

github.com

 
 
 
 
 
오늘도 감사합니다 😀

 

반응형