코딩과 결혼합니다

[Game_Crew] 트러블슈팅 : 이메일 인증 완성 본문

코딩과 매일매일♥/Game_Crew

[Game_Crew] 트러블슈팅 : 이메일 인증 완성

코딩러버 2023. 10. 27. 22:32
728x90

문제  jakarta.mail.MessagingException: Could not connect to SMTP host: smtp.naver.com, port: 587;

메일 서버 연결에 실패. SMTP 호스트 smtp.naver.com의 587에 연결할 수 없다는 내용이다. javax.net.ssl.SSLException: Unsupported or unrecognized SSL message라는 예외도 함께 발생 하였다.

메일 서버와의 연결이 잘못되었거나, 네트워크 연결 문제, 또는 SSL 인증서 관련 문제 등이 원인일 수 있다.

원인 ssl 인증 서버 주소 잘못 기입

@Configuration
@PropertySource("classpath:application.properties")
public class MailConfig {

    @Value("${spring.mail.username}")
    private String id;
    @Value("${spring.mail.password}")
    private String password;
    @Value("${spring.mail.host}")
    private String host;
    @Value("${spring.mail.port}")
    private int port;

    @Bean
    public JavaMailSender javaMailService() {
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        javaMailSender.setHost(host); // smtp 서버 주소
        javaMailSender.setUsername(id); // 설정(발신) 메일 아이디
        javaMailSender.setPassword(password); // 설정(발신) 메일 패스워드
        javaMailSender.setPort(port); //smtp port
        javaMailSender.setJavaMailProperties(getMailProperties()); // 메일 인증서버 정보 가져온다.
        javaMailSender.setDefaultEncoding("UTF-8");
        return javaMailSender;
    }

    private Properties getMailProperties() {
        Properties properties = new Properties();
        properties.setProperty("mail.transport.protocol", "smtp"); // 프로토콜 설정
        properties.setProperty("mail.smtp.auth", "true"); // smtp 인증
        properties.setProperty("mail.smtp.starttls.enable", "true"); // smtp starttls 사용
        properties.setProperty("mail.debug", "true"); // 디버그 사용
        properties.setProperty("mail.smtp.ssl.trust","smtp.mailplug.co.kr"); // ssl 인증 서버 주소
        properties.setProperty("mail.smtp.ssl.enable","true"); // ssl 사용
        return properties;
    }
}

MailConfig 클래스로 메일 전송을 담당하고 있다.  

javaMailService()  메서드는 JavaMailSenderImpl 객체를 생성하고, SMTP 서버 주소, 사용자 아이디, 패스워드, 포트 등을 설정하여 JavaMailSenderImpl 객체를 반환한다. 

 

getMailProperties() 메서드는 메일 전송에 필요한 프로퍼티를 설정한다.

이 곳에서 SMTP 프로토콜, SMTP 인증, SMTP starttls 사용 여부, 디버그 사용 여부, SSL 인증 서버 주소, SSL 사용 여부 등을 설정하고 있는 것이다.

 

나는 이 부분을 제대로 보지 않고 프로퍼티즈에 아래와 같이 설정해 두었으므로 왜 문제가 일어나는지 이해를 하지 못했다.

aplication.propertise

spring.mail.host=smtp.naver.com
spring.mail.port=465
spring.mail.username=
spring.mail.password=
spring.mail.properties.debug=true
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.ssl.trust=smtp.naver.com

 

properties.setProperty("mail.smtp.ssl.trust","smtp.mailplug.co.kr"); // ssl 인증 서버 주소
나는 지금 인증 서버 주소를 naver를 사용하고 있는데 여기는 mailplug.co.kr 로 설정되어 있다. 그래서 네이버 메일과 연동되지 않았던 것이다.

 

즉, 프로퍼티즈에 굳이 저 내용을 적어봤다 아무 쓸모가 없었던 것이고 여기 설정을 제대로 해줬어야 했던 것이다.


해결  ssl 인증 서버 주소 변경

properties.setProperty("mail.smtp.ssl.trust","smtp.naver.com");


잘 오고 있다. 그런데 궁금한 점이 있다. 저렇게 URL에 아이디가 노출되는게 좋지 않을 것 같아서 RequestBody로 보내려 하였으나 JSON 파싱 오류가 발생하여 이메일 주소에 제어 문자나 공백이 추가되는 문제가 발생하였다. 왜 이런 문제가 생기는지 알아봐야겠다.