Spring

[Spring] 오류 발생 시 SMTP를 이용한 메일 발송

yyyyMMdd 2025. 6. 30. 14:25
728x90
  • API를 송수신 할 때 상대측 서버 문제로 데이터 처리가 되지 않은 경우가 간혹 발생합니다.

  • 이 때 상대 측 또는 우리 측에서 확인하지 않으면 에러가 나도 제대로 인지하기 어렵습니다.

  • 이를 위해 에러가 발생했을 경우 메일을 보낼 수 있도록 자바에서 SMTP를 이용해 발송하는 방법을 알아보았습니다.

#. 설정 방법

 

1. 메일 발송을 위해 라이브러리를 추가합니다.

implementation 'org.springframework.boot:spring-boot-starter-mail'

2. api 통신을 위한 클래스에 mailSender를 추가 및 메서드를 생성해 줍니다.

 

  • 또한 api는 계속해서 실행되기 때문에 최초 1회만 발송될 수 있도록 hasError 변수를 만들어줍니다.

  • 발신자 주소의 경우 명시적으로 넣어주는게 좋습니다.
public class api {

	@Autowired
	private JavaMailSender mailSender;

	private static final AtomicBoolean hasError = new AtomicBoolean(false);

	public Map<String, Object> callApi() {
		try {
			// 처리 로직
			// 정상 처리 시 false 유지
			hasError.set(false); 
		} catch(Exception e) {
			// 에러시 compareAndSet을 이용해 false이면 true 변환하여 sendErrorMail 메서드 실행
			if(hasError.compareAndSet(false, true)) {
				sendErrorMail(e);
			}
			e.printStackTrace();
		}
	}

	public void sendErrorMail(Exception e) {
	    try {
	        MimeMessage message = mailSender.createMimeMessage();
	        MimeMessageHelper helper = new MimeMessageHelper(message, false, "UTF-8");

	        helper.setFrom("발신자 주소");
	        helper.setTo(new String[] {"수신자 주소1", "수신자 주소2"});
	        helper.setSubject("API 오류 발생 => ");
	        helper.setText("API 호출 중 오류 발생:\n\n" +
	                       "오류 메시지: " + e.getMessage(), false);

	        mailSender.send(message);
	    } catch (Exception mailEx) {
	        log.error("##### 오류 메일 전송 실패", mailEx);
	    }
	}
}

3. SMTP 서버 추가

 

  • application.yml에 해당 설정을 추가해주어야 합니다.
#SMTP mail
spring:
  mail:
    host: stmp 도메인 주소
    port: 포트번호 # 25의 경우 무인증포트로 username과 password가 필요하지 않음(서버에서 오픈된 상태에서만 가능)
	#username:
	#password:
    properties:
      mail:
        smtp:
          auth: true # 무인증 시 false
          starttls:
            enable: true # 무인증 시 false

  • 위와 같이 설정한 뒤 에러가 발생하게 되면 최초 1회에 한하여 아래와 같이 메일이 발송됩니다.

  • 보통 이기종 간 API를 통신하는 경우 서로 오류가 없어야하나 간혹 의도치 못한 경우를 대비하여 기능을 추가하였습니다.

 

===========================================================
틀린 내용이 있거나 이견 있으시면 언제든 가감 없이 말씀 부탁드립니다!
===========================================================

728x90