본문 바로가기
오류-해결

[Java] JavaMailSender "javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted." 오류 원인 및 해결

by hunbal 2023. 8. 31.
SMALL

JavaMailSender STARTTLS 인증 오류를 해결한 후 또 다른 에러가 발생하였다..

에러 메시지는 아래와 같았는데

[Request processing failed; nested exception is 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 e8-20020a62ee08000000b00686dd062207sm297098pfi.150 - gsmtp
] with root cause 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 e8-20020a62ee08000000b00686dd062207sm297098pfi.150 - gsmtp

 

해석해보면 이메일 서비스를 통해 Google 계정으로 이메일을 보내려고 할 때 발생하는 문제이다.

구체적으로 "Username and Password not accepted""BadCredentials"와 관련된 내용이 나와있는데
인증 정보 (사용자 이름 및 비밀번호)가 잘못되었거나 애플리케이션이 Google 계정에 잘못된 인증 정보를 제공하고 있다는 것을 나타낸다.

 

JavaMailSender를 이용할 때 이메일을 전송할 관리자 계정과 비밀번호를 설정해주어야 하는데 난 Gmail을 사용하기로 했고, Google 계정과 비밀번호 모두 올바르게 입력을 해주었기 때문에 오류가 발생하는게 의아해서 구글링을 해보니 뜻 밖의 원인이 숨어있었다.

 

원인

 

프로젝트에서 설정한 Google 계정으로 이메일 전송 기능을 구현하려면 Google 계정의 보안 설정을 변경해야 했다.

 "보안 수준이 낮은 앱 허용" 설정을 변경하여 애플리케이션에서 Google 계정에 접근할 수 있도록 허용하거나

보안 설정에서 "앱 암호"를 생성하여 애플리케이션에 사용하도록 설정하면 문제를 해결할 수 있다고 한다.

 


 

해결

 

보안 수준이 낮은 앱 허용

액세스를 허용하려고 했더니 위와 같은 이유로 더 이상 지원을 안 한댄다. 그럼 2차 인증을 통해 해결하는 수 밖에..

 

 

우선 아래 링크를 타고 Google 계정 보안 설정 페이지에 들어간다.

https://myaccount.google.com/security?hl=ko

 

Google 계정

 

myaccount.google.com

빨간색으로 표시한 2단계 인증 설정을 클릭한 후 원하는 인증 방법을 선택해주어 완료한다. (핸드폰 등등..)

 

 

 

완료 후 스크롤을 내려 앱 비밀번호 탭을 클릭한다.

 

이메일 전송을 위해 카테고리의 메일 , Windows 컴퓨터를 선택해준다.

 

선택 후 Windows 컴퓨터 앱 용 비밀번호가 생성되는데, 이 비밀번호를 어플리케이션에서 사용하면 된다.

 

spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: caraxxx13@gmail.com
    password: ****************
  properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

나는 메일 전송에 필요한 값을 application.yml 파일에 작성했는데 발급받은 앱 비밀번호를 위의 password로 넣어주었다.

 

 

어플리케이션을 통해 발송한 이메일

 

 

비밀번호 설정 후 메소드를 호출했더니 위처럼 원하는 이메일을 발송할 수 있게 되었다! 👍

 

 

 

댓글