
스프링 부트로 메일을 보내기 위해 테스트 하던 도중, 프로퍼티에 입력한 메일주소와 메시지에 입력한 메일 주소가 다를때 오류를 내뱉는걸 확인했다.
org.eclipse.angus.mail.smtp.SMTPSendFailedException: 554 5.7.1 The sender address is unauthorized 0KLFiATWS4eBaP4mstzs-w - nsmtp
어디서 검증을 진행할까?
다음은 JavaMailSender 관련 빈이 없을때 기본 빈을 추가해주는 클래스이다.
class MailSenderPropertiesConfiguration {
MailSenderPropertiesConfiguration() {
}
@Bean
@ConditionalOnMissingBean({JavaMailSender.class})
JavaMailSenderImpl mailSender(MailProperties properties) {
JavaMailSenderImpl sender = new JavaMailSenderImpl();
this.applyProperties(properties, sender);
return sender;
}
private void applyProperties(MailProperties properties, JavaMailSenderImpl sender) {
sender.setHost(properties.getHost());
if (properties.getPort() != null) {
sender.setPort(properties.getPort());
}
sender.setUsername(properties.getUsername());
sender.setPassword(properties.getPassword());
sender.setProtocol(properties.getProtocol());
....
@ConditionalOnMissingBean()는 일치하는 빈이 없을때 생성되는 기본으로 생성되는 빈이다.
JavaMailSenderImpl의 생성자 매개변수에 메일 관련 프로퍼티가 들어있다. 해당 프로퍼티는 빈을 생성할때 프로퍼티 파일에서 읽어오는것으로 보인다.
AbstractAutowireCapableBeanFactory -> ConstructorResolver.class의 instantiateUsingFactoryMethod() 메서드에서 프로퍼티 값이 MailProperties클래스의 인스턴스로 추가되어 매개변수로 사용된다.
SMTPTransport.class에서 서버로 값을 보내는데 이때 메시지 객체 생성할때 추가한 from 값이 들어있다.
서버로 Mail FROM을 보낸 뒤 오류를 내려주는 형식인듯하다.

브레이크 포인트 라인을 보면 250을 기대했지만, 실제 리턴코드는 554이다.

리턴 메시지 자체가 "The sender address is unauthorize" 라고 왔다.
나는 코드상에서 검증할거라 생각하고 코드를 뒤져봤는데, 네이버 백엔드 서버에서 검증하는걸 보고 약간 김이 샜다.
값 검증은 백엔드에서 한다는거는 알겠는데, 이미 이미 사용자 인증을 했다면 메일 전송 message 객체에 From 값을 추가해줄 필요는 없는거 아닐까?
이거는 좀더 찾아봐야할거같다.