[SpringBoot] 메일 발송(JavaMailSender)

남영민·2021년 7월 30일
0

JavaMailSender를 활용하여 메일 발송하는 법에 대해 알아보겠습니다.

우선, 의존성 추가를 해줍니다.

dependencies {
    // javamail
    implementation 'org.springframework.boot:spring-boot-starter-mail'
}

다음으로, 구글 SMTP를 활용하여 application.yml에 기본 설정을 해줍니다.

application:
  mail:
    host: smtp.gmail.com
    username: user@gmail.com
    password: ps
    port: 465
    socketFactory-class: javax.net.ssl.SSLSocketFactory
    supplier: gmail.com
    from-mail: user@gmail.com

위에 설정한 mail properties를 받을 도메인을 생성합니다.

@Data
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties("application.mail")
public class MailProperties {

    // SMTP 서버
    private String host;

    // 계정
    private String username;

    // 비밀번호
    private String password;

    // 포트번호
    private int port;

    // 메일연결자
    private String supplier;

    // 발신자 메일
    private String fromMail;

    // tls 설정
    private String socketFactoryClass;
}

MailConfig 클래스로 SMTP 설정합니다.

@Configuration
@RequiredArgsConstructor
public class MailConfig {
    Properties pt = new Properties();

    private final MailProperties mailProperties;

    @Bean
    public JavaMailSender javaMailService() {
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
        javaMailSender.setHost(this.mailProperties.getHost());
        javaMailSender.setUsername(this.mailProperties.getUsername());
        javaMailSender.setPassword(this.mailProperties.getPassword());
        javaMailSender.setPort(this.mailProperties.getPort());

        pt.put("mail.smtp.socketFactory.port", this.mailProperties.getPort());
        pt.put("mail.smtp.auth", true);
        pt.put("mail.smtp.starttls.enable", true);
        pt.put("mail.smtp.starttls.required", true);
        pt.put("mail.smtp.socketFactory.fallback", false);
        pt.put("mail.smtp.socketFactory.class", this.mailProperties.getSocketFactoryClass());

        javaMailSender.setJavaMailProperties(pt);
        javaMailSender.setDefaultEncoding("UTF-8");

        return javaMailSender;
    }
}

MailUtil 클래스로 원하는 방식으로 메일을 발송 할 수 있는 함수를 만듭니다.

@Component
public class MailUtils {
    private static MailProperties mailProperties;

    private static JavaMailSender mailSender;
    
    @Autowired
    private MailUtils(MailProperties mailProperties, JavaMailSender mailSender) {
        this.mailProperties = mailProperties;
        this.mailSender = mailSender;
    }

    /**
     * 메일을 발송합니다.
     *
     * @param to 수신자(여러명일 경우 ',' 구분
     * @param sj 제목
     * @param cn 내용
     * @return
     */
    public static boolean send(String to, String sj, String cn) {
        if (StringUtils.isEmpty(to)) return false; // 수신자가 없을 경우 종료

        try {
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(message, false, "UTF-8");

            messageHelper.setSubject(sj);
            messageHelper.setText(cn, true);
            messageHelper.setFrom(mailProperties.getFromMail());

            String[] toArr = to.split(",");

            // 메일 형식을 확인하여 아닐경우 메일 형식으로 변경
            for (int i = 0; i < toArr.length; i++) {
                toArr[i] = chgMail(toArr[i]);
            }

           messageHelper.setTo(toArr);

           mailSender.send(message); // 메일발송

            return true;
        }catch(MailException es){
            es.printStackTrace();
            return false;
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
    }
 }

추가적으로,
이번에 SpringBoot로 메일을 발송하는 로직을 작성하며 의존성을 주입하는 어노테이션의 작동법에 대해 조금 더 이해하게 되었습니다. MailConfig 클래스는 @Configuration 어노테이션으로 인해 SpringBoot가 작동할 때 자동으로 실행되고, MailUtils 클래스에서는 @autowired를 활용하여 MailConfig 클래스에서 Bean으로 등록된 JavaMailSender 객체를 파라미터로 받아 @autowired가 달린 생성자를 활용하여 객체를 생성합니다.

[참고]
https://victorydntmd.tistory.com/342

profile
성장하는 개발자

0개의 댓글