Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 이벤트가 존재하지 않습니다."),
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/com/haru/api/infra/mail/SmtpEmailSender.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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");
Expand All @@ -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;
}
}
}