Java
Gmail SMTP 메일 발송
doopang
2023. 1. 18. 14:52
- Google 계정 관리 > 보안 > 2단계 인증 > 사용
- 앱 비밀번호 > 메일, 기기 선택 > 생성
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-mail'
// https://mvnrepository.com/artifact/com.sun.mail/javax.mail
implementation group: 'com.sun.mail', name: 'javax.mail', version: '1.6.2'
MailConfig
@Configuration
public class MailConfig {
private final String host = "smtp.gmail.com";
private final String user = "구글 이메일";
private final String pwd = "앱 비밀번호";
private final int port = 465;
@Bean
public JavaMailSender javaMailSender() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost(host);
javaMailSender.setPort(port);
javaMailSender.setUsername(user);
javaMailSender.setPassword(pwd);
Properties prop = new Properties();
prop.setProperty("mail.smtp.auth", "true");
prop.setProperty("mail.smtp.starttls.enable", "true");
prop.setProperty("mail.smtp.ssl.enable", "true");
prop.setProperty("mail.smtp.ssl.trust", "smtp.gmail.com");
javaMailSender.setJavaMailProperties(prop);
return javaMailSender;
}
}
MailVO
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class MailVO implements Serializable {
private String to = "";
private String subject = "";
private List<FileDTO> fileList = new ArrayList<>();
}
Service
public void sendBoard(BoardDTO boardDTO) {
MailVO mailVO = MailVO
.builder()
.to("받는 메일")
.subject("메일 제목")
.fileList(boardDTO.getFileList())
.build();
Map<String, Object> mailMap = new HashMap<>();
// 템플릿에 넣을 데이터(key, value)
mailMap.put("seq", boardDTO.getSeq());
mailMap.put("Name", boardDTO.getName());
// 템플릿 파일명 ex) board-mail.html
mailMap.put("html", "board-mail");
mailService.sendMail(mailVO, mailMap);
}
private final JavaMailSender javaMailSender;
private final TemplateEngine templateEngine;
public void sendMail(MailVO mailVO, Map<String, Object> mailMap) {
try {
MimeMessagePreparator preparator = mimeMessage -> {
String content = getMailHtmlText(mailMap);
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
messageHelper.setTo(mailVO.getTo());
messageHelper.setSubject(mailVO.getSubject());
messageHelper.setText(content, true);
messageHelper.setFrom("보낼 메일");
// 첨부파일
if (mailVO.getFileList() != null) {
for (FileDTO fileDTO : mailVO.getFileList()) {
String path = fileDTO.getPath() + "/" + fileDTO.getName();
FileDataSource fileDataSource = new FileDataSource(path);
String oriName = fileDTO.getOriName();
messageHelper.addAttachment(MimeUtility.encodeText(oriName, "UTF-8", "B"), fileDataSource);
}
}
};
javaMailSender.send(preparator);
} catch (Exception e) {
e.printStackTrace();
}
}
private String getMailHtmlText(Map<String, Object> mailMap) {
Context context = new Context();
mailMap.forEach(context::setVariable);
return templateEngine.process(mailMap.get("html").toString(), context);
}