[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. google smtp 설정 

  – 메일 발신자 고정 세팅

// application.properties

# Mail Settings
spring.mail.default-encoding=UTF-8

# Google SMTP
#spring.mail.host=smtp.gmail.com
#spring.mail.port=587
#spring.mail.username=cloudtechflow@gmail.com(구글 계정)
#spring.mail.password=ajdkelshfnvbqier(앱비밀번호)
#spring.mail.properties.mail.smtp.auth=true
#spring.mail.properties.mail.debug=true
#spring.mail.properties.mail.smtp.starttls.enable=true
#spring.mail.properties.mail.mime.charset=UTF-8
#spring.mail.properties.mail.transport.protocol=smtp


3. JavaMailSender 사용하여 메일 전송

@Service
@AllArgsConstructor
public class EmailService {
 
    private JavaMailSender emailSender;
 
    public void sendMail() {
        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)
    }
}


4. JavaMailSender 사용하여 메일 전송(템플릿 형식)

@Service
@AllArgsConstructor
public class EmailService {
 
    private JavaMailSender emailSender;
 
    public void sendMail() {
        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)
    }
}


최신 글