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. 메시지 표시
- 다운로드되거나 동기화된 메시지가 사용자의 이메일 클라이언트에 표시됩니다.
[ 더 알아보기 ]
💡 메일 박스(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 생성을 돕는 유틸리티 클래스로, 복잡한 이메일 작성을 간소화합니다. |
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);
}
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);
}
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
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”인 경우 “관리자”로 출력하도록 구성하였기에 아래와 같이 출력되었고, 프로젝트에 있는 이미지를 이메일에 포함하여 출력하였습니다.
💡 [참고] 해당 구성 소스코드는 아래에서 확인이 가능합니다.
오늘도 감사합니다 😀
반응형