rein's world

TIL: email 테스트하기

최근에 가계부 자동화 한다고 용쓰는 중인데, 그러다보니 이메일로 온 결제 내역을 테스트할 일이 생겼다. 네이버 페이 결제를 하면 내역을 이메일로 받을 수 있는데, 해당 메일을 받으면 내가 만든 API에 쏴주는 iOS 자동화1를 만드는 게 그것. 이걸 보내는 부분이 내 기대처럼 동작 안해서, 그리고 이메일 내용을 뽑아내는 부분이 블랙박스라 결국 수동으로 테스트하게 되었다. 그렇다고 테스트할 때 마다 뭘 살 수는 없고, 이미 받은 메일을 다시 보낼 방법이 없을까 찾게 되었다.

원본 메일 추출하기

네이버 페이 결제 내역을 Gmail로 받고 있어서, 이건 “원본 보기” 빠른 메뉴로 확인할 수 있다. 이걸 복사하고 파일에 저장하자. (.eml 확장자 추천)

Gmail 원본 이메일 보기 예시

이메일 헤더 수정하기

이걸 바로 보낼 순 없고, 일부 헤더를 수정해야 한다. 여기 헤더들과 보낸 메일 서버를 Gmail이나 다른 메일 서비스가 확인하기 때문에, 이 과정이 필요하다.

  • 지워야 할 항목: naver.com 도메인에서 다시 보내는게 아니기 때문에, 일부 항목을 지워야 한다.

    • Delivered-To
    • Received
    • X-Google-Smtp-Source
    • Arc-* (Arc-Seal, Arc-Message-Signature, … 등등)
    • Return-Path
    • Received-SPF
    • Authentication-Results
    • DKIM-Signature
    • Date
  • 수정해야 할 항목:

    • From: "네이버 페이" <...> 대신에 발송할 서버의 [email protected]로 수정
    • To: 테스트 메일을 받을 이메일 주소로 변경
    • Message-ID 값항상 고유값으로 설정한다. 네이버 페이는 여기에 navercorp.com 도메인을 쓰는데, 이건 없어도 무방하다. 고유값을 사용하기만 하면 된다. 같은 값에 대해선 iOS 자동화가 반응하지 않는다. 그래서 iOS 자동화 테스트에 쓴다면 보낼 때마다 새 값으로 바꿔줘야 한다.

… 나머지 부분은 그대로 남겨둬도 된다. 이걸 test.eml 같은 파일로 저장한다.

메일 서버 준비

스팸 메일이 너무 많기 때문에, 몇 가지 DNS 레코드를 설정해야 한다.

  • 보낼 서버에서 사용하는 도메인에 대해서, TXT 레코드에 spf를 지정한다. TXT "v=spf1 ip4:203.0.113.5 ~all" 하는 식으로 해당 서버의 IP를 추가해준다.
  • 보낼 서버가 사용하는 도메인에 대해서 PTR 레코드를 설정한다. (reverse DNS lookup이 가능하게) 예를 들어 203.0.113.5.in-addr.arpa 에 대해서 example.com 이 나올 수 있게 한다. PTR 레코드는 해당 IP를 _가지고 있는 쪽_에서만 할 수 있다. 예를 들어 AWS를 쓴다면 Amazon에서만 설정할 수 있는 식. 사용하는 서비스의 설정 방법을 찾아서 진행하면 된다.2

이 두 가지 혹은 그 대체제들 – 예를 들어 SPF대신 DKIM 서명 – 을 쓰지 않으면 많은 경우 받는 쪽에서 이를 거부한다. 다행히도 Gmail은 왜 거부하는지는 보여줘서 설정 안된거 찾아서 고쳐가면서 했다.

실제로 메일 전송하기

swaks -f [email protected] -t [email protected] -d test.eml

swaks3 써서 발신자, 수신자, 그리고 위에서 만든 파일을 인자로 주고 메일을 전송한다. 이제 메일함에 도착했으면 성공. 사실 이게 다 갖추어져도 Gmail이 스팸으로 인식할 때가 있더라. 스팸 해제해주면 해결…


  1. iOS 자동화 혹은 iOS Automation. iOS 단축어 (iOS shortcut) 앱에서 제공하는데, 일반적인 단축어랑 달리, 특정 조건 – 메시지나 이메일을 받거나, 특정 위치에 가면 – 에 대해서 사용자 동의 없이도 동작하게 할 수 있다. ↩︎

  2. DigitalOcean은 droplet 이름에 FQDN을 주면 자동으로 PTR 레코드를 만들어주더라↩︎

  3. sendmail이나 postfix를 설치하지 않고도 smtp를 통해서 이메일을 발송하게 해주는 CLI 도구. Swaks ↩︎