Spring Mail AuthenticationFailedException 해결하기

개인용 웹앱을 만드는데 메일 기능이 필요하여 spring-boot-starter-mail dependency를 추가하고 properties에 메일 관련 설정을 지정했는데도 자꾸 다음과 같은 AuthenticationFailedException이 log가 떴다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Exception in thread "main" org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8 https://support.google.com/mail/?p=BadCredentials o84sm6724751pfi.172 - gsmtp

at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:439)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:322)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:311)
at me.devson.email.EmailApplication.main(EmailApplication.java:27)
Caused by: javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8 https://support.google.com/mail/?p=BadCredentials o84sm6724751pfi.172 - gsmtp

at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:965)
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:876)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:780)
at javax.mail.Service.connect(Service.java:366)
at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:517)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:436)
... 3 more

username(email), password 모두 제대로 설정했는데 계속 이 Exception이 떠서 해당 내용을 검색해봤다.
이 Exception은 구글이 보안 관련하여 일부러 막아놓아서 발생한 것이다.
이에 대한 해결법은 많은 블로그들, 심지어 stackoverflow에서도 보안 수준이 낮은 앱의 액세스를 허용 설정 하라고 한다.

하지만 이 경우 동작은 되지만 아무래도 위험을 감수하고 이 문구가 상당히 불안하다.
보안 수준이 낮은 앱의 액세스를 허용하지 않고 다른 방법을 사용해서 위 문제를 해결해보자.

  1. 로그에 찍힌 링크인 https://support.google.com/mail/?p=BadCredentials 를 접속한다.

위와 같이 문제해결 방법이 나와있는데 2단계의 2번째에 앱 비밀번호 사용이 있다.
(2단계의 3번째엔 보안 수준이 낮은 앱을 허용이 있다.)
여기서 앱 비밀번호를 클릭한다.

앱 비밀번호 생성 방법이 위와 같이 나와있다.
여기서 1의 Google 계정을 클릭한다.

  1. 계정 화면에서 좌측 탭의 보안을 클릭한다.

2단계 인증을 클릭한다.

  1. 2단계 인증 설정을 한다.

2단계 인증 설정 관련해서는 굳이 더 설명을 하지 않아도 될거라 생각한다.
(핸드폰 등의 기기를 통해 인증을 받고 인증 코드를 받아 이를 인증하고 사용설정을 하고 …)


설정 완료!

  1. 다시 계정 화면으로 돌아온다.

이제 앱 비밀번호를 설정할 수 있다!
앱 비밀번호를 클릭한 후 재인증의 과정을 거친다.

  1. 앱 비밀번호 받기

나의 경우 Windows 컴퓨터를 사용하기 때문에 위 설정으로 사용했다.
생성을 클릭하면 아래와 같이 앱 비밀번호를 발급받을 수 있다!

  1. 앱 비밀번호를 properties의 spring.mail.password에 지정한다.

이제 다시 앱을 실행하여 Mail을 발송하면 처음 나왔던 Exception 없이 정상으로 메일발송이 될 것이다.

요즘은 개인정보 보안이 중요하기 때문에 간단한 테스트용으로는 보안 수준이 낮은 앱 허용을 풀어서 하더라도 테스트 후 바로바로 꺼놓도록 하고 메일을 앱 기능에 추가한 후 서버에 올려서 사용한다면 위와 같이 앱 비밀번호를 사용하도록 하자.

Share