본문 바로가기
오류-해결

[Java] JavaMailSender "com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first." 오류 원인 및 해결법

by hunbal 2023. 8. 31.
SMALL

스프링부트에서 JavaMailSender로 이메일 발송 기능을 구현 중 여러가지 오류가 발생하여 고치는데 꽤 애를 먹었다..

 

첫번째 오류는 아래와 같은 메시지를 포함하고 있었다.

 

Failed message 1: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first.
y4-20020aa78544000000b00679a4b56e41sm293970pfn.43 - gsmtp ]
with root cause org.springframework.mail.MailSendException: 
Failed messages: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. 
y4-20020aa78544000000b00679a4b56e41sm293970pfn.43 - gsmtp ....

 

원인

  • com.sun.mail.smtp.SMTPSendFailedException: JavaMail API의 일부분으로 SMTP 전송 프로세스 중에 문제 발생.
  • 530 5.7.0 Must issue a STARTTLS command first: 이메일 전송 전 보안 연결(TLS)를 성립해야함

그러니까 메일을 전송할 때 SMTP 서버 포트를 이용하게 되는데 전송 전에 TLS라는 보안 설정이 요구되는 것 이었다.

 

@Configuration
public class EmailConfig {

    @Value("${spring.mail.host}")
    private String host;    // 메일의 도메인,나는 gmail을 사용하였다. ex)smtp.gmail.com

    @Value("${spring.mail.port}")
    private int port;  //smtp 포트 번호. ex)587

    @Value("${spring.mail.username}")
    private String username; //관리자 gmail 계정

    @Value("${spring.mail.password}")
    private String password; //비밀번호 (주의! 계정 비밀번호가 아니라 2차 인증 앱 비밀번호를 설정해야한다.)
    
    @Bean
    public JavaMailSender javaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost(host);
        mailSender.setPort(port);
        mailSender.setUsername(username);
        mailSender.setPassword(password);

        return mailSender;
    }
}

내 프로젝트에선 위처럼 EmailConfig.java 클래스를 구성해서 JavaMailSender를 이용하여 기능을 구현했는데,  

JavaMailSender() 메소드 내의 'STARTTLS''SMTP 인증'을 활성화하는 코드를 작성해주어야 메일을 발송할 수 있다.

나는 그 부분이 누락되어있어 오류가 발생한 것이다. 

 


 

해결

 

@Configuration
public class EmailConfig {

    @Value("${spring.mail.host}")
    private String host;

    @Value("${spring.mail.port}")
    private int port;

    @Value("${spring.mail.username}")
    private String username;

    @Value("${spring.mail.password}")
    private String password;

    @Bean
    public JavaMailSender javaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost(host);
        mailSender.setPort(port);
        mailSender.setUsername(username);
        mailSender.setPassword(password);

        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.smtp.starttls.enable", "true"); // STARTTLS 활성화
        props.put("mail.smtp.auth", "true"); // SMTP 인증 활성화

        return mailSender;
    }
}

메일 설정 변수를 치환한 mailSender를 반환하기 전에

Properties props = mailSender.getJavaMailProperties();
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
  1. mail.smtp.starttls.enable 속성을 "true"로 설정하여 JavaMailSender가 통신에 TLS를 사용하도록 지시한다. 
  2. mail.smtp.auth"true"로 설정하면 SMTP 서버가 인증을 요구하는 것인데 대부분의 SMTP 서버에서 요구하므로 활성화 해주어야 한다.

 

코드를 추가한 후에는 STARTTLS 오류가 해결되었다! 👍

 

 

댓글