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);
}
...
}
일기 저장이 완료되면 메일 발송 작업을 진행하도록 했어.
수신된 이메일을 보여줄께.