~☆~ 우하하!!~ 개발블로그

[연재] SpringBoot diary - 메일 발송 기능 본문

SpringBoot

[연재] SpringBoot diary - 메일 발송 기능

iwoohaha 2024. 11. 15. 10:24
반응형

diary 프로그램에 메일 발송 기능을 추가해보려고 해.

Spring Boot 에서 메일발송 기능을 구현하려면 아래 dependency 를 추가해 주어야 해.

implementation "org.springframework.boot:spring-boot-starter-mail"

 

메일발송이 필요할 때 사용할 설정을 Bean 으로 만들어 사용하도록 할 생각이야. @Configuration 애노테이션을 붙여서 SendMailConfig 클래스를 아래와 같이 작성했어.

SendMailConfig.java
package com.woohahaapps.study.diary.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import java.util.Properties;

@Configuration
public class SendMailConfig {

    @Value("${spring.mail.host}")
    public String host;

    @Value("${spring.mail.port}")
    public int port;

    @Value("${spring.mail.username}")
    public String sendEmailAddress;

    @Value("${spring.mail.password}")
    public String sendEmailPassword;

    @Value("${spring.mail.properties.mail.smtp.auth}")
    public boolean auth;

    @Value("${spring.mail.properties.mail.smtp.starttls.enable}")
    public boolean starttlsEnable;

    @Bean
    public JavaMailSender getJavaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost(host);
        mailSender.setPort(port);
        mailSender.setUsername(sendEmailAddress);
        mailSender.setPassword(sendEmailPassword);

        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", auth);
        props.put("mail.smtp.starttls.enable", starttlsEnable);
        props.put("mail.debug", "true");

        return mailSender;
    }
}

 

위 클래스를 작성하다가 실수한게 있었는데, @Value 애노테이션을 사용하기 위해서 import 한 패키지명이야. 아무생각없이 앞에 나온 lombok 을 선택했었는데…

org.springframework.beans.factory.annotation 을 선택해야 했더라고.

보다시피 host, port, sendEmailAddress, sendEmailPassword, auth, starttlsEnable 멤버의 값은 환경설정 파일에 정의되어 있는 값을 읽어들이고 있어.

환경설정 파일에서는 아래와 같이 정의해주고 있지.

#SendMail
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username={발송이메일 주소}
spring.mail.password={구글 2단계 인증 앱 비밀번호}
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

 

Gmail 을 이용해서 메일을 발송하기 위해서 설정하는 방법은 Gmail SMTP 로 메일 발송 설정하기 포스트를 참고하면 되겠어.

이제 일기가 작성되면 일기 내용을 작성자 이메일 주소로 쏴주는 코드를 작성해볼께.

DiaryService.java
@Service
public class DiaryService {
    ...
    public void CreateDiary(String date, String content) throws DiaryException {
        System.out.println("Service:date=" + date + ",content=" + content);
        String email = SecurityContextHolder.getContext().getAuthentication().getName();
        if (email.isBlank() || date.isBlank() || content.isBlank()) {
            throw new DiaryException("일기정보가 부족합니다:" + (email.isBlank() ? " email" : "") + (date.isBlank() ? " date" : "") + (content.isBlank() ? " content" : ""));
        }
        diaryMapper.CreateDiary(date, content, email);

        // Mail 발송
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(email);
        message.setSubject("[diary] " + date);
        message.setText(content);
        mailSender.send(message);
    }
    ...
}

 

일기 저장이 완료되면 메일 발송 작업을 진행하도록 했어.

수신된 이메일을 보여줄께.

반응형