[Spring Boot] Google SMTP Mail 전송하기(메일 발신자 동적 변경)

메일 발신자를 동적으로 변경, 구글 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)
    }
}


최신 글