TL;DR

  • Outis는 받은 이메일에 가짜 ‘사용자 없음’ 반송 메일을 보내 발신자가 주소가 존재하지 않는다고 믿게 하는 도구임.
  • 반송 메일은 RFC 3464 배달 상태 알림 형식이며, 원본 메일과 5.1.1 상태를 포함함.
  • 이미 수락된 메일을 사후에 반송하므로 실제 SMTP 550 거부와 달리 전달 기록은 성공으로 남고, 효과는 알림을 처리하는 해당 발신자에게만 미침.
  • 반송 메일의 신뢰성을 위해서는 직접 관리하는 도메인의 SMTP 계정이 필요하며, 소비자용 이메일 제공업체는 발신자 정보를 다시 써서 사용자를 드러낼 수 있음.
  • Outis는 여러 파일과 디렉터리의 일괄 처리, 여러 도메인 계정 매칭, Amazon SES 등 공유 억제 목록 제공업체 대응을 지원함.

Outis

  • Outis는 스팸 발신자에게 받은 이메일의 가짜 ‘사용자 없음’ 반송 메일을 보내 주소가 존재하지 않는다고 믿게 하며, 회신을 예상할 수 있는 최근 AI 생성 자동 이메일 추세에 대응해 발신자 목록에서 주소를 제거하는 데 도움을 줌.
  • Outis(Οὖτις)는 그리스어로 ‘아무도 없음’을 뜻함. 『오디세이』에서 오디세우스는 외눈박이 거인 폴리페모스에게 자신의 이름을 ‘아무도 없음’이라고 말하며, 눈이 먼 거인이 도움을 청하며 ‘아무도 나를 해치고 있다’고 외치자 다른 키클롭스들이 떠남. 이 도구도 사서함에 아무도 없다고 알리는 방식임.
  • 반송 메일은 RFC 3464 배달 상태 알림 형식이며, Postfix를 모델로 삼음.
  • 사람이 읽을 수 있는 부분, 상태가 5.1.1인 message/delivery-status 부분, message/rfc822로 첨부된 원본 메시지로 구성됨.
  • SMTP 서버가 허용하면 null envelope sender를 사용해 MAILER-DAEMON@<your domain>에서 원본 Return-Path로 전송됨.

알려진 제한 사항

  • 실제 SMTP 대화 중 발생하는 550 거부와 달리, 이 반송 메일은 메시지가 이미 수락된 뒤 전송됨.
  • 따라서 발신자 로그에는 전달 성공으로 표시되고, 재시도할 경우에도 사서함은 계속 작동하며, 효과는 알림을 받아 처리하는 단일 발신자에게만 미침.

요구 사항

  • 반송 메일이 신뢰를 얻으려면 직접 관리하는 도메인에서 발송해야 함.
  • 가능하면 MAILER-DAEMON@... 발신을 허용하는 해당 도메인의 SMTP 계정을 사용해야 함.
  • Gmail, iCloud 같은 소비자용 제공업체는 From 헤더를 다시 작성해 사용자를 드러낼 수 있음.

사용 방법

  • go build -o outis cmd/outis/main.go로 outis 실행 파일을 빌드함.
  • ./outis init [domain]으로 계정을 추가하거나 갱신하며, 비밀번호는 운영체제 키체인에 저장함.
  • ./outis accounts로 계정 목록을 확인함.
  • ./outis message.eml로 메시지를 미리 보고 확인한 뒤 처리함.
  • ./outis -c로 클립보드에서 이메일을 읽음.
  • ./outis -n message.eml로 실제 전송 없이 결과만 출력함.
  • ./outis -y -r me@example.com message.eml로 확인을 생략하고 지정된 수신자를 사용함.
  • ./outis -a example.com -c로 수신자에 따른 계정 매칭 대신 지정 계정을 강제함.
  • ./outis inbox/로 디렉터리의 모든 파일을 처리하며, 일괄 작업 전체에 대해 한 번 확인함.
  • ./outis -n -o out/ inbox/로 실제 전송 없이 각 반송 메일을 out/<name>.bounce.eml에 기록함.
  • ./outis -d inbox/로 반송 메일 전송 후 각 파일을 삭제함.

일괄 처리 모드

  • 인수에는 파일과 디렉터리를 함께 지정할 수 있음.
  • 디렉터리는 재귀 탐색 없이 확장자에 관계없이 표시되는 일반 파일로 확장됨.
  • 각 파일은 개별적으로 계정에 매칭됨. 파싱할 수 없거나 계정에 매칭되지 않는 파일은 오류로 보고하고 건너뛰며, 나머지 파일은 계속 처리됨.
  • 파일 중 하나라도 실패하면 종료 코드가 0이 아닌 값으로 설정됨.
  • 입력이 두 개 이상이면 전체 미리보기 대신 파일별 요약 한 줄을 표시하고, 마지막에 한 번 확인을 요청함.

여러 계정

  • 각 계정은 하나의 도메인을 담당함.
  • 원본 이메일의 수신자(Delivered-To, To 또는 Cc)와 도메인이 일치하는 계정으로 반송 메일을 구성하므로 발신자, 메일 호스트, SMTP 서버가 모두 해당 도메인에 속함.
  • 일치하는 계정이 없거나 둘 이상이면 --account를 사용해야 함.
  • 설정은 계정마다 도메인, 메일 전송 에이전트(MTA) 호스트, SMTP 호스트·포트·사용자 이름을 지정하는 구조임. 예시에는 example.com과 other.org 계정이 각각 포함되며, SMTP 포트는 각각 587과 465임.

공유 억제 목록을 사용하는 제공업체

  • Amazon SES를 비롯한 일부 제공업체는 모든 고객이 공유하는 억제 목록을 유지함. 이 경우 한 번의 하드 반송만으로도 모든 SES 발신자가 한동안 해당 주소에 메일을 보낼 수 없게 됨.
  • reply_to_from_domains에 등록된 Return-Path 도메인에는 From 헤더의 주소로 반송 메일을 보냄.
  • 기본값은 amazonses.com이며 하위 도메인도 일치함. []로 설정하면 이 동작을 비활성화함.

설정

  • 계정의 envelope_from을 설정하면 null 발신자, MAILER-DAEMON@domain, 사용자 이름 순으로 시도하는 대신 지정한 SMTP envelope sender를 사용함.
  • 설정 파일은 os.UserConfigDir()/outis/config.toml에 저장됨. macOS 경로는 ~/Library/Application Support/outis, Linux 경로는 ~/.config/outis임.
  • OUTIS_CONFIG 환경 변수로 설정 파일 경로를 재정의함.