티스토리 뷰

Spring/Spring Boot

Spring Boot : Email 보내기

Korean Eagle 2020. 4. 26. 06:13
728x90

0. 순서

  0-1. spring-boot-starter-mail을 pom.xml에 추가

  0-2. 스프링이 제공하는 MailSender를 사용하는 서비스 작성하기 (예를 들면 EmailUtil)

  0-3. application.properties에 사용할 메일 서버 정보 설정

  0-4. 필요시 EmailUtil을 주입받아 사용 

 

1. 이 포스트는 Email 전송을 위한 기능을 가지는 컴포넌트를 작성하여 사용하는 방법을 설명한다.

 

2. email을 전송을 지원하는 스프링 모듈을 import한다.

 

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

 

3. 스프링의 mail starter는 MailSender interface와 MailSenderImpl을 제공한다.

  3-1. 실제로 사용하는 인터페이스와 클래스는 편의기능을 더 추가한 JavaMailSender, JavaMailSenderImpl이 된다.

  3-2. 어차피 @Autowired로 주입하기 때문에 구현 클래스에 대해서 알 필요가 없다.

 

4. MailSender와 MailSenderImpl이 DAL의 Data Access Object라고 비유할 수 있다.

  4-1. 이것을 이용하는 Service Layer도 만들어야 한다.

  4-2. 실제로 메일을 보낼 때 사용할 Service인 EmailUtil 인터페이스와 구현제를 정의한다.

 

public interface EmailUtil {
  void sendEmail(String toAddress, String subject, String body);
}


@Component
public class EmailUtilImpl implements EmailUtil {

  @Autowired
  private JavaMailSender sender;
  
  @Override
  public void sendEmail(String toAddress, String subject, String body) {
    
    MimeMessage message = sender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message);
    try {
      helper.setTo(toAddress);
      helper.setSubject(subject);
      helper.setText(body);
    } catch (MessagingException e) {
      e.printStackTrace();
    }
   
    sender.send(message);
    
  }

}

 

5. Email을 보내기 위한 서버 정보를 application.properties에 등록한다.

  5-1. 아래는 구글 메일을 사용한 설정이다.

  5-2. 구글메일 사용하려면 외부에서 접근을 허용하도록 변경해야 한다.

  5-3. https://myaccount.google.com/lesssecureapps여기에 가서 allow less secure apps: ON을 활성화 해야 한다.

 

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=username
spring.mail.password=password
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.auth=true

 

6. 이렇게 서비스로 작성하면 다른 서비스와 마찬가지로 필요할 때 언제든지 주입하여 사용할 수 있다.

 

@Controller
public class LocationController {
  
  @Autowired
  private EmailUtil emailUtil;
  
  ...
  
  
  @PostMapping("/saveLocation")
  public String saveLocation(@ModelAttribute Location location, Model model) {
    this.locationService.saveLocation(location);
  
    String msg = "Location saved with id:: " + location.getId();   
    model.addAttribute("message", msg);
    
    emailUtil.sendEmail("heops79@naver.com", "스프링을 이용한 메일 전송", "되는지 테스트 하는 거예요");
    
    return "createLocation";
  }
728x90
댓글