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