Cloudflare 이메일 라우팅 주소로 Gmail에서 답장하기

개인 프로젝트 사이트에 contact@도메인 주소를 만들어 두었다. Cloudflare 이메일 라우팅(Email Routing)으로 받은 메일을 개인 Gmail로 넘기는 구성이다.
어느 날 그 주소로 첫 문의 메일이 왔고, 답장도 contact@ 주소에서 보내고 싶었다.
Gmail에서 그냥 답장하면 개인 Gmail 주소가 상대에게 보인다. 알아보니 이메일 라우팅은 받은 메일을 넘겨주기만 하고 보내는 기능은 없었다.
이 글은 같은 주소로 답장까지 보내도록 설정한 과정이다.
현재 DNS 레코드 상태
DNS를 직접 조회해 현재 레코드를 확인했다.
| 레코드 | 값 | 의미 |
|---|---|---|
| MX | Cloudflare 3개 | 받는 메일은 Cloudflare가 받는다 |
| SPF | v=spf1 include:_spf.mx.cloudflare.net ~all | Cloudflare만 발신 서버로 허용 |
| DMARC | p=none | 인증에 실패해도 거부나 격리를 요청하지 않는다 |
SPF는 이 도메인 명의로 보낼 수 있는 서버 목록이다. DKIM은 메일에 붙이는 도메인 전자 서명이고, DMARC는 인증에 실패한 메일을 받는 쪽이 어떻게 처리할지 정한 정책이다.
받는 경로는 갖춰져 있었고, 없는 것은 보내는 서버(SMTP)였다. 보내는 서버를 하나 정해 Gmail의 "다른 주소에서 메일 보내기"에 등록하면 된다.
보내는 서버 고르기
후보는 세 가지였다.
| 선택지 | 비용 | 장점 | 단점 |
|---|---|---|---|
| Cloudflare 이메일 보내기(Email Sending) | Workers 유료 요금제(월 5달러), 월 3,000통 포함 | DNS·수신·발신을 한곳에서 관리, DKIM 자동 | 베타. 무료 요금제는 계정에 인증한 주소로만 보낼 수 있다 |
| Resend | 무료(하루 100통, 월 3,000통) | 무료, SMTP 중계 제공 | 무료는 도메인 3개까지 |
| Gmail SMTP + 앱 비밀번호 | 무료 | 가입할 곳이 없다 | 서명이 gmail.com으로 붙어 도메인 인증과 맞지 않는다 |
비용은 2026년 10월 기준이다.
세 번째인 Gmail SMTP는 받는 쪽에서 스팸으로 분류되거나 "gmail.com을 통해 보냄"이 붙을 수 있어 바로 뺐다.
남은 둘 중에서는 앞으로의 계획을 기준으로 골랐다. 사이트를 여러 개 운영할 생각이었고, Resend 무료 요금제는 도메인 3개에서 막힌다.
Cloudflare는 계정 단위로 요금이 붙어서, 월 5달러 하나로 같은 계정의 모든 도메인이 발송량을 함께 쓴다. 그래서 Cloudflare 이메일 보내기로 정했다.
이 구성에서 답장은 Gmail에서 Cloudflare 이메일 보내기를 거쳐 나간다.
활성화할 때 바뀌는 DNS 레코드
대시보드 메뉴는 컴퓨트 → 이메일 서비스 → 이메일 보내기(베타)에 있었다. 활성화 버튼을 누르기 전에 바뀌는 레코드를 확인했다.
| 구분 | 이름 | 영향 |
|---|---|---|
| 추가 | cf-bounce 하위 도메인 MX 3개 | 반송 메일 처리용. 기존 수신 MX와 이름이 달라 영향 없음 |
| 추가 | cf-bounce 하위 도메인 SPF | 하위 이름이라 기존 SPF와 충돌 없음 |
| 추가 | cf-bounce._domainkey DKIM 공개키 | 도메인 서명용 |
| 변경 예정 | _dmarc | p=none → p=reject |
마지막 줄의 DMARC 변경이 신경 쓰였다. reject로 올리면, 인증 서명이 없는 이 도메인 명의 메일은 받는 쪽에서 거부된다. 누군가 contact@ 주소를 사칭해 보내는 메일은 막힌다. 대신 나중에 다른 서비스로 이 도메인 명의 메일을 보내려면, 그 서비스도 SPF·DKIM을 맞춰야 한다.
그런데 활성화한 뒤 다시 조회해 보니 DMARC는 p=none 그대로였다. Cloudflare가 기존 레코드를 덮어쓰지 않은 것으로 보인다. 정책 값과 상관없이 서명이 맞으면 인증은 통과한다.
API 토큰과 Gmail 설정
SMTP 비밀번호로는 Cloudflare API 토큰을 쓴다. 권한은 계정(Account) → Email Sending → Edit 하나만 줬다.
이 토큰은 Gmail 설정에만 쓰이니, 새어 나가도 메일 발송 말고는 할 수 있는 게 없어야 한다. 다만 이 권한은 계정 단위다. 토큰이 새어 나가면 같은 계정의 모든 도메인 명의로 메일을 보낼 수 있다는 점은 기억해 둔다.
Gmail에서는 보내는 주소를 하나 더 추가하고 SMTP 정보를 넣는다.
-
설정 → 계정 및 가져오기 → 다른 주소에서 메일 보내기 → 다른 이메일 주소 추가
-
이메일에
contact@도메인을 넣는다. -
SMTP 정보를 넣는다.
SMTP 서버: smtp.mx.cloudflare.net 포트: 465 (SSL) 사용자 이름: api_token ← 이 글자 그대로 비밀번호: 방금 만든 API 토큰 -
Gmail이
contact@로 확인 메일을 보낸다. 이 메일은 라우팅을 거쳐 다시 Gmail로 들어오니 거기서 확인한다. -
"메일에 답장할 때"를 "메일을 받은 주소에서 답장"으로 바꾼다.
마지막 설정 덕분에 사이트가 늘어나도 따로 신경 쓸 게 없다. contact@사이트A로 온 메일에는 그 주소로, contact@사이트B로 온 메일에는 그 주소로 자동으로 답장이 나간다.
아직 확인하지 않은 것
받는 쪽에서 SPF, DKIM, DMARC가 실제로 통과하는지는 이 글을 쓰는 시점에 아직 확인하지 못했다. 다른 계정으로 답장을 받아 메일 원본 보기에서 인증 결과를 확인할 계획이다. DMARC를 reject로 올리는 건 그다음이다.
사이트를 하나 더 만들 때
새 도메인마다 할 일은 정해져 있다.
- 도메인을 Cloudflare DNS에 연결한다.
- 이메일 라우팅을 켜서 Gmail로 전달한다.
- 이메일 보내기에 도메인을 등록하고 DNS 레코드를 추가한다.
- Gmail에 새 주소를 추가한다. SMTP 서버와 토큰은 같은 걸 쓴다.
정리
- Cloudflare 이메일 라우팅은 수신 전달만 한다. 답장을 같은 주소로 보내려면 발신 서버가 따로 필요하다.
- Gmail SMTP로 보내면 도메인 인증과 맞지 않는다. 도메인으로 서명해 주는 발신 서버를 쓰는 게 맞다.
- 활성화 버튼이 DNS를 바꾸기 전에, 바뀌는 레코드와 기존 값을 먼저 적어 둔다. 되돌릴 일이 생겼을 때 이 기록이 원복 절차가 된다.
- DMARC reject는 사칭을 막지만, 받는 쪽에서 인증 통과를 확인한 뒤에 올린다. 이 글을 쓰는 시점에는 아직 그 확인 전이다.