Java

Gmail SMTP 메일 발송

doopang 2023. 1. 18. 14:52
  1. Google 계정 관리 > 보안 > 2단계 인증 > 사용
  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);
}