Cloudflare용 Yuva Email Worker
Cloudflare를 통한 지원 이메일.운영할 메일 서버가 없습니다.
Cloudflare® Email Routing이 지원 주소로 오는 메일을 받고, 오픈 소스 Yuva Email Worker가 각 메시지에 서명하여 Yuva에 전달합니다. 메시지는 공유 받은 편지함에 팀이 답하는 대화로 도착합니다.
소개
앞단의 Email Routing
Cloudflare Email Routing이 도메인의 MX가 되어 메일을 받습니다. Yuva는 SMTP를 수신하지 않으므로 설치하거나 패치할 메일 서버가 없습니다.
작은 오픈 소스 Worker
Yuva Email Worker는 원본 메시지와 봉투를 읽고, 요청에 서명한 뒤 Yuva로 POST합니다. 파싱, 스레드 구성, 스팸 판단은 서버에서 처리됩니다.
진짜 대화
지원 주소로 온 메일은 받은 편지함에서 대화를 열거나 이어 가고, 팀은 채팅이나 앱 메시지와 같은 패널에서 답합니다.
고객의 메시지가 팀에 도착하기까지
- 1고객이 지원 주소 중 하나(예: support@example.com)로 메일을 보냅니다.
- 2Cloudflare Email Routing이 메시지를 받아 Yuva Email Worker로 전달합니다.
- 3Worker는 원본 메시지, 두 개의 봉투 주소, 타임스탬프를 Yuva와 공유하는 시크릿으로 HMAC-SHA256 서명하여 Yuva 서버의 /ingress/email로 보냅니다.
- 4Yuva는 메시지를 읽기 전에 서명과 타임스탬프가 5분 이내인지 확인합니다. 서명이 잘못된 요청은 거부됩니다.
- 5Yuva는 수신 주소의 이메일 채널을 찾아 In-Reply-To와 References로 메시지를 해당 대화에 이어 붙입니다. 그 밖의 경우에는 새 대화가 시작됩니다. 답장이 오면 대화가 다시 열립니다.
- 6팀은 패널에서 답합니다. 답장은 Amazon SES, Postmark, 자체 릴레이 같은 이메일 채널 자체의 SMTP 계정을 통해 같은 주소에서 같은 스레드로 발송됩니다. 답장은 Worker를 거치지 않습니다.
거부는 보낸 사람에게 전달됩니다
알 수 없는 주소, 차단된 발신자, 너무 큰 메시지처럼 Yuva가 메시지를 영구적으로 거부하면 Worker가 이를 거부하고, 보낸 사람은 Yuva의 사유와 함께 영구적인 SMTP 오류를 받습니다.
Yuva에 연결할 수 없는 경우
Yuva가 서버 오류로 응답하거나, 20초 안에 응답하지 않거나, 연결할 수 없는 경우, FALLBACK_FORWARD를 설정했다면 Worker가 메시지를 지정한 주소로 전달할 수 있습니다. 그 주소는 Email Routing에서 확인된 대상이어야 합니다. 이 경우 메시지는 일반 전달 메일로 도착하며 Yuva에는 나타나지 않습니다. FALLBACK_FORWARD가 없으면 전달이 오류와 함께 실패하고 보내는 서버가 나중에 다시 시도할 수 있습니다.
몇 단계로 설정하기
Yuva 서버와 도메인을 관리하는 Cloudflare 계정이 필요합니다.
- 1
Yuva에서 설정 → 해당 받은 편지함 → 채널 → 이메일을 열고 지원 주소를 추가하세요. 서버에 시크릿을 설정하고 다시 시작하세요.
YUVA_INGRESS_SECRET=<openssl rand -hex 32> YUVA_INGRESS_AUTHSERV_ID=mx.cloudflare.net
- 2
같은 시크릿으로 Cloudflare 계정에 Worker를 배포하세요.
cd edge bun install bunx wrangler login bunx wrangler secret put INGRESS_SECRET bunx wrangler deploy --var YUVA_URL:https://support.example.com
- 3
Cloudflare 대시보드에서 도메인 → Email → Email Routing을 열고 활성화하세요. Cloudflare가 MX와 SPF 레코드를 추가합니다.
- 4
Routing rules에서 각 지원 주소를 Worker yuva-edge로 보내세요. 캐치올 채널은 캐치올 규칙이 yuva-edge를 가리키게 하세요.
- 5
테스트 메시지를 보내고 패널에 대화가 나타나는 것을 확인하세요.
- 6
선택 사항: 배포 명령에 대체 주소를 추가하면 장애 중에도 메일을 보관할 수 있습니다.
bunx wrangler deploy --var YUVA_URL:https://support.example.com --var FALLBACK_FORWARD:you@example.org
Email Routing이 도메인의 MX가 되므로, 다른 메일 서버가 처리하지 않는 도메인이나 하위 도메인을 사용하세요.
설정 가이드 읽기 →Cloudflare에 종속되지 않음
Worker는 /ingress/email을 호출하는 한 가지 방법입니다. 어떤 메일 서버나 릴레이든 같은 서명 헤더로 원본 메시지를 POST할 수 있고, 명령으로 전달하는 메일 서버는 메시지를 yuva ingest-email에 파이프로 넘길 수 있습니다. 요청 형식은 Worker의 README에 문서화되어 있습니다.
질문과 답변
메일 서버를 직접 운영해야 하나요?
수신 메일용이 아닙니다. Yuva는 SMTP를 수신하지 않으며, 메일은 Cloudflare Email Routing이 받고 Worker가 전달합니다. 답장에는 Amazon SES, Postmark, 자체 릴레이 같은 이메일 채널용 SMTP 계정이 필요합니다.
Yuva가 중단되면 어떻게 되나요?
FALLBACK_FORWARD를 설정하면 메시지가 대신 그 주소로 전달됩니다. 설정하지 않으면 전달이 실패하고 보내는 서버가 다시 시도할 수 있습니다. 알 수 없는 주소로 온 메일처럼 Yuva가 의도적으로 거부한 메시지는 전달되지 않고 거부됩니다.
어떤 도메인과 주소를 사용할 수 있나요?
Cloudflare에서 관리하고 다른 서버가 메일을 처리하지 않는 모든 도메인을 쓸 수 있습니다. Email Routing이 그 도메인의 MX가 되기 때문입니다. 이메일 채널마다 주소가 하나씩 있으며, 어떤 채널과도 정확히 일치하지 않는 도메인의 모든 주소에는 캐치올 *@example.com을 쓸 수 있습니다. support+billing@example.com 같은 하위 주소는 support@example.com의 채널로 전달됩니다.
메시지는 얼마나 클 수 있나요?
첨부 파일을 포함해 메시지 하나는 최대 25 MiB까지 가능하며, 이는 Cloudflare Email Routing의 한도입니다. Yuva는 메시지당 최대 50개의 첨부 파일을 보관하며, 각 파일은 서버의 첨부 파일 크기 제한(기본 25 MiB)과 허용된 형식 이내여야 합니다. 나머지는 제외됩니다.
누군가 내 Yuva 서버로 가는 메일을 위조할 수 있나요?
Yuva는 유효한 HMAC 서명이 없거나 타임스탬프가 5분 넘게 어긋난 요청을 본문을 읽기 전에 거부합니다. 시크릿은 혼자만 간직하세요.
Yuva는 Cloudflare의 DMARC 결과를 사용하나요?
네, YUVA_INGRESS_AUTHSERV_ID를 mx.cloudflare.net으로 설정하면 됩니다. 그러면 Yuva가 Email Routing이 추가하는 DMARC 판정을 읽습니다. DMARC에 실패한 새 대화는 스팸으로 표시됩니다.
Cloudflare, Cloudflare 로고, Cloudflare Workers는 미국 및 기타 관할 지역에서 Cloudflare, Inc.의 상표 및/또는 등록 상표입니다. Yuva는 독립적인 오픈 소스 프로젝트이며 Cloudflare와 제휴하거나 Cloudflare의 승인을 받지 않았습니다.