
신기한 기능 발견해서 바로 쓰기😎
자바에서 이메일을 보낼 수 있게 해주는 인터페이스가 있다!!
바로 JavaMailSender
먼저 아래와 같이 JavaMailSender객체를 선언해준다.
private final JavaMailSender emailSender;
다음으로는 MimeMessage와 이를 쉽게 다룰 수 있게해주는 MimeMessageHelper를 선언해준다.
MimeMessage message = emailSender.createMimeMessage;
MimeMessageHelper helper = new MimeMessageHelper(message, true);
참고로 MimeMessageHelper뒤에 있는 true는 전송하는 데이터 중에 Multipart 파일이 존재하는지의 여부를 적는 것이다.
현재는 true로 선언해놓았으니 Multipart파일(첨부파일)을 추가해도 된다!
이제 담을 데이터를 아래와 같이 추가하면 된다.
Map<String, String> data = new HashMap<>();
data.put("${name}", dto.getName());
data.put("${age}", dto.getAge());
data.put("${emaiil}", dto.getEmail());
이제 helper가 등장해서 이메일의 구조를 잡아줄 것이다.
아래는 이메일의 제목과 내용을 설정하는 과정이다.
내용은 HTML 템플릿에서 로드되며, 템플릿 내의 플레이스 홀더는 'data'맵의 값으로 대체된다.
helper.setSubject("Apple B2B Store - 기업용 구매 신청드립니다");
helper.setText(emailTemplateService.loadHtmlTemplate("email-template.html", data), true);
helper.setTo("missrbfl@naver.com"); // 이메일을 받을 사람의 주소
참고로 emailTemplateService내의 loadHtmlTemplate 메서드는 아래와 같이 선언되었다.
@Service
@RequiredArgsConstructor
public class EmailTemplateService {
private final ResourceLoader resourceLoader;
public String loadHtmlTemplate(String templateName, Map<String, String> bindData) throws IOException {
Resource resource = resourceLoader.getResource("classpath:" + templateName);
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(
new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
String line = null;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
String result = builder.toString();
for (Entry<String, String> entry : bindData.entrySet()) {
result = result.replace(entry.getKey(), entry.getValue());
}
return result;
}
}
길어서 복잡해보이지만, 사실 방금 입력한 데이터들을 바인딩해주는 부분이다.
이제 Multipart 파일을 넣어줄 것이다.
현재 우리가 받은 dto의 Multipart파일은 List의 형태로 들어오기 때문에 아래와 같이 반복문을 사용해서 하나씩 넣어준다.
for (MultipartFile file : dto.getFiles()) {
helper.addAttachment(Objects.requireNonNull(file.getOriginalFilename()), file);
}
이제 마지막으로 이메일(MimeMessage객체)을 전송해주면 된다!!
emailSender.send(message);
신기하다,,,상품 문의 기능 이런거에 쓸 일이 무조건 생길 듯!