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가 달린 생성자를 활용하여 객체를 생성합니다.