해당 글에서는 Java 언어 기반 Spring Boot Mail을 사용 중에 발생하는 오류에 대해 해결 방법에 대해 알아봅니다.
1) 문제점
💡문제점
- Spring Boot Mail을 활용하여 메일 전송을 테스트 하는 중에 아래와 같은 오류가 발생하였습니다.
- Failed message 1: org.eclipse.angus.mail.smtp.SMTPSendFailedException: 554 5.7.1 The sender address is unauthorized - nsmtp
2) 해결방법
💡 해결방법
- Gmail의 SMTP 서버를 활용할때는 발생하지 않던 오류였으나, Naver를 사용하는 경우 발생하는 문제였습니다. - 관련 글을 찾아보니 Gmail에서는 보내는 사람(from)을 지정하지 않아도 되지만, Naver에서는 반드시 보내는 사람(from)을 지정해야 한다는 문제였습니다.
💡기존의 이메일 전송을 위한 비즈니스 로직 부분입니다.
- 아래의 경우에도 SimpleMailMessage의 값을 구성하는데 .setFrom() 값을 구성하지 않고 있습니다.
@Service
public class MailSendServiceImpl implements MailSendService {
private final JavaMailSender mailSender;
private final TemplateEngine templateEngine;
public MailSendServiceImpl(JavaMailSender mailSender, TemplateEngine templateEngine) {
this.mailSender = mailSender;
this.templateEngine = templateEngine;
}
/**
* 텍스트 기반 메일 전송
*
* @param mailTxtSendDto
*/
@Override
public void sendTxtEmail(MailTxtSendDto mailTxtSendDto) {
SimpleMailMessage smm = new SimpleMailMessage();
smm.setTo(mailTxtSendDto.getEmailAddr()); // 받는 사람 이메일
smm.setSubject(mailTxtSendDto.getSubject()); // 이메일 제목
smm.setText(mailTxtSendDto.getContent()); // 이메일 내용
try {
mailSender.send(smm); // 메일 보내기
System.out.println("이메일 전송 성공!");
} catch (MailException e) {
System.out.println("[-] 이메일 전송중에 오류가 발생하였습니다 " + e.getMessage());
throw e;
}
}
}
💡 아래와 같이 환경 파일 내에서 불러와서 호출하도록 구성하였습니다.
- EMAIL_SENDER를 환경 파일 내에서 호출하고 smm.setFrom(EMAIL_SENDER) 를 통해 속성을 추가하였습니다.
@Service
public class MailSendServiceImpl implements MailSendService {
private final JavaMailSender mailSender;
private final TemplateEngine templateEngine;
public MailSendServiceImpl(JavaMailSender mailSender, TemplateEngine templateEngine) {
this.mailSender = mailSender;
this.templateEngine = templateEngine;
}
@Value("${spring.mail.username}")
private String EMAIL_SENDER;
/**
* 텍스트 기반 메일 전송
*
* @param mailTxtSendDto
*/
@Override
public void sendTxtEmail(MailTxtSendDto mailTxtSendDto) {
SimpleMailMessage smm = new SimpleMailMessage();
smm.setTo(mailTxtSendDto.getEmailAddr()); // 받는 사람 이메일
smm.setFrom(EMAIL_SENDER); // [해당 부분 추가!!!] 보내는 사람 추가
smm.setSubject(mailTxtSendDto.getSubject()); // 이메일 제목
smm.setText(mailTxtSendDto.getContent()); // 이메일 내용
try {
mailSender.send(smm); // 메일 보내기
System.out.println("이메일 전송 성공!");
} catch (MailException e) {
System.out.println("[-] 이메일 전송중에 오류가 발생하였습니다 " + e.getMessage());
throw e;
}
}
}