diff --git a/src/main/java/com/haru/api/global/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/haru/api/global/apiPayload/code/status/ErrorStatus.java index 9e239dcf..f512f785 100644 --- a/src/main/java/com/haru/api/global/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/haru/api/global/apiPayload/code/status/ErrorStatus.java @@ -69,7 +69,8 @@ public enum ErrorStatus implements BaseErrorCode { INVALID_CHOICE_FOR_QUESTION(HttpStatus.BAD_REQUEST, "MOODTRACKER4011", "분위기 트래커 질문에 유효하지 않은 선택지입니다."), // 메일 관련 에러 - MAIL_SEND_FAIL(HttpStatus.INTERNAL_SERVER_ERROR, "MAIL500", "이메일 전송에 실패했습니다."), + MAIL_SEND_FAIL(HttpStatus.INTERNAL_SERVER_ERROR, "MAIL500", "이메일 전송에 실패했습니다. (존재하지 않는 이메일일 수 있습니다)"), + MAIL_INVALID_FORMAT(HttpStatus.BAD_REQUEST, "MAIL400", "이메일 형식이 잘못되었습니다."), // SNS 이벤트 관련 에러 SNS_EVENT_NOT_FOUND(HttpStatus.BAD_REQUEST, "SNSEVENT4001", "SNS 이벤트가 존재하지 않습니다."), diff --git a/src/main/java/com/haru/api/infra/mail/SmtpEmailSender.java b/src/main/java/com/haru/api/infra/mail/SmtpEmailSender.java index 4ebea824..7e391d16 100644 --- a/src/main/java/com/haru/api/infra/mail/SmtpEmailSender.java +++ b/src/main/java/com/haru/api/infra/mail/SmtpEmailSender.java @@ -3,6 +3,8 @@ import com.haru.api.global.apiPayload.code.status.ErrorStatus; import com.haru.api.infra.mail.handler.MailHandler; import jakarta.mail.MessagingException; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; import jakarta.mail.internet.MimeMessage; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -27,6 +29,13 @@ public void send( String title, String content ) { + // 1. 이메일 형식 검증 + if (!isValidEmail(to)) { + log.warn("잘못된 이메일 형식 - {}", to); + throw new MailHandler(ErrorStatus.MAIL_INVALID_FORMAT); + } + + // 2. 메일 전송 시도 try { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, false, "UTF-8"); @@ -44,5 +53,16 @@ public void send( throw new MailHandler(ErrorStatus.MAIL_SEND_FAIL); } } + + // RFC 형식 검증 + private boolean isValidEmail(String email) { + try { + InternetAddress internetAddress = new InternetAddress(email); + internetAddress.validate(); // 형식이 틀리면 AddressException 발생 + return true; + } catch (AddressException e) { + return false; + } + } }