티스토리 뷰

Gmail STMP로 인증번호를 자동으로 발송하는 기능을 구현하고 싶었는데

메일 발송 시점에서 계속 오류가 났다. 찾아보는데도 생소하고 시간이 많이 걸렸었는데 다른 사람에게 도움이 될까하고 정리해본다.

 

pom.xml

// email
// https://mvnrepository.com/artifact/javax.mail/mail
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

// https://mvnrepository.com/artifact/org.springframework/spring-context-support
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.3.9</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

찾아보면 여러 결과가 있는데 나는 이렇게 설정했다.

email을 보내는 서비스에 관한 것으로

javax.mail은 이전 버전을 해서 오류가 난 케이스를 보았기 때문에 1.4.7이상으로 설정하는 것이 좋겠다.

 

servlet-context.xml

// 회원가입 메일 인증
<beans:bean id="mailSender"	class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <beans:property name="host" value="smtp.gmail.com" />
    <beans:property name="port" value="587" /> // 465 or 25
    <beans:property name="username" value="[Gmail 계정]" />
    <beans:property name="password" value="[Gmail 앱 비밀번호]" />
    <beans:property name="defaultEncoding" value="utf-8" />
    <beans:property name="javaMailProperties">
        <beans:props>
            <beans:prop key="mail.transport.protocol">smtp</beans:prop>
            <beans:prop key="mail.smtp.auth">true</beans:prop>
            <beans:prop key="mail.smtp.port">587</beans:prop>
            <beans:prop key="mail.debug">true</beans:prop>
            <beans:prop key="mail.smtp.ssl.trust">smtp.gmail.com</beans:prop>
            <beans:prop key="mail.smtp.ssl.protocols">TLSv1.2</beans:prop>
            <beans:prop key="mail.smtp.ssl.enable">false</beans:prop>
            <beans:prop key="mail.smtp.starttls.enable">true</beans:prop>
            <beans:prop key="mail.smtp.socketFactory.class">
            javax.net.ssl.SSLSocketFactory</beans:prop>
        </beans:props>
    </beans:property>
</beans:bean>

 

beans:prop key는 당연하지만 mailSender 아래에 있는 키로, 다른 키들은 써봤자 소용이 없다.

 

mail.smtp.protocol : smtp - smtp 프로토콜을 사용한다는 뜻

mail.smtp.auth: true - 계정과 비밀번호 넣는 부분으로 사용하겠다는 뜻

mail.smtp.port : 587 - 587 포트를 사용한다는 뜻(여기서는 TLS활성화 했기 때문에 TLS 통신할 포트)

네이버 메일일 경우, 465 포트를 사용한다.

mail.debug : true - 이걸로 디버깅 로그가 출력되고 오류가 나면 알 수 있다.

mail.smtp.ssl.trust : smtp.gmail.com - smtp 뒤에 사용할 계정주소를 적는다. ex) smtp.naver.com

mail.smtp.ssl.protocols TLSv1.2 - SSL 프로토콜을 TLS1.2로 설정

mail.smtp.ssl.enable: false - SSL 비활성화

mail.smtp.starttls.enable : true - TLS라는 보안인증서 활성화(SSL) 

mail.smtp.socketFactory.class : javax.net.ssl.SSLSocketFactory - SSL 통신(TLS 활성화 했으니)에 사용할 소켓통신 클래스(gmail 내 보안 인증 강화로 추가)

 

 

beans:prop key에 적힌 것들이 무슨 의미인지 잘 모르는 상황에서 찾아보니 더 오래 걸렸던 것 같다.

친절하게도 구글에서 해당 가이드를 제시하는데 이걸 보면 이해가 가서 좀 빨리 알았으면 싶다.

 

구글 Gmail SMTP 가이드

 

위에서 설정한 것과 같이 포트 번호를 맞추고 SSL/TLS를 조정했다.

SSL가 필요하다고 했는데 왜 SSL를 비활성화 했을까?

자세히는 모르지만 2022년 5월 이후부터 gmail에서 인증 가능한 보안 설정이 조정되지 않는 것과 관련이 있나 싶다.

 

실제로 5월 이전에 작성된 포스트를 보고 한 코드는 실행되지 않았고

혹시나 해서 ssl.protoclos를 지우고 starttls.enable을 false / ssl.enable을 true로 하는 등 여러 시도를 해보았지만

위에 적은 설정으로만 메일이 보내졌다.

 

아래의 링크에서 더 자세히 설정할 수 있다.

https://support.google.com/mail/answer/7104828?hl=ko&ref_topic=3398031 

 

POP를 사용하여 다른 이메일 클라이언트에서 Gmail 메일 읽기 - Gmail 고객센터

도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요

support.google.com

 

 

아래는 구글에서 제공하는 오류 메시지로 도움이 많이 됐다.

SMTP 오류 메시지

421, '4.3.0', 일시적인 시스템 문제가 발생했습니다. 잠시 후 다시 시도해 보세요
421, '4.4.5', 서버 사용 중. 잠시 후 다시 시도해 보세요.
421, '4.7.0', RCPT 도메인 허용 목록에 없는 IP입니다. 연결을 종료합니다.
421, '4.7.0', 시스템에서 사용자의 IP 주소로부터 요청하지 않은 메일이 비정상적인 비율로 발송됨을 감지했습니다. Google 사용자를 스팸으로부터 보호하기 위해 사용자의 IP 주소에서 발송된 메일이 일시적으로 차단되었습니다. 자세한 내용은 Gmail 사용자에게 보낸 메일이 차단되거나 스팸으로 분류되는 것을 방지하기를 참고하세요.
421, '4.7.0', 일시적인 시스템 문제가 발생했습니다. 나중에 다시 시도하세요.
421, '4.7.0', RCPT 도메인에는 TLS가 필요합니다. 연결을 종료합니다.
421, '4.7.0', 나중에 다시 시도하세요. 연결을 종료합니다. 일반적으로 HELO 단계에서 SMTP 릴레이의 서비스 거부(DoS)가 발생했음을 의미합니다.
450, '4.2.1' 연락하려는 사용자의 메일 수신 속도가 지나치게 빠릅니다. 나중에 메일을 다시 전송하세요. 그때 사용자가 메일을 수신할 수 있다면 메일이 전달될 것입니다. 자세한 내용은 메일 주고받기 한도를 참고하세요.
450, '4.2.1', 연락하려는 사용자가 추가 메일이 전달될 수 없는 속도로 메일을 수신하고 있습니다. 나중에 메일을 다시 전송하세요. 그때 사용자가 메일을 수신할 수 있다면 메일이 전달될 것입니다. 자세한 내용은 메일 주고받기 한도를 참고하세요.
450, '4.2.1', 고객에 대한 최대 SMTP 릴레이 한도가 초과되었습니다. 일시적인 오류입니다. SMTP 릴레이 한도에 관한 자세한 내용은 관리자에게 문의하거나 SMTP 릴레이 서비스 오류 메시지를 참고하세요.
451, '4.3.0', 메일 서버가 일시적으로 메일을 거부했습니다.
451, '4.3.0', 트랜잭션당 다중 도착 도메인을 지원하지 않습니다. 다시 시도해 보세요.
451, '4.4.2', 시간이 초과되었습니다. 연결을 종료합니다.
451, '4.5.0', SMTP 프로토콜 위반입니다. RFC 2821을 참고하세요. 
452, '4.2.2', 연락하려는 이메일 계정이 용량을 초과했습니다. 수신자를 Google 드라이브 공간 비우기 및 저장용량 늘리기로 안내하세요.
452, '4.5.3', 트랜잭션당 도메인 정책 크기가 초과되었습니다. 별도의 트랜잭션으로 해당 수신자에게 메일을 다시 보내세요.
이 오류 메시지는 수신자 도메인의 이메일 정책 크기(정책 크기, 정책 수 또는 둘 다)가 초과되었다는 의미입니다.
452, '4.5.3', 메일에 수신자가 너무 많습니다. Google의 전송 한도에 관한 자세한 내용은 메일 주고받기 한도를 참고하세요.
454, '4.5.0', SMTP 프로토콜 위반입니다. STARTTLS 후에 파이프라인에 허용된 명령은 없습니다. RFC 3207을 참고하세요.
454, '4.7.0', 일시적인 시스템 문제로 인해 인증할 수 없습니다. 나중에 다시 시도하세요.
454, '5.5.1', STARTTLS는 반복할 수 없습니다.
501, '5.5.2', 응답을 디코딩할 수 없습니다.
501, '5.5.4', 잘못된 HELO/EHLO 인수입니다. 자세한 내용은 HELO/EHLO 이메일 오류를 참고하세요.
502, '5.5.1', 인식할 수 없는 명령이 너무 많아 종료됩니다.
502, '5.5.1', 구현되지 않은 명령입니다.
502, '5.5.1', 인식할 수 없는 명령입니다.
503, '5.5.1', EHLO/HELO를 먼저 수행해야 합니다.
503, '5.5.1', MAIL을 먼저 수행해야 합니다.
503, '5.5.1', RCPT를 먼저 수행해야 합니다.
503, '5.7.0', ID 변경이 허용되지 않습니다.
504, '5.7.4', 인증 유형을 인식할 수 없습니다.
530, '5.5.1', 인증이 필요합니다. 자세한 내용은 Google 계정에 로그인할 수 없음을 참고하세요.
530, '5.7.0', 먼저 STARTTLS 명령을 실행해야 합니다.
535, '5.5.4', 해당 AUTH 모드에서는 옵션 인수가 허용되지 않습니다.
535, '5.7.1', 애플리케이션 비밀번호가 필요합니다. 자세한 내용은 앱 비밀번호로 로그인하기를 참고하세요.
535, '5.7.1', 웹브라우저에서 로그인하고 다시 시도해 주세요. 자세한 내용은 다른 이메일 플랫폼을 통해 Gmail 확인하기를 참고하세요.
535, '5.7.1', 허용되지 않는 사용자 이름과 비밀번호입니다. 자세한 내용은 Google 계정에 로그인할 수 없음을 참고하세요.
550, '5.1.1', 연락하려는 이메일 계정이 존재하지 않습니다. 수신자 이메일 주소에 오타나 불필요한 공백이 있는지 다시 확인하세요. 자세한 내용은 반송 또는 거부된 이메일 문제 해결하기를 참고하세요.
550, '5.2.1', 연락하려는 이메일 계정이 사용 중지되었습니다.
550, '5.2.1', 연락하려는 사용자가 추가 메일이 전달될 수 없는 속도로 메일을 수신하고 있습니다. 자세한 내용은 메일 주고받기 한도를 참고하세요.
550, '5.4.5', 일일 전송 한도를 초과했습니다. 자세한 내용은 이메일 전송 한도를 참고하세요.
550, '5.4.5', 사용자에 대한 일일 SMTP 릴레이 한도가 초과되었습니다. SMTP 릴레이 전송 한도에 관한 자세한 내용은 관리자에게 문의하거나 SMTP 릴레이 서비스 오류 메시지를 참고하세요.
550, '5.7.0', 메일 릴레이가 거부되었습니다.
550, '5.7.0', 메일 전송이 거부되었습니다. 이 오류는 Google Workspace 도메인에서 발신자 계정이 사용 중지되거나 등록되지 않은 경우에 발생합니다.
550, '5.7.1', 이메일 용량이 초과되었습니다.
550, '5.7.1', 릴레이용 사용자 인증 정보가 잘못되었습니다.
550, '5.7.1', 시스템에서 사용자의 IP 주소에서 요청하지 않은 메일이 비정상적인 비율로 발송됨을 감지했습니다. Google 사용자를 스팸으로부터 보호하기 위해 사용자의 IP 주소에서 발송된 메일을 차단했습니다. Gmail 사용자에게 보낸 메일이 차단되거나 스팸으로 분류되는 것을 방지하기를 검토하세요.
550, '5.7.1', 요청되지 않은 메일이라는 것을 시스템에서 감지했습니다. Gmail로 전송되는 스팸의 양을 줄이기 위해 이 메일을 차단했습니다. 자세한 내용은 Gmail이 내 메일을 차단하는 이유를 참고하세요.
550, '5.7.1', 메일 전송에 사용 중인 IP는 Google 서버로 직접 이메일을 전송할 권한이 없습니다. 대신 서비스 제공업체의 SMTP 릴레이를 사용하세요. 자세한 내용은 '사용 중인 IP는 권한이 없습니다...'를 참고하세요.
550, '5.7.1', 발신/수신하는 사용자 또는 도메인에 내가 전송한 메일을 차단하는 정책이 있습니다. 자세한 내용은 도메인 관리자에게 문의하세요. 자세한 내용은 메일 전송을 금지하는 정책이 설정되어 있습니다를 참고하세요.
550, '5.7.1', 이 도메인은 인증되지 않은 이메일을 허용하지 않습니다.
550, '5.7.1', 고객에 대한 일일 SMTP 릴레이 한도가 초과되었습니다. SMTP 릴레이 전송 한도에 관한 자세한 내용은 관리자에게 문의하거나 SMTP 릴레이 서비스 오류 메시지를 참고하세요.
550, '5.7.26', 도메인의 DMARC 정책에 따라 도메인 이름에서 보낸 인증되지 않은 이메일은 허용되지 않습니다. 도메인 이름 도메인의 관리자에게 문의하세요. 스팸이 아닌 메일인 경우 도메인에서 수신된 인증되지 않은 메일 관리하기를 방문하여 DMARC 이니셔티브에 관해 자세히 알아보세요. 메시지가 유효하고 스팸이 아닌 경우 수신 메일 서버의 관리자에게 문의하여 보낸 메일이 인증 검사를 통과하지 못한 이유를 확인하세요.
550, '5.7.26', '이 메일에 인증 정보가 없거나 인증 검사(SPF 또는 DKIM)를 통과하지 못했습니다. Google이 사용자를 스팸으로부터 보호하기 위해 메일을 차단했습니다. 자세한 내용은 Gmail 사용자에게 보낸 메일이 차단되거나 스팸으로 분류되는 것을 방지하기를 참고하세요.'
550, '5.7.26', '이 메일은 하드 실패 정책(-all)으로 SPF 레코드에 대한 SPF 검사를 통과하지 못합니다. Google이 사용자를 스팸과 피싱으로부터 보호하기 위해 메일을 차단했습니다. 자세한 내용은 Gmail 사용자에게 보낸 메일이 차단되거나 스팸으로 분류되는 것을 방지하기를 참고하세요.'
552, '5.2.2', 연락하려는 이메일 계정이 용량을 초과했습니다.
552, '5.2.3', 메일이 Google의 메일 크기 제한을 초과했습니다. 자세한 내용은 Gmail 메일로 첨부파일 보내기를 참고하세요.
553, '5.1.2', 수신자 도메인을 찾을 수 없습니다. 맞춤법이 정확한지 확인하고 수신자 이메일 주소 뒤에 공백, 마침표 또는 기타 구두점이 들어가지 않았는지 확인하세요.
554, '5.6.0', 메일 메시지 형식이 잘못되었습니다. 허용되지 않는 형식입니다.
554, '5.6.0', 메일이 50 홉을 초과했습니다. 메일이 계속 전달되고 도착하지 않는 문제가 발생했을 수 있습니다.
554, '5.7.0', 인증되지 않은 명령이 너무 많습니다.
555, '5.5.2', 구문 오류입니다.

 

 

'배운 것 기록 > Spring' 카테고리의 다른 글

롬복  (0) 2022.09.06
마이바티스 기능과 SqlSession 클래스  (0) 2022.08.30
JSTL - <c:if> / <c:choose> 태그 사용법  (0) 2022.08.24
Controller 예외처리  (0) 2022.08.21
스프링 프로젝트 구조 / 흐름 정리  (0) 2022.08.10
댓글
최근에 올라온 글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함