ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot - JavaMailSender를 활용하여 메일 전송하기
    Framework & Library/Spring Boot 2023. 1. 31. 16:26

    JavaMailSender를 활용하여 메일 전송하기

    의존성 추가
    implementation 'org.springframework.boot:spring-boot-starter-mail'

    이메일 발송을 위해 build.gradle 파일에 위에 의존성을 추가한다.

     

    Gmail SMTP Server 설정

    구글 계정만 있으면 무료로 메일을 전송할 수 있는 Gmail SMTP Server를 이용할 것이다.

     

     

    Gmail SMTP Server를 사용하려면 요구사항에 맞는 설정이 필요하며, 그 내용은 위와 같다.

     

    spring:
      mail:
        host: smtp.gmail.com
        port: 587
        username: {USER_GMAIL_ADDRESS}
        password: {USER_GMAIL_PASSWORD}
        properties:
          mail:
            smtp:
              auth:true
              starttls:
                enable: true

    위 내용을 바탕으로 application.yml 파일에 설정을 작성한 예이다.

     

    ### My Ignore ###
    src/main/resources/application.yml

    application.yml 파일은 구글 계정 정보를 포함하고 있기 때문에, GitHub 등 외부에 공개할 시, 반드시 해당 파일을 제외하고 공개해야 한다. 위와 같이 .gitignore 파일에 설정을 추가함으로써, application.yml 파일을 제외할 수 있다.

     

    공통 영역의 구현

    우선 메일 발송과 직접적인 관련이 없는 영역들을 구현해 보겠다.

     

    1. HTML 파일

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>메일 발송</title>
    </head>
    <body>
        <h1>메일 발송</h1>
    
        <form th:action="@{/mail}" method="post">
            <input name="address" placeholder="이메일 주소"> <br>
            <input name="title" placeholder="제목"> <br>
            <textarea name="content" placeholder="메일 내용을 입력해주세요." cols="60" rows="20"></textarea>
            <button>발송</button>
        </form>
    </body>
    </html>

    resources/templates/mail.html 경로에 위와 같은 코드를 작성한다. 전송할 이메일 주소와 제목, 내용을 입력하는 간단한 폼 양식이다.

     

    2. Controller 클래스

    @Controller
    @RequiredArgsConstructor
    public class MailController {
        private final MailService mailService;
    
        @GetMapping("/mail")
        public String writeMail() {
            return "mail";
        }
    
        @PostMapping("/mail")
        public void sendMail(MailDto mailDto) {
            mailService.sendTextMail(mailDto);
        }
    }

    사용자 요청을 처리하기 위한 Controller 영역이다. 이메일을 작성하기 위해 폼 양식을 호출하기 위한 url과 이메일 전송 요청을 위한 url이 정의되어 있다.

     

    3. DTO 클래스

    @Getter
    @Setter
    @ToString
    @NoArgsConstructor
    public class MailDto {
        private String address;
    
        private String title;
    
        private String content;
    }

    사용자로부터 입력받은 메일 정보에 해당하는 MailDto이다. 해당 클래스는 전송할 이메일 주소(address), 제목(title), 내용(message)이 포함되어 있다.

     

    메일 발송 로직의 구현 - SimpleMailMessage

    SimpleMailMessage를 사용하여 간단한 텍스트 메일을 발송하는 로직을 작성해 보도록 하겠다.

     

    @Service
    @RequiredArgsConstructor
    public class MailService {
        private static final String FROM_ADDRESS = "USER_EMAIL_ADDRESS";
    
        private final JavaMailSender mailSender;
    
        public void sendTextMail(MailDto mailDto) {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setTo(mailDto.getAddress());
            message.setFrom(FROM_ADDRESS);
            message.setSubject(mailDto.getTitle());
            message.setText(mailDto.getContent());
    
            mailSender.send(message);
        }
    }

    1. FROM_ADDRESS

     - 보내는 사람의 이메일 주소를 상수로 정의한 것이다.

     - 해당 값은 application.yml에서 @Value 애너테이션을 사용하여 가져와도 되고, 비즈니스에 따라 값을 유동적으로 변경할 수 있다.

     

    2. JavaMailSender

     - JavaMailSender는 MailSender 인터페이스를 상속받은 인터페이스이며, MIME을 지원한다.

     - 서버를 실행하면 JavaMailSender 인터페이스의 구현체인 JavaMailSenderImpl 빈이 DI 된다.

     

    3. SimpleMailMessage

     - 이메일 메시지 정보를 작성하는 객체이다.

     

        3-1. setTo()

         - 받는 사람 이메일 주소를 설정하는 메서드이다.

     

        3-2. setFrom()

         - 보내는 사람의 이메일 주소 설정하는 메서드이다.

         - 해당 메서드를 호출하지 않으면, application.yml 파일에 작성한 username으로 설정된다.

     

        3-3. setSubject()

         - 이메일 제목을 설정하는 메서드이다.

     

        3-4. setText()

         - 이메일 메시지 내용을 설정하는 메서드이다.

     

    4. mailSender.send()

     - 실제 메일이 발송되는 메서드이다.

     

    메일 발송 테스트

    http://localhost:8080/mail url에 접속한 후 위와 같이 메일 내용을 작성하였다.

     

     

    실제 이메일을 확인해 보면 입력한 내용과 동일한 이메일을 전송받은 것을 확인해 볼 수 있다.

     

    메일 발송 로직의 구현 - MimeMessageHelper

    이번에는 Spring에서 제공하는 MimeMessageHelper를 이용하여 MIME(이미지, 첨부파일 등)을 포함한 메일을 발송하는 로직을 작성해 보도록 하겠다.

     

    public class MailHandler {
        private JavaMailSender mailSender;
        private MimeMessage mimeMessage;
        private MimeMessageHelper messageHelper;
    
        public MailHandler(JavaMailSender mailSender) throws MessagingException {
            this.mailSender = mailSender;
            this.mimeMessage = mailSender.createMimeMessage();
            this.messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
        }
    
        /** 보내는 사람의 이메일 주소 설정 */
        public void setFrom(String fromAddress) throws MessagingException {
            messageHelper.setFrom(fromAddress);
        }
    
        /** 받는 사람의 이메일 주소 설정 */
        public void setTo(String toAddress) throws MessagingException {
            messageHelper.setTo(toAddress);
        }
    
        /** 이메일 제목 설정 */
        public void setSubject(String subject) throws MessagingException {
            messageHelper.setSubject(subject);
        }
    
        /** 이메일 내용 설정 */
        public void setText(String text, boolean useHtml) throws MessagingException {
            messageHelper.setText(text, useHtml);
        }
    
        /** 첨부 파일 설정 */
        public void setAttach(String fileName, String attachPath) throws MessagingException, IOException {
            File file = new ClassPathResource(attachPath).getFile();
            FileSystemResource systemResource = new FileSystemResource(file);
            messageHelper.addAttachment(fileName, systemResource);
        }
    
        /** 삽입 이미지 설정 */
        public void setInline(String contentId, String inlinePath) throws MessagingException, IOException {
            File file = new ClassPathResource(inlinePath).getFile();
            FileSystemResource systemResource = new FileSystemResource(file);
            messageHelper.addInline(contentId, systemResource);
        }
    
        /** 이메일 발송 */
        public void send() {
            try {
                mailSender.send(mimeMessage);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    MIME 메시지를 별도로 처리하기 위한 MailHandler 클래스를 생성한다. 

     

    1. MimeMessageHelper

     - 스프링에서 제공하는 Helper 객체이며, HTML 레이아웃, 이미지 삽입, 첨부파일 등 MIME 메시지를 생성할 수 있다.

     - 앞서 살펴본 SImpleMailMessage의 메서드를 모두 지원하고 있으며, 추가된 메서드들은 아래와 같다.

     

        1-1. messageHelper.setText()

         - 메일 내용을 설정하기 위한 메서드이다.

         - 두 번째 파라미터에 HTML의 사용여부를 전달한다.

     

        1-2. messageHelper.addAttachment()

         - 메일의 첨부 파일을 설정하기 위한 메서드이다.

         - 첫 번째 파라미터에 메일에 노출된 파일 이름을 작성한다.

         - 두 번째 파라미터에 파일의 경로를 작성한다.

     

        1-3. messageHelper.addInline()

         - 메일의 내용과 함께 삽입될 이미지를 설정하기 위한 메서드이다.

         - 첫 번째 파라미터에 삽입될 이미지의 id 속성명을 작성한다.

         - 두 번째 파라미터에 파일의 경로를 작성한다.

     

    @Service
    @RequiredArgsConstructor
    public class MailService {
        private static final String FROM_ADDRESS = "qlsdud960604@gmail.com";
    
        private final JavaMailSender mailSender;
    
        public void sendMimeMail(MailDto mailDto) {
            try {
                MailHandler mailHandler = new MailHandler(mailSender);
                // 받는 사람
                mailHandler.setTo(mailDto.getAddress());
                // 보내는 사람
                mailHandler.setFrom(FROM_ADDRESS);
                // 제목
                mailHandler.setSubject(mailDto.getTitle());
                // HTML layout
                String htmlContent = "<p>" + mailDto.getContent() +"<p> <img src='cid:test_image'>";
                mailHandler.setText(htmlContent, true);
                // 첨부 파일
                mailHandler.setAttach("test.txt", "static/test.txt");
                // 이미지 삽입
                mailHandler.setInline("test_image", "static/test_image.jpg");
                mailHandler.send();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    MailService 클래스에 MIME 메시지를 처리하기 위한 별도의 메서드를 작성한다. 이메일 이미지 작성 부분과 발송 부분 모두 MailHandler에서 처리하고 있고, 첨부파일과 이미지 파일은 모두 static 경로 아래에 존재하고 있어야 한다.

     

    메일 발송 테스트

    http://localhost:8080/mail url에 접속한 후 위와 같이 메일 내용을 작성하였다.

     

     

    실제 메일 내용을 확인해 보면, 메일 내용에 이미지가 삽입되고, 첨부파일이 추가된 것을 확인할 수 있다.


    출처

    https://victorydntmd.tistory.com/342

     

    728x90

    댓글

Designed by Tistory.