메일 발신자를 동적으로 변경, 구글 SMTP 서버를 사용하여 메일을 전송할 수 있습니다. 파일 첨부 가능하며 템플릿 형식으로도 전송 가능합니다.
주요 기능
– 메일 발신자 동적 변경 가능
– 파일 첨부 가능(로컬 또는 AWS S3)
– 템플릿 형식 가능(Thymeleaf)
사전 작업
– Google SMTP 서버를 이용하기 위해서는 앱 비밀번호 필수
1. spring-boot-starter-mail 의존성 추가
// build.gradle
implementation 'org.springframework.boot:spring-boot-starter-mail'
2. MailSenderFactory inteface 생성
– JavaMailSender에 메일 발신자 계정 동적으로 변경하기 위해 필요
public interface MailSenderFactory {
JavaMailSender getSender(String email, String password);
}
3. MailSenderFactoryImpl 구현체 생성
– getSender 함수를 오버라이드하여 email, password 동적 세팅
@Component
public class MailSenderFactoryImpl implements MailSenderFactory {
@Value("smtp.gmail.com")
private String host;
@Value("587")
private int port;
@Value("true")
private String auth;
@Value("true")
private String debug;
@Value("true")
private String enable;
@Value("UTF-8")
private String charset;
@Value("smtp")
private String protocol;
@Override
public JavaMailSender getSender(final String email, final String password) {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(host);
mailSender.setUsername(email);
mailSender.setPassword(password);
mailSender.setPort(port);
Properties props = mailSender.getJavaMailProperties();
props.put("mail.smtp.auth",auth);
props.put("mail.debug",debug);
props.put("mail.smtp.starttls.enable",enable);
props.put("mail.mime.charset",charset);
props.put("mail.transport.protocol",protocol);
return mailSender;
}
}
4. JavaMailSender 사용하여 메일 전송
@Service
@AllArgsConstructor
public class EmailService {
private MailSenderFactory mailSenderFactory;
public void sendMail() {
JavaMailSender emailSender = mailSenderFactory.getSender(구글계정, 앱비밀번호);
MimeMessage message = emailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
//제목, 내용 설정
helper.setSubject("제목");
helper.setText("내용", false);
// 참조자 설정
helper.setCc("cloudtechflow@gmail.com");
// 발신자 설정(연동된 구글 계정으로 고정)
// helper.setFrom("cloudtechflow@gmail.com");
// 로컬 첨부 파일 설정
File file = new File("파일 경로");
FileItem fileItem = new DiskFileItem("mainFile", Files.probeContentType(file.toPath()), false, file.getName(), (int) file.length(), file.getParentFile());
InputStream input = new FileInputStream(file);
OutputStream os = fileItem.getOutputStream();
IOUtils.copy(input, os);
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
String fileName = StringUtils.cleanPath(multipartFile.getOriginalFilename());
helper.addAttachment(MimeUtility.encodeText(fileName, "UTF-8", "B"), new ByteArrayResource(IOUtils.toByteArray(multipartFile.getInputStream())));
// AWS S3 첨부 파일 설정
// File file = new File("loginbg.jpeg");
// FileUtils.copyURLToFile(new URL("https://s3.ap-northeast-2.amazonaws.com/cloudtechflow.com/image/image/image.jpeg"), file);
// FileItem fileItem = new DiskFileItem("mainFile", Files.probeContentType(file.toPath()), false, file.getName(), (int) file.length(), file.getParentFile());
// InputStream input = new FileInputStream(file);
// OutputStream os = fileItem.getOutputStream();
// IOUtils.copy(input, os);
// MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
// List<MultipartFile> multipartFileList = Arrays.asList(multipartFile);
//메일 전송(setTo 파라미터에 문자열 리스트를 넘기면 한번에 여러명에게 전송 가능)
helper.setTo("cloudtechflow@gmail.com");
emailSender.send(message)
}
}
5. JavaMailSender 사용하여 메일 전송(템플릿 형식)
@Service
@AllArgsConstructor
public class EmailService {
private MailSenderFactory mailSenderFactory;
public void sendMail() {
JavaMailSender emailSender = mailSenderFactory.getSender(구글계정, 앱비밀번호);
MimeMessage message = emailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
//템플릿에 전달할 데이터 설정
HashMap<String, String> emailValues = new HashMap<>();
emailValues.put("title", "제목");
emailValues.put("text", "내용");
Context context = new Context();
emailValues.forEach((key, value)->{
context.setVariable(key, value);
});
//메일 내용 설정 : 템플릿 프로세스
String html = templateEngine.process("mail/mail", context);
helper.setText(html, true);
//템플릿에 들어가는 이미지 cid로 삽입
helper.addInline("image1", new ClassPathResource("static/images/image.jpeg"));
// 참조자 설정
helper.setCc("cloudtechflow@gmail.com");
// 발신자 설정(연동된 구글 계정으로 고정)
// helper.setFrom("cloudtechflow@gmail.com");
// 첨부 파일 설정
File file = new File("파일 경로");
FileItem fileItem = new DiskFileItem("mainFile", Files.probeContentType(file.toPath()), false, file.getName(), (int) file.length(), file.getParentFile());
InputStream input = new FileInputStream(file);
OutputStream os = fileItem.getOutputStream();
IOUtils.copy(input, os);
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
String fileName = StringUtils.cleanPath(multipartFile.getOriginalFilename());
helper.addAttachment(MimeUtility.encodeText(fileName, "UTF-8", "B"), new ByteArrayResource(IOUtils.toByteArray(multipartFile.getInputStream())));
// AWS S3 첨부 파일 설정
// File file = new File("loginbg.jpeg");
// FileUtils.copyURLToFile(new URL("https://s3.ap-northeast-2.amazonaws.com/cloudtechflow.com/image/image/image.jpeg"), file);
// FileItem fileItem = new DiskFileItem("mainFile", Files.probeContentType(file.toPath()), false, file.getName(), (int) file.length(), file.getParentFile());
// InputStream input = new FileInputStream(file);
// OutputStream os = fileItem.getOutputStream();
// IOUtils.copy(input, os);
// MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
// List<MultipartFile> multipartFileList = Arrays.asList(multipartFile);
//메일 전송(setTo 파라미터에 문자열 리스트를 넘기면 한번에 여러명에게 전송 가능)
helper.setTo("cloudtechflow@gmail.com");
emailSender.send(message)
}
}