가이드 · 이메일 반송

제품 팀은 이메일 반송을 어떻게 안전하게 진단하고 처리해야 하나요?

이메일 반송을 일반적인 실패 플래그가 아니라 수신자 한 명과 시도 한 번에 연결된 전달 증거로 다루세요. 원래 메시지 식별자, 엔벨로프 발신자, 수신자, SMTP 또는 확장 상태 코드, 진단 내용, 보고한 서버, 이벤트 시각을 보존하세요. 즉시 발생하는 SMTP 거부와 나중에 도착하는 전송 상태 알림(DSN)을 구분하세요. 일시적인 4.x 결과에만 상한이 있는 백오프와 큐 보관 기간 제한을 두고 재시도하고, 영구적인 5.x 실패가 확인되면 수신자 단위 재시도를 중단하고 발송 제외 처리하세요. 제공업체 이벤트는 인증하고 중복을 제거하며, 백스캐터를 만들지 말고, 제공업체 접수, 수신 서버의 수락, 이후의 미전달, 받은편지함 도달을 별개의 상태로 유지하세요.

실패가 관찰된 지점 파악하기

제품은 실시간 SMTP 트랜잭션 중에, 나중에 도착하는 전송 상태 알림으로, 또는 인증된 제공업체 이벤트로 미전달을 알게 될 수 있습니다. 이 관찰들은 각각 증거의 성격이 다릅니다. 즉시 발생하는 RCPT TO 거부는 메시지 데이터가 접수되기 전에 해당 수신자에게 적용됩니다. DATA 단계의 거부는 제출된 트랜잭션 전체에 적용될 수 있습니다. 나중에 오는 DSN은 어떤 시스템이 책임을 넘겨받은 뒤 메시지를 전달하거나 릴레이하지 못했음을 알립니다. 단계, 서버, 수신자 범위, 시도, 타임스탬프, SMTP 응답, 확장 상태 코드, 진단, 원래의 상관 식별자를 기록하세요. 모든 경우를 반송됨 하나로 뭉뚱그리지 마세요. 원본 제공업체 페이로드나 표준 형식의 DSN은 운영 및 정책상 필요한 기간에만, 접근을 제한해서 보관하세요. 지원팀의 스크린샷이나 사람이 풀어 쓴 설명은 자동 재시도, 발송 제외 처리, 고객에게 보이는 상태의 근거로 충분하지 않습니다.

일시적 결과와 영구적 결과 구분하기

SMTP는 일시적인 부정 완료에 4yz 응답을, 영구적인 부정 완료에 5yz 응답을 사용합니다. 확장 상태 코드는 지속적인 일시 실패를 뜻하는 4나 영구 실패를 뜻하는 5로 시작하는 클래스에 주제와 세부 값을 덧붙입니다. 텍스트만으로는 제공업체마다 다르고 바뀔 수 있으므로 기본 코드와 확장 코드를 모두 보존하세요. 일시적인 결과는 같은 논리적 메시지를 지연 후에 재시도할 근거가 될 수 있지만, 즉각적인 반복이나 무한정 큐에 머무르는 것을 정당화하지는 않습니다. 영구적인 수신자 실패는 주소나 정책이 승인된 절차로 바뀔 때까지 해당 수신자와 시도에 대한 자동 재전송을 중단해야 합니다. 제공업체의 비공식 레이블만으로 하드 바운스인지 소프트 바운스인지 추정하지 마세요. 정확한 상태, 단계, 진단, 메시지 유형, 수신자, 현재 제공업체 문서를 바탕으로 정책을 세우세요. 알 수 없거나 형식이 잘못된 응답은 재발송이 기본값이 되지 않도록, 검토나 데드 레터 처리로 안전하게 넘기세요.

전송 상태 알림을 방어적으로 파싱하기

RFC 3464는 message/delivery-status 필드가 담긴 multipart/report로 전달되는, 기계가 읽을 수 있는 전송 상태 알림 형식을 정의합니다. 유용한 필드로 Reporting-MTA, Final-Recipient, Action, Status, Remote-MTA, Diagnostic-Code, 도착 시각 또는 마지막 시도 시각이 있습니다. MIME 구조가 파싱되더라도 모든 필드를 신뢰할 수 없는 입력으로 취급하세요. 메시지 크기, 헤더 수, 파트 수, 중첩, 문자 디코딩, 저장하는 진단 길이에 상한을 두세요. 첨부 파일을 실행하거나, 진단에 있는 링크를 자동으로 따라가거나, 수신자 주소를 테넌트 ID로 받아들이지 마세요. 안정적인 제공업체 메시지 식별자, 원래의 엔벨로프 메타데이터, 개인정보를 보호하는 상관 헤더를 사용해 애플리케이션이 소유한 시도와 연결하세요. DSN에는 원본 메시지 일부와 수신자 데이터가 포함될 수 있으므로 로그와 보존을 제한하세요. 상관 관계가 모호하다면 관련 없는 주소를 발송 제외 처리하거나 다른 테넌트의 메시지 이력을 노출하지 말고 증거만 보존하세요.

수신자 단위 상태 전이 모델링하기

메시지 하나가 여러 수신자를 대상으로 하고 서로 다른 결과를 받을 수 있습니다. 상태는 메시지 행에만 저장하지 말고 수신자와 시도별로 저장하세요. 제공업체가 일부 RCPT 명령은 수락하고 다른 명령은 거부할 수도 있고, 나중에 한 수신자에게는 전달, 다른 수신자에게는 실패를 보고할 수도 있습니다. 지연된 접수 또는 지연 이벤트가 나중에 확정된 영구 실패, 스팸 신고, 수신 거부를 덮어쓰지 못하도록 단조로운 전이를 정의하세요. 이벤트 원장을 보존하고 명시적인 우선순위 규칙으로 현재 표시 상태를 도출하세요. 제출됨, 제공업체 접수, 수신 서버 수락, 일시 지연, 영구 실패, 발송 제외, 스팸 신고, 수신 거부, 알 수 없음을 구분하세요. 수신 서버의 수락은 여전히 최종 메일함 폴더나 사람의 열람 여부를 알려 주지 않습니다. 재시도는 같은 논리적 이벤트 키 아래에 연결된 시도로 만들어 중복 위험과 증거가 계속 보이게 하세요. 예정된 재시도를 새로운 고객 동작으로 표시하지 마세요.

일시적 실패는 엄격한 상한을 두고 재시도하기

재시도 대상인 일시적 결과에는 지터가 포함된 지수 백오프, 유한한 시도 횟수, 최대 큐 보관 기간을 설정하세요. 제공업체가 문서로 안내한 재시도 동작을 사용하고, 이미 재시도하는 릴레이 위에 공격적인 애플리케이션 루프를 겹쳐 쌓지 마세요. 모든 시도에서 같은 논리적 메시지 ID와 발송 제외 확인을 유지하세요. 수신자가 발송 제외 처리되거나, 수신 동의가 바뀌거나, 이벤트가 만료되거나, 발신 ID가 취소되거나, 나중에 영구 응답이 도착하면 재시도를 중단하세요. 한 수신 서버의 장애가 큐를 독점하지 않도록 테넌트, 수신 도메인, 발신자, 실패 유형별로 속도 제한을 적용하세요. Retry-After나 문서화된 지연 안내가 있으면 존중하되, 임의의 메시지 내용을 재시도 지침으로 신뢰하지는 마세요. 큐 보관 기간 증가, 반복되는 일시 코드, 특이한 도메인, 만료가 임박한 시도에 대해 알림을 설정하세요. 일시적 코드가 지속적인 정책이나 평판 문제를 가릴 수 있습니다. 상한이 있는 재시도는 회복할 시간을 벌어 줄 뿐, 원인을 무시해도 된다는 허가가 아닙니다.

확정된 영구 수신자 실패는 발송 제외 처리하기

주소나 메일함의 영구 실패가 확정되면, 이후 작업을 제출하기 전에 제품이 소유한 발송 제외 레코드를 갱신해야 합니다. 테넌트, 정규화된 수신자 키, 범위, 원인 이벤트, 상태와 진단 범주, 효력 시각, 증거 참조를 저장하되 주소를 폭넓게 노출하지 마세요. 발송 제외는 목록을 가져올 때만이 아니라 발송 시점에 적용하세요. 잘못된 주소, 존재하지 않는 도메인, 정책 거부, 메시지 내용 거부, 인증 실패, 할당량, 발신자 평판은 안전한 해결 방법이 서로 다르므로 구분하세요. 잘못된 수신자에는 수신자 단위의 발송 제외가 맞지만, 발신자 인증 거부는 모든 수신자를 발송 제외 처리하는 대신 발신자 구성을 일시 중지해야 합니다. 수동 해제는 강력한 권한 부여, 사유, 감사 이력으로 보호하세요. 재확인이나 정정은 기존 증거를 삭제하지 않고 새로운 검증된 결정으로 남겨야 합니다. 제공업체의 발송 제외 목록은 유용하지만, 특히 제공업체를 마이그레이션할 때는 애플리케이션의 수신 동의 및 안전 원장을 대체하지 못합니다.

반송 루프와 백스캐터 방지하기

SMTP는 전송 상태 알림에 널 리버스 경로를 사용하므로, 알림을 전달하다 실패해도 또 다른 반송이 생성되지 않습니다. 릴레이에서도 이 동작을 유지하고, DSN, 자동 응답, 자동 생성을 나타내는 신호가 있는 메시지에는 자동 회신을 보내지 마세요. RFC 3834는 루프와 증폭 문제를 포함한 이메일 자동 응답에 대한 권고를 제공합니다. 의심스러운 메시지를 접수한 뒤 검증되지 않은 보이는 From 주소로 반송을 생성하지 마세요. 위조된 발신자 ID는 시스템을 백스캐터의 발원지로 만들 수 있습니다. 가능하면 SMTP 단계에서 잘못된 수신자를 거부하고, 접수한 뒤 위조된 주소로 알리는 방식은 피하세요. 발신자와 대화별로 자동 응답에 상한을 두고 통제된 회신 ID를 사용하세요. 제품 웹훅이나 내부 오류 이벤트가 새 인터넷 메일을 만드는 것보다 안전한 경우가 많습니다. 위조된 From, 널 엔벨로프 발신자, 반복되는 DSN, auto-submitted 헤더, 메일링 리스트 트래픽, 형식이 잘못된 리포트를 격리된 픽스처에서 테스트하세요.

제공업체 이벤트는 적용하기 전에 인증하기

제공업체가 웹훅으로 반송 이벤트를 전달한다면, 비즈니스 필드를 파싱하기 전에 정확한 요청에 대해 문서화된 서명 또는 인증 메커니즘을 검증하세요. 타임스탬프 최신성, 재전송 방지, 본문 크기 제한, 테넌트 상관 관계를 적용하세요. 성공을 반환하기 전에 인증된 이벤트를 저장하거나 큐에 넣고, 안정적인 제공업체 이벤트 식별자나 수신자와 시도를 합쳐 버리지 않는 보수적인 복합 키로 중복을 제거하세요. 이벤트는 지연되거나 순서가 바뀔 수 있으므로 발생 시각과 처리 시각을 따로 저장하세요. 발신 도메인, 계정, 워크스페이스, 메시지 식별자, 수신자 범위를 예상 테넌트와 연결할 수 없는 이벤트는 거부하세요. 웹훅 시크릿은 SMTP나 API 자격 증명과 별도로 교체하세요. 서명 실패, 중복률, 지연, 데드 레터, 알 수 없는 이벤트 유형을 모니터링하세요. 인증된 웹훅은 구성된 시크릿 기준으로 출처만 증명하며, 상관 관계 연결이 성공하기 전에는 이벤트가 올바른 내부 작업에 매핑되었다는 것을 증명하지 않습니다.

추측한 문구가 아니라 상태 계열로 진단하기

확장 상태의 주제부터 확인하세요. 주소 상태, 메일함 상태, 메일 시스템 상태, 네트워크 또는 라우팅 상태, 메일 전달 프로토콜 상태, 메시지 내용 또는 미디어 상태, 보안 및 정책 상태가 있습니다. 그런 다음 세부 코드와 전체 진단을 현재 수신자 또는 제공업체 문서와 함께 사용하세요. 주소 실패는 수신자 구문과 도메인 DNS를, 메일함 실패는 메일함 존재 여부와 용량 초과 증거를, 전송 실패는 MX, 라우팅, TLS, 네트워크 증거를, 메시지 실패는 크기, MIME, 인코딩, 내용을, 보안 실패는 SPF, DKIM, DMARC, 자격 증명, 발신자 정책, 평판을 확인하세요. 통제된 재테스트에서는 한 번에 하나의 변수만 바꾸세요. 영구적인 정책 결정을 회피하려고 IP, 도메인, 제공업체를 바꾸지 마세요. 원래 응답을 보존하고, 관찰된 원인을 바로잡지 않은 채 발신자 권한을 넓히거나 인증을 약화하는 구성 변경은 롤백하세요.

수신자 데이터를 노출하지 않고 반송 상태 측정하기

개인정보를 보호하는 코호트별로 첫 시도 접수, 일시 지연, 영구 실패, 재시도 후 복구, 알 수 없는 결과, 스팸 신고, 발송 제외, 큐 보관 기간을 추적하세요. 유용한 차원에는 발신 도메인, 승인된 집계 수준의 수신 도메인, 메시지 유형, 템플릿 리비전, 제공업체, 상태 계열, 시간이 있습니다. 일상적인 분석에 전체 주소, 메시지 내용, 진단 덩어리, 원본 헤더를 넣지 마세요. 잘못된 수신자 비율을 정책, 인증, 콘텐츠, 평판, 일시적 인프라 실패와 분리하세요. 하나의 반송률은 조치 가능한 원인을 가립니다. 분모는 수신자 시도를 기준으로 하고, 늦게 도착한 이벤트는 원래 코호트 기준으로 보고하세요. 알림은 모든 경우에 통하는 하나의 비율이 아니라 과거 기준선과 비즈니스 위험에서 설정하세요. 발송 제외 적용과 수동 재정의를 감사하세요. 운영, 보안, 법적 의무, 분쟁에 필요한 증거만 보관한 뒤 삭제하거나 집계하세요. 낮은 반송률이 수신 동의, 참여, 받은편지함 도달을 증명하지는 않습니다.

SendHQ의 활용 방식

SendHQ는 전달 및 반송 추적과 발송 제외를 문서화합니다. 지원되는 동작은 최신 문서를 참고하세요.

자주 묻는 질문

이메일 반송이란 무엇인가요?

SMTP 수신자 또는 이후의 전달 시도가 실패하거나 지연되었음을 보여 주는 증거이며, SMTP 중에, DSN으로, 또는 제공업체 이벤트로 보고됩니다.

4xx 반송과 5xx 반송은 무엇이 다른가요?

4xx 응답은 일시적이며 상한이 있는 재시도가 정당할 수 있습니다. 5xx 응답은 해당 시도에서 영구적이며 보통 수정이나 발송 제외 처리가 필요합니다.

반송된 모든 주소를 발송 제외 처리해야 하나요?

아니요. 확정된 영구 수신자 실패만 발송 제외 처리하세요. 발신자 인증, 콘텐츠, 평판, 할당량, 일시적 인프라 실패에는 범위가 다른 해결책이 필요합니다. 관찰된 원인과 수신자 범위에 맞는 해결책을 적용하세요.

메시지 하나가 일부만 반송될 수 있나요?

네. SMTP는 일부 수신자를 수락하고 다른 수신자를 거부할 수 있으며, 나중에 오는 DSN은 수신자마다 다른 결과를 보고할 수 있습니다. 수신자 단위로 상태를 저장하세요.

일시적인 반송은 어떻게 재시도해야 하나요?

동일한 지속형 논리 작업을 사용하고, 지수 백오프, 지터, 시도 횟수와 큐 보관 기간의 상한, 매 시도 전 새로운 발송 제외 확인을 적용하세요.

SMTP 250 응답이 나중의 반송을 막아 주나요?

아니요. 서버는 책임을 넘겨받은 뒤에 미전달 증거를 생성할 수 있습니다. 수신 서버의 수락은 받은편지함 도달이나 사람의 참여도 보장하지 않습니다.

반송 메시지는 왜 널 리버스 경로를 사용해야 하나요?

널 리버스 경로를 사용하면 DSN을 전달하다 발생한 실패가 또 다른 DSN을 만들지 않으므로 반송 루프와 증폭을 방지할 수 있습니다.

SendHQ가 반송을 처리하나요?

네. SendHQ는 전달 및 반송 추적과 발송 제외를 문서화합니다.

출처