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");
- mail.smtp.starttls.enable 속성을 "true"로 설정하여 JavaMailSender가 통신에 TLS를 사용하도록 지시한다.
- mail.smtp.auth를 "true"로 설정하면 SMTP 서버가 인증을 요구하는 것인데 대부분의 SMTP 서버에서 요구하므로 활성화 해주어야 한다.
코드를 추가한 후에는 STARTTLS 오류가 해결되었다! 👍
댓글