코드 117개 중 117개
기본 응답 코드
시스템 상태 또는 시스템 도움말 응답입니다. 실제로는 거의 쓰이지 않습니다.
HELP 명령에 대한 도움말 메시지로, 서버나 특정 명령의 사용법을 알려 줍니다.
연결을 열 때 서버가 보내는 첫 인사로, 서비스가 준비되었음을 뜻합니다. STARTTLS에 대한 응답으로도 쓰여 TLS 협상을 시작할 수 있음을 알립니다.
서버가 연결을 닫습니다. 보통 QUIT 명령에 대한 응답입니다.
AUTH 인증에 성공했습니다. 보통 확장 코드 2.7.0이 함께 옵니다.
요청한 작업이 완료되었습니다. EHLO, MAIL FROM, RCPT TO에 대한 일반적인 응답이며, DATA가 끝난 뒤 서버가 메시지를 수락할 때도 반환됩니다.
수신자가 로컬 사용자는 아니지만, 서버가 메시지를 수락하고 지정된 주소로 전달합니다.
서버가 사용자의 존재 여부를 확인해 주지 않지만(계정 열거를 막기 위해 VRFY 비활성화), 메시지는 수락하고 전달을 시도합니다.
ETRN에 대한 응답: 요청한 도메인 또는 노드의 대기열에 있던 메시지 전달을 시작했습니다.
AUTH 과정에서 서버가 보내는 Base64 인코딩 챌린지입니다. 클라이언트는 인증 메커니즘의 다음 데이터(예: AUTH LOGIN의 사용자 이름이나 비밀번호)로 응답해야 합니다.
DATA에 대한 응답: 서버가 메시지 내용을 기다립니다. 내용은 마침표 하나만 있는 줄로 끝납니다.
서비스를 사용할 수 없어 서버가 연결을 닫습니다. 종료, 과부하, 과도한 연결 수, 일시적인 발송 제한 등이 원인입니다. 발신 측은 나중에 다시 시도해야 합니다.
인증하려면 사용자가 비밀번호를 변경하거나 다른 인증 메커니즘으로 전환해야 합니다. 확장 코드 4.7.12가 함께 옵니다.
메일함을 일시적으로 사용할 수 없습니다(사용 중, 잠김 또는 정책에 따른 일시 거부). 그레이리스팅은 보통 이 코드나 451로 응답합니다.
DNS 조회 실패나 필터 무응답 같은 서버 내부 오류로 작업이 중단되었습니다. 발신 측은 나중에 다시 시도해야 합니다.
현재 서버에 메시지를 받을 공간이 부족합니다. 메시지당 수신자 수 한도를 넘었다는 뜻일 수도 있으며, 이 경우 클라이언트는 나머지 수신자를 별도 트랜잭션으로 보내야 합니다.
일시적인 인증 실패(예: 자격 증명 서버가 응답하지 않음)이거나, STARTTLS를 요청했을 때 TLS를 일시적으로 사용할 수 없는 상태입니다.
서버가 MAIL FROM 또는 RCPT TO로 보낸 매개변수를 지금은 처리할 수 없지만, 나중에는 수락할 수도 있습니다.
ETRN에 대한 응답: 서버가 요청한 노드의 메시지 대기열을 지금은 처리할 수 없습니다.
ETRN에 대한 응답: 요청한 노드나 도메인은 대기열 전달을 요청할 권한이 없습니다.
서버가 명령을 인식하지 못했거나 줄이 너무 깁니다. AUTH 교환 중 한 줄이 허용 최대 길이를 넘을 때도 쓰입니다.
명령은 올바르지만 매개변수나 인수가 잘못되었습니다. 예를 들어 MAIL FROM의 주소 형식이 잘못되었거나 EHLO의 이름이 유효하지 않은 경우입니다.
서버가 명령을 인식하지만 구현하지 않았거나 비활성화해 두었습니다. 많은 서버의 VRFY나 EXPN이 그 예입니다.
명령 순서가 잘못되었습니다. 예를 들어 MAIL FROM보다 먼저 RCPT TO를 보냈거나, 유효한 수신자 없이 DATA를 보낸 경우입니다. 인증 없이 발송하려고 할 때 이 코드를 반환하는 서버도 있습니다.
지정한 매개변수를 서버가 지원하지 않습니다. 예를 들어 지원하지 않는 AUTH 메커니즘을 요청한 경우입니다.
이 호스트는 어떤 메일도 받지 않습니다. 220 대신 인사로 보내지며, 클라이언트는 재시도하면 안 됩니다.
명령을 수락하기 전에 인증하거나 STARTTLS로 TLS를 시작해야 합니다. 자격 증명 없이 제출 포트 587을 사용할 때 흔히 나타납니다.
선택한 인증 메커니즘이 서버 정책상 너무 약합니다. 앱 비밀번호나 OAuth를 요구하는 일부 제공업체가 이 코드를 반환합니다.
사용자 이름이나 비밀번호가 틀렸거나 자격 증명이 거부되었습니다. 확장 코드 5.7.8이 함께 옵니다.
선택한 인증 메커니즘은 암호화된 연결에서만 사용할 수 있습니다. 먼저 STARTTLS를 실행해야 합니다.
메일함이 없거나 사용할 수 없거나, 정책(스팸, 블랙리스트, SPF, DKIM, DMARC) 때문에 메시지가 거부되었습니다. 구체적인 원인은 함께 오는 확장 코드로 알 수 있습니다.
수신자가 로컬 사용자가 아니며 서버는 메시지를 전달하지 않습니다. 보낼 주소를 알려 줄 수도 있습니다.
할당된 저장 공간을 초과했습니다. 수신자의 메일함이 가득 찼거나, 메시지가 SIZE 확장에서 알린 최대 크기를 넘었습니다.
메일 주소가 유효하지 않거나 허용되지 않습니다. 예를 들어 구문이 잘못되었거나 발신자가 그 주소를 사용할 수 없는 경우입니다.
트랜잭션이 실패했습니다. 첫 인사로 오면 해당 클라이언트에 SMTP 서비스를 제공하지 않는다는 뜻이고, DATA 이후에 오면 메시지가 거부되었다는 뜻으로, 주로 내용이나 발신자 평판이 원인입니다.
MAIL FROM 또는 RCPT TO로 보낸 확장 매개변수를 서버가 인식하지 못하거나 구현하지 않았습니다.
수신자 도메인이 null MX(‘.’를 가리키는 MX 레코드)를 게시해 메일을 받지 않는다고 선언했습니다. 재시도해도 의미가 없습니다.
확장 상태 코드(RFC 3463)
세부 정보가 없는 상태 코드로, 결과의 클래스(성공, 일시 실패, 영구 실패)만 알 수 있을 때 쓰입니다.
메시지의 주소 중 하나에 문제가 있지만, 더 구체적인 코드에 해당하지 않습니다.
대상 서버에 수신자 메일함이 없습니다. 주소를 잘못 입력했거나 탈퇴한 계정 때문에 생기는 전형적인 반송입니다.
대상 도메인이나 시스템이 없거나 메일을 받을 수 없습니다. 예를 들어 도메인이 확인(resolve)되지 않는 경우입니다.
수신자 주소의 구문이 유효하지 않습니다.
수신자 주소가 대상 시스템의 메일함 여러 개와 일치합니다.
수신자 주소가 유효합니다. RCPT TO에 대한 긍정 응답에서 2.1.5로 나타납니다.
메일함이 있었지만 이전되었고, 알려진 전달 주소가 없습니다.
발신자 주소의 구문이 유효하지 않습니다.
발신자 도메인이 없거나 회신을 받지 않습니다. 예를 들어 MX 레코드도 A 레코드도 없는 경우입니다.
메시지가 상태 알림을 지원하지 않는 시스템으로 전달되어, 최종 전달 여부를 확인할 수 없습니다.
수신자 도메인이 null MX를 게시해 메일을 받지 않는다고 선언했습니다.
메일함은 있지만 그와 관련된 문제로 전달되지 못했으며, 더 구체적인 코드가 없습니다.
메일함은 있지만 비활성화되어 메시지를 받지 않습니다. 예를 들어 정지된 계정입니다.
수신자 메일함이 저장 용량 할당량을 초과했습니다.
메시지가 수신자에게 허용된 최대 수신 크기를 넘었습니다.
수신자가 메일링 리스트인데, 구성원 목록으로 확장하지 못했습니다.
대상 시스템에 문제가 있지만, 더 구체적인 코드에 해당하지 않습니다.
대상 메일 시스템의 저장 공간이 가득 찼습니다.
대상 호스트가 임박한 종료, 과부하 또는 유지 보수로 인해 메시지를 받지 않고 있습니다.
메시지에 필요한 기능을 대상 시스템이 지원하지 않습니다.
메시지가 서버가 모든 수신자에 대해 허용하는 최대 크기를 넘었습니다.
대상 시스템이 잘못 구성되어 메시지를 받을 수 없습니다.
메시지가 수락되었지만 요청과 다른 우선순위로 처리됩니다(MT-PRIORITY 확장).
네트워크 또는 라우팅 문제가 발생했지만, 더 구체적인 코드에 해당하지 않습니다.
연결을 시도했지만 대상 서버가 응답하지 않았습니다.
연결은 되었지만 전달을 마치기 전에 끊기거나 불안정해졌습니다.
전달에 필요한 디렉터리 서비스(대개 DNS 조회)가 실패했습니다.
대상까지의 경로를 찾지 못했습니다. 예를 들어 도메인에 사용할 수 있는 MX 레코드나 A 레코드가 없는 경우입니다.
메일 시스템이 혼잡해 지금은 메시지를 처리할 수 없습니다.
라우팅 루프가 감지되었습니다. 메시지가 같은 서버를 너무 여러 번 거쳤습니다.
최대 재시도 기간이 지나 메시지가 전달되지 못한 채 폐기됩니다.
전달 프로토콜에 문제가 있지만, 더 구체적인 코드에 해당하지 않습니다.
명령이 유효하지 않거나, 그 시점에 허용되지 않거나, 인식되지 않습니다.
명령에 구문 오류가 있어 서버가 해석할 수 없습니다.
메시지의 수신자 수가 서버가 한 트랜잭션에서 허용하는 수보다 많습니다.
명령은 유효하지만 인수가 유효하지 않거나 지원되지 않습니다.
클라이언트와 서버 사이에 프로토콜 버전이 호환되지 않습니다.
AUTH 교환 중 한 줄이 서버가 허용하는 최대 길이를 넘었습니다.
메시지 내용에 문제가 있지만, 더 구체적인 코드에 해당하지 않습니다.
대상이 메시지 또는 첨부 파일의 콘텐츠 유형을 지원하지 않습니다.
메시지를 전달하려면 내용을 변환해야 하지만, 발신자가 이를 금지했습니다.
메시지를 전달하려면 내용을 변환해야 하지만, 서버가 변환할 수 없습니다.
메시지는 전달되었지만, 내용 변환 과정에서 정보가 손실되었습니다.
메시지 내용 변환에 실패했습니다.
URL로 참조된 메시지 내용을 가져오지 못했습니다(BURL 확장).
발신자나 수신자가 ASCII 이외의 문자가 포함된 주소(국제화 메일, SMTPUTF8)를 지원하지 않습니다.
서버가 UTF-8 텍스트로 응답해야 하지만, 클라이언트가 SMTPUTF8 지원을 알리지 않았습니다.
메시지에 UTF-8 헤더가 있어 이를 지원하지 않는 하나 이상의 수신자에게 전송할 수 없으므로 거부됩니다.
세부 정보가 없는 보안 상태 코드입니다. 인증 성공(2.7.0), AUTH 일시 실패(4.7.0), 정책에 따른 거부에서 나타납니다.
발신자가 해당 수신자에게 보낼 권한이 없습니다. 블랙리스트, 평판, 스팸 차단 또는 허용되지 않은 릴레이 시도로 인한 차단입니다. 4.7.1 형태라면 흔히 그레이리스팅을 뜻합니다.
발신자에게 해당 메일링 리스트로 보낼 권한이 없습니다.
메시지를 한 보안 프로토콜에서 다른 보안 프로토콜로 변환해야 하지만, 불가능합니다.
메시지에 필요한 보안 기능을 대상이 지원하지 않습니다.
전송 중 암호화 작업(예: 서명 검증이나 복호화)이 실패했습니다.
메시지에 사용된 암호 알고리즘을 대상이 지원하지 않습니다.
무결성 검증에 실패했습니다. 전송 중 메시지가 변경되었거나 체크섬이 일치하지 않습니다.
인증 자격 증명이 유효하지 않습니다. 사용자 이름이나 비밀번호가 틀렸습니다.
선택한 인증 메커니즘이 서버 정책이 요구하는 수준보다 약합니다.
요청한 인증 메커니즘을 사용하려면 TLS 같은 외부 암호화 계층이 필요합니다. 주로 비밀번호를 평문으로 보내는 메커니즘을 위한 코드입니다.
요청한 인증 메커니즘은 암호화된 연결에서만 허용됩니다.
사용자가 비밀번호를 변경하거나 다른 인증 메커니즘으로 전환해야 합니다.
인증을 시도하는 사용자의 계정이 비활성화되어 있습니다.
서버는 신뢰 관계가 확립된 시스템의 메시지만 받습니다.
메시지 우선순위가 너무 낮아 지금은 수락할 수 없습니다(MT-PRIORITY 확장).
지정한 우선순위에 비해 메시지가 너무 큽니다(MT-PRIORITY 확장).
발신자가 지정한 날짜 이후 메일함 소유자가 바뀌어 메시지가 전달되지 않습니다(RRVS 확장).
발신자가 지정한 날짜 이후 수신자 도메인의 소유자가 바뀌었습니다(RRVS 확장).
발신자가 요청한 대로 메일함 소유자가 바뀌었는지 서버가 확인할 수 없습니다(RRVS 확장).
메시지에 유효한 DKIM 서명이 없는데, 수신 측 정책은 서명을 요구합니다.
메시지에 유효한 DKIM 서명이 있지만, 어느 것도 수신 측 정책(예: 서명 도메인이나 알고리즘)을 충족하지 않습니다.
From 헤더에 표시된 도메인과 같은 도메인의 유효한 DKIM 서명이 없습니다.
발송 IP가 발신자 도메인의 SPF 레코드에서 허용되지 않았습니다.
SPF 평가 중 오류가 발생했습니다. 예를 들어 레코드 형식이 잘못되었거나 DNS 조회가 너무 많은 경우입니다.
발송 IP에 역방향 DNS(PTR)가 없거나, 반환된 이름이 다시 그 IP로 확인되지 않습니다.
SPF와 DKIM 같은 여러 메시지 인증 검사가 동시에 실패했습니다.
발신자 도메인이 null MX를 게시해 회신이나 반송을 받을 수 없으므로 메시지가 거부됩니다.
메시지가 유사한 악성 메시지 대량 발송의 일부로 보입니다.
ARC 체인 검증에 실패했습니다. ARC는 메시지가 전달 서비스나 메일링 리스트를 거쳐도 인증 결과를 보존하는 방식입니다.
메시지가 REQUIRETLS를 요구하는데 경로상의 다음 서버가 이 확장을 지원하지 않아, 암호화를 보장한 채 전달할 수 없습니다.
550 5.7.1 Message rejected처럼 서버 응답 전체를 붙여 넣으면 기본 코드와 확장 코드를 한 번에 볼 수 있습니다. 기본 코드로 검색하면 그 코드와 함께 자주 나오는 확장 코드도 표시됩니다.
작동 방식
SMTP 세션에서는 클라이언트의 각 명령(EHLO, MAIL FROM, RCPT TO, DATA 등)에 대해 서버가 세 자리 코드로 시작하는 응답을 보냅니다. 첫째 자리는 결과를 나타내며, 2는 성공, 3은 서버가 추가 데이터를 기다림, 4는 일시적 오류, 5는 영구적 오류입니다. 둘째 자리는 영역을 나타내며, x0z는 구문, x1z는 정보, x2z는 연결, x5z는 메일 시스템입니다. 코드 뒤의 텍스트는 자유 형식이라 서버마다 다르고, 프로그램은 숫자만 봅니다.
세 자리만으로는 원인을 알기 어려워, RFC 3463에서 클래스.주제.세부 형식의 확장 상태 코드를 정의했습니다. 5.1.1은 주소(1)에 관한 영구 실패(5)로, 메일함이 없다는(1) 뜻입니다. 클래스는 첫째 자리의 의미(2, 4, 5)를 반복하고, 주제는 원인을 분류하며, 세부 항목이 이를 구체화합니다. 이 코드를 쓰는 서버는 EHLO 응답에서 ENHANCEDSTATUSCODES 확장을 알리며, 같은 코드가 반송 메시지의 Status 필드에도 나타납니다.
이 표에는 RFC 5321의 기본 코드와 널리 쓰이는 확장(AUTH, STARTTLS, ETRN, null MX)이 추가한 코드, 그리고 IANA 레지스트리의 모든 확장 코드가 각각 자주 함께 나오는 기본 코드와 함께 정리되어 있습니다. 대형 제공업체는 자체 텍스트와 도움말 링크를 덧붙이지만, 번호는 언제나 같습니다.
예시
550 5.1.1 <nadie@example.com>: Recipient address rejected: User unknown in local recipient table5xx Permanent · X.1.1 Bad destination mailbox address계정이 없을 때 Postfix가 보내는 전형적인 반송입니다. 재시도해도 소용없으며 주소를 고쳐야 합니다. 같은 수신자에게 전에는 잘 보내졌다면 계정이 삭제되었을 가능성이 큽니다.450 4.2.0 <ana@example.com>: Recipient address rejected: Greylisted4xx Transient · X.2.0 Other or undefined mailbox status그레이리스팅: 서버가 모르는 발신자를 일시적으로 거부하고 재시도를 기다립니다. 정상적인 메일 서버는 몇 분 뒤 알아서 재시도해 메시지가 들어가지만, 스팸 프로그램은 대부분 재시도하지 않습니다.AUTH LOGIN334 VXNlcm5hbWU6334에는 Base64로 인코딩된 챌린지가 들어 있습니다. VXNlcm5hbWU6은 ‘Username:’이고, 다음 UGFzc3dvcmQ6은 ‘Password:’입니다. 자격 증명이 틀리면 서버는 535 5.7.8로 응답하고, 먼저 암호화를 요구하면 538이나 530으로 응답합니다.활용 사례
- 서버가 돌려준 오류 메시지로 메일이 반송된 이유를 파악합니다.
- 오류가 일시적이라 대기열에서 재시도될지, 영구적이라 조치가 필요한지 구분합니다.
- 애플리케이션, 프린터, 서버에서 메일 발송을 설정할 때 인증 실패를 진단합니다.
- 메일 서버 로그에 나오는 SPF, DKIM, DMARC, 역방향 DNS, 블랙리스트 거부를 해석합니다.
- 대량 발송 플랫폼에서 반송을 분류해 존재하지 않는 주소를 목록에서 제거합니다.
- telnet, openssl s_client, swaks로 캡처한 SMTP 세션을 읽습니다.
자주 묻는 질문
4xx 오류와 5xx 오류는 무엇이 다른가요?
4xx는 일시적 오류입니다. 발신 서버는 메시지를 대기열에 두고 일정 간격으로 재시도하며, 보통 4~5일이 지나도 실패하면 포기하고 반송을 생성합니다. 5xx는 영구적 오류로, 즉시 반송되며 아무것도 바꾸지 않고 같은 메시지를 다시 보내면 또 실패합니다.
550 5.1.1처럼 응답에 코드가 두 개 있는 이유는 무엇인가요?
첫째는 RFC 5321이 요구하는 세 자리 기본 코드이고, 둘째는 원인을 구체적으로 알려 주는 RFC 3463의 확장 상태 코드입니다. 같은 550이라도 메일함이 없거나(5.1.1), 정책에 의해 차단되었거나(5.7.1), SPF에 실패했을(5.7.23) 수 있습니다. 진단할 때는 주로 확장 코드를 보는 것이 좋습니다.
550-5.7.1의 하이픈은 무슨 뜻인가요?
응답이 여러 줄이라는 뜻입니다. 모든 줄에 같은 코드가 붙지만, 중간 줄은 코드와 텍스트를 하이픈으로, 마지막 줄은 공백으로 구분하므로 클라이언트가 응답이 끝난 시점을 알 수 있습니다. EHLO가 돌려주는 확장 목록에서도 같은 형식을 볼 수 있습니다.
주소가 존재하는데 왜 550 5.7.1로 거부되나요?
5.7.1은 수신자가 아니라 발신자에 관한 코드이기 때문입니다. 서버가 당신이 그 메시지를 전달하는 것을 허용하지 않는다는 뜻입니다. 흔한 원인은 발송 IP가 블랙리스트에 올라 있거나, 도메인의 SPF, DKIM, DMARC 검증에 실패했거나, IP에 역방향 DNS가 없거나, 인증 없이 서버를 릴레이로 사용하려 한 경우입니다. 코드 뒤의 텍스트가 대개 단서를 줍니다.
애플리케이션에서 메일을 보낼 때 530이나 535가 나오는 이유는 무엇인가요?
530은 메시지를 수락하기 전에 인증하거나 TLS를 시작해야 한다는 뜻이고, 535는 사용자 이름이나 비밀번호가 틀렸다는 뜻입니다. 애플리케이션이 587 포트와 STARTTLS 또는 465 포트와 암시적 TLS를 사용하는지, 인증이 켜져 있는지 확인하세요. Gmail이나 Microsoft 365 같은 제공업체에서는 평소 비밀번호 대신 앱 비밀번호나 OAuth를 사용해야 합니다.