Azure DNS와 Zoho Mail로 도메인 이메일 만들기
개인 도메인에 공식 연락처 메일을 붙이면서 Azure DNS, Zoho Mail, MX, SPF, DKIM, DMARC를 Terraform 관점으로 정리한 구축 기록입니다.
개인 프로젝트나 작은 서비스라도 공개 웹사이트를 운영하다 보면 개인 메일보다 도메인 기반 이메일이 필요해지는 순간이 온다. 정정 요청, 개인정보 문의, 광고 문의, 제휴 문의를 받기 시작하면 contact@... 형태의 주소가 훨씬 자연스럽다.
이번 작업은 hwmoon.com 도메인에 Zoho Mail을 연결하고, DNS 레코드는 Azure DNS와 Terraform으로 관리하는 방식으로 진행했다. 목표는 메일을 “받고 보내는 것”에서 끝내지 않고, SPF, DKIM, DMARC까지 기본 인증 흐름을 정리하는 것이었다.
목표 구성
최종 구성은 아래와 같다.
| 항목 | 선택 |
|---|---|
| 도메인 | 루트 도메인 |
| 메일 서비스 | Zoho Mail Lite |
| DNS | Azure DNS |
| 공개 메일 주소 | contact 계정 |
| 메일 수신 | Zoho MX |
| 발신 인증 | SPF, DKIM, DMARC |
| DNS 관리 | Terraform |
이 구조의 핵심은 웹사이트 주소와 이메일 도메인을 분리해서 생각하는 것이다. 웹사이트는 news, tech 같은 서브도메인을 쓸 수 있지만, 메일 주소는 보통 루트 도메인 기준으로 운영한다.
왜 Zoho Mail을 선택했나
Google Workspace는 익숙하고 안정적이지만, 작은 사이트의 공식 문의 주소 하나만 필요할 때는 비용이 무겁게 느껴질 수 있다. Zoho Mail Lite는 1개 메일박스로 시작하기 쉽고, 필요하면 저장공간과 사용자 수를 늘릴 수 있다.
운영 관점에서는 협업 기능보다 아래 조건이 더 중요했다.
- 도메인 메일 주소를 만들 수 있을 것
- MX, SPF, DKIM, DMARC를 설정할 수 있을 것
- 과한 월 비용 없이 시작할 수 있을 것
- 나중에 다른 메일 서비스로 이전할 수 있을 것
1. Zoho Mail에서 기존 도메인 추가
Zoho Mail 가입 후 새 도메인을 구매하지 않고 기존 도메인 추가를 선택한다. 이때 입력하는 값은 www나 서비스 서브도메인이 아니라 루트 도메인이다.
example.com
예를 들어 contact@example.com을 만들고 싶다면 메일 도메인은 example.com이어야 한다. www.example.com은 웹사이트 호스트로는 쓸 수 있지만, 이메일 도메인으로는 보통 사용하지 않는다.
2. 도메인 소유권 검증 TXT 추가
Zoho는 도메인 소유권을 확인하기 위해 TXT 레코드를 요구한다. 형태는 아래와 비슷하다.
Host: @
TXT: zoho-verification=example.zmverify.zoho.com
Azure DNS에서는 루트 도메인 레코드를 @로 관리한다. 같은 @ TXT record set에 Google Search Console 검증값, Zoho 검증값, SPF 값을 함께 넣을 수 있다.
Terraform으로는 아래처럼 관리할 수 있다.
txt_records = {
"@" = {
ttl = 300
records = [
"google-site-verification=REPLACE_WITH_VALUE",
"zoho-verification=REPLACE_WITH_VALUE",
"v=spf1 include:zohomail.com ~all"
]
}
}
확인은 dig로 한다.
dig TXT example.com @8.8.8.8 +short
dig TXT example.com @1.1.1.1 +short
Zoho verification 값이 보이면 Zoho 화면에서 TXT 레코드 확인을 누른다.
3. 메일 사용자 생성
도메인 검증이 끝나면 Zoho에서 메일 사용자를 만들 수 있다. 공개 연락처 용도라면 contact 같은 계정이 무난하다.
contact@example.com
Zoho 화면에서 입력칸 오른쪽에 @example.com이 이미 붙어 있다면, 입력칸에는 contact만 넣으면 된다.
4. MX 레코드 설정
메일을 받으려면 MX 레코드가 필요하다. Zoho Mail의 기본 MX는 아래 형태다.
10 mx.zoho.com
20 mx2.zoho.com
50 mx3.zoho.com
Terraform 모듈에서는 MX record set을 아래처럼 표현했다.
mx_records = {
"@" = {
ttl = 300
records = [
{
preference = 10
exchange = "mx.zoho.com"
},
{
preference = 20
exchange = "mx2.zoho.com"
},
{
preference = 50
exchange = "mx3.zoho.com"
}
]
}
}
확인은 dig MX로 한다.
dig MX example.com @8.8.8.8 +short
dig MX example.com @1.1.1.1 +short
결과가 아래처럼 나오면 수신 경로는 잡힌 것이다.
10 mx.zoho.com.
20 mx2.zoho.com.
50 mx3.zoho.com.
5. SPF 설정
SPF는 이 도메인의 메일을 어떤 서버가 보낼 수 있는지 선언하는 레코드다. Zoho Mail의 기본 SPF 값은 아래 형태다.
v=spf1 include:zohomail.com ~all
메일을 Zoho에서 Gmail로 보낸 뒤 Gmail의 원본 보기를 확인하면 다음과 같은 결과가 보여야 한다.
Received-SPF: pass
SPF가 실패하면 수신 서버는 메일을 스팸으로 판단할 가능성이 커진다.
6. DKIM 설정
DKIM은 발신 메일에 암호화 서명을 붙여서, 메일이 실제 도메인에서 발송됐는지 검증하는 방식이다.
Zoho는 DKIM용 TXT 레코드를 제공한다. 호스트는 보통 아래 형태다.
zmail._domainkey
값은 긴 공개키다.
v=DKIM1; k=rsa; p=REPLACE_WITH_PUBLIC_KEY
Terraform 예시는 아래처럼 관리한다.
txt_records = {
"zmail._domainkey" = {
ttl = 300
records = [
"v=DKIM1; k=rsa; p=REPLACE_WITH_PUBLIC_KEY"
]
}
}
확인은 아래 명령으로 한다.
dig TXT zmail._domainkey.example.com @8.8.8.8 +short
DNS에 DKIM 값이 보인 뒤에도 Zoho Admin 화면에서 DKIM을 Verify 또는 Enable 해야 실제 발신 메일에 DKIM-Signature 헤더가 붙는다.
7. DMARC 설정
DMARC는 SPF와 DKIM 결과를 기준으로 수신 서버가 메일을 어떻게 처리할지 알려주는 정책이다. 처음부터 reject로 강하게 걸기보다, 처음에는 모니터링 모드로 시작하는 것이 안전하다.
Host: _dmarc
TXT: v=DMARC1; p=none; rua=mailto:contact@example.com
Terraform 예시는 아래와 같다.
txt_records = {
"_dmarc" = {
ttl = 300
records = [
"v=DMARC1; p=none; rua=mailto:contact@example.com"
]
}
}
확인은 아래처럼 한다.
dig TXT _dmarc.example.com @8.8.8.8 +short
dig TXT _dmarc.example.com @1.1.1.1 +short
운영이 안정되면 p=quarantine, 더 확신이 생기면 p=reject로 강화할 수 있다.
8. 테스트 순서
DNS 설정 후에는 실제 메일을 주고받아야 한다.
- Gmail에서 도메인 메일 주소로 메일을 보낸다.
- Zoho Mail에서 Gmail로 답장한다.
- Gmail에서 수신한 메일의
원본 보기를 연다. - SPF, DKIM, DMARC 결과를 확인한다.
확인할 항목은 아래와 같다.
SPF: PASS
DKIM: PASS
DMARC: PASS
DKIM이 보이지 않는다면 DNS 값은 있어도 Zoho Admin에서 DKIM 활성화가 끝나지 않았을 가능성이 있다.
운영하면서 배운 점
첫째, 이메일 도메인은 www나 서비스 서브도메인이 아니라 루트 도메인을 기준으로 생각해야 한다. 공개 메일 주소를 만들려면 루트 도메인을 검증하는 편이 자연스럽다.
둘째, DNS 레코드는 가능하면 Terraform으로 관리하는 것이 좋다. 웹사이트용 A/CNAME, Search Console TXT, Zoho verification, MX, SPF, DKIM, DMARC가 한 곳에 모이면 나중에 추적하기 쉽다.
셋째, SPF가 통과한다고 해서 모든 설정이 끝난 것은 아니다. 발신 신뢰도를 생각하면 DKIM과 DMARC까지 확인해야 한다.
최종 체크리스트
- Zoho Mail Lite 가입
- 루트 도메인 추가
- Zoho verification TXT 추가
- 문의용 사용자 생성
- MX 레코드 추가
- SPF 레코드 추가
- DKIM 레코드 추가
- DMARC 레코드 추가
- 외부 메일 수신 테스트
- 외부 메일 발신 테스트
- DKIM 서명 헤더 최종 확인
- DMARC 정책을
none에서quarantine또는reject로 단계적 강화 검토
마무리
메일 하나 만드는 작업처럼 보이지만, 실제로는 사이트 운영의 기본 신뢰 인프라를 만드는 일에 가깝다. 공식 연락처, 광고 심사, 검색 도구 검증, 개인정보 문의까지 생각하면 도메인 이메일은 작은 사이트가 “운영 가능한 서비스”처럼 보이게 만드는 첫 번째 기반이다.