원문 캡처 · github.com
원문 캡처 · github.com

OpenInbox는 Cloudflare 계정 안에 배포해 여러 도메인의 업무용 이메일을 운영하는 오픈소스 프로젝트다. 사용자·메일함·별칭·도메인 수에 따른 요금은 없지만, 베타 단계라 중요한 메일에 쓰기 전 여분의 도메인에서 시험해야 한다.

  • OpenInbox 저장소에서 Cloudflare에 배포할 수 있다. MIT 라이선스다.
  • 받는 메일은 발송 서비스 계정 없이도 사용할 수 있지만, 보내려면 Resend, Brevo, Mailjet 또는 SMTP 발송 제공자가 필요하다.
  • 무료 이용량은 Worker 요청 하루 10만 회, D1 저장 공간 500MB, 수신 메시지 25MB 등으로 제한된다.
  • 프로젝트는 활발히 개발 중이며 버그가 있을 수 있다. 제작자는 중요한 메일을 맡기기 전에 여러 도메인과 제공자에서 충분히 시험하라고 안내한다.

대상과 기능

OpenInbox는 개인 개발자가 여러 사이드 프로젝트에 you@yourproduct.com 주소를 만들거나, 소규모 팀이 support@, sales@, billing@ 같은 공동 주소를 운영할 때 쓸 수 있다. 여러 브랜드나 고객 도메인을 관리하는 프리랜서·에이전시, 오픈소스 프로젝트와 비영리단체, 가족 도메인 사용자, 직접 읽을 수 있는 코드와 계정 내 보관을 중시하는 사용자도 대상으로 한다. 일상적인 대화용이며 대량 발송이나 마케팅 발송 도구로 쓰도록 만든 것은 아니다.

Cloudflare Email Routing으로 도메인의 메일을 받아 Worker로 전달한다. Worker 하나가 웹 앱과 API, 수신 메일 처리, 예약 작업을 실행하고 D1 데이터베이스 하나가 메일함·메시지·사용자·설정을 저장한다. 발신은 Resend, Brevo, Mailjet 또는 SMTP를 이용하며, 한 제공자의 무료 한도에 도달하면 다른 제공자로 전환할 수 있다. 대용량 첨부파일 저장에는 선택 사항인 R2를 쓴다. OpenInbox를 운영하는 별도 서버는 없다.

기능에는 스레드, 전체 메일함, 검색(from:, has:attachment, before:), 라벨, 필터, 다시 알림, 예약 발송과 발송 취소가 포함된다. 명령 팔레트와 키보드 단축키, 다크 모드, 모바일 화면도 지원한다. 개인 및 공동 메일함을 만들 수 있고, 별칭·you+tag@ 주소·도메인 전체 수신 주소(catch-all)를 지원한다.

관리 화면은 트래픽, 무료 이용량, 전송 및 감사 로그를 보여준다. 도메인 상태를 확인하고 한 번의 클릭으로 복구할 수 있으며, SPF·DKIM·DMARC DNS 레코드를 자동으로 설정한다. HTML 메일은 정화한 뒤 격리하고, 원격 이미지는 허용하기 전까지 차단한다. SPF·DKIM·DMARC 검사에 실패한 메일은 스팸으로 분류한다. 선택 사항인 2단계 로그인과 저장 자격 증명 암호화도 제공한다.

배포와 설정

필요한 것은 무료 Cloudflare 계정과 Cloudflare 네임서버를 사용하는 도메인, GitHub 계정이다. 메일 발송 제공자의 무료 계정은 발송할 때만 필요하다. 수신은 발송 제공자 없이 작동한다.

Cloudflare 배포 버튼을 누른 뒤 Deploy를 선택한다. 배포 양식에는 추가 정보를 입력할 필요가 없으며 기본 이름을 유지하거나 바꿀 수 있다. 이후 Worker의 workers.dev 주소를 열고 설정 화면에서 Cloudflare API 토큰을 연결한다. 토큰 생성 링크는 필요한 권한을 미리 채운 Cloudflare 페이지를 연다. Continue to summary를 누르고 Create Token을 선택한 뒤 토큰을 설정 화면에 붙여넣는다. 토큰은 암호화해 저장된다.

Worker에 workers.dev 주소가 보이지 않으면 Worker의 Settings → Domains & Routes에서 이를 켠다. 토큰을 연결하면 복구 키가 생성되어 한 번만 표시된다. 비밀번호를 잊었을 때 소유자 계정에 다시 들어가는 유일한 방법이므로 비밀번호 관리자에 보관해야 한다. 이후 설정 화면이 토큰 권한을 검사하고 관리자 계정을 만들며 도메인을 연결한다. 마지막으로 Admin → Integrations에서 발송 제공자를 연결한다.

API 토큰 권한은 다음과 같다. 배포 안내의 토큰 생성 링크가 이 권한을 미리 입력한다.

  • 필수: Zone 읽기, DNS 편집, Zone Settings 편집(Email Routing 켜기), Email Routing Rules 편집, Workers Scripts 편집.
  • 권장: Account Settings 읽기.
  • 선택: Workers Routes 편집(mail.yourdomain에서 앱 운영), Analytics 읽기(전송 로그), Email Routing Addresses 편집(전달), Account Analytics 읽기(대시보드 이용량), Workers R2 Storage 편집(첨부파일 버킷).

무료 이용량과 주의 사항

  • Worker 요청: 계정당 하루 100,000회.
  • D1 저장 공간: 500MB, 대략 50,000~100,000개 메시지.
  • 수신 메시지 크기: 25MB.
  • 발송 한도: Resend 하루 100건, Brevo 하루 300건, Mailjet 하루 200건.

기본 설정에서는 메일을 텍스트만 저장하고 950KB 미만인 메시지의 첨부파일만 보관한다. 모든 첨부파일을 보관하려면 Admin → Integrations → Attachments에서 R2 저장소를 켠다. R2 무료 이용량은 10GB지만, Cloudflare는 계정에 결제 수단을 먼저 등록하도록 요구한다.

OpenInbox는 연락을 기대하는 사람과의 대화를 위한 도구다. 콜드 아웃리치, 대량 마케팅, 구매한 메일 목록, 스팸 자동화에 사용해서는 안 된다. Resend, Brevo, Mailjet 등 제공자는 엄격한 스팸 방지 및 허용 사용 정책을 둔다. 높은 반송률이나 신고율, 동의 없는 메일 발송, 여러 무료 계정을 만들어 일일 한도를 우회하는 행위는 발송 계정 정지나 영구 차단으로 이어질 수 있다. 도메인 평판을 해쳐 정상 메일까지 스팸함에 들어갈 수도 있다. Cloudflare Email Routing이나 Workers를 악용하면 기능 또는 계정 전체가 제한될 수 있다.

필요한 발송량이 무료 한도를 넘으면 무료 계정을 늘리는 대신 제공자의 유료 요금제로 옮겨야 한다. CAN-SPAM, GDPR, CASL 같은 스팸 방지 법률을 따르고, 수신에 동의한 사람에게만 보내며 수신 거부 요청을 처리해야 한다. 발송 메일에 대한 책임은 사용자에게 있으며, OpenInbox 유지 관리자는 계정 정지, 도메인 차단 또는 오용에 책임을 지지 않는다고 안내한다.

업데이트와 프로젝트 상태

업데이트하려면 GitHub 저장소 사본에서 Actions → Sync upstream → Run workflow를 실행한다. 이 작업은 매주 자동으로도 실행된다. Cloudflare가 자동으로 다시 배포하고 Worker가 데이터베이스 마이그레이션을 적용한다. 업데이트할 때 Deploy 버튼을 다시 누르면 기존 배포를 갱신하는 대신 별도의 인스턴스가 만들어진다.

메일을 받거나 보내지 못하면 Admin → Domains → Check health와 Admin → Mail flow를 확인한다. 소유자 계정에 잠겼다면 로그인 화면에서 Owner locked out?을 선택하고 소유자 이메일과 복구 키를 입력한다. 배포 양식에서 저장소 이름이 이미 존재한다는 오류가 나오면 이전 배포가 저장소를 만든 것이다. Project name을 바꾸거나 기존 인스턴스를 업데이트한다.

현재 로드맵에는 아직 제공되지 않거나 개발 중인 기능이 있다. 사용자별 API 키로 메일을 나열·읽기·검색·발송하는 REST API, Cloudflare Workers AI의 무료 일일 이용량을 사용해 답장 초안 작성·문장 다시 쓰기·축약·어조 변경·긴 스레드 요약을 지원하는 AI 메일 작성 기능, 수신 메일 웹훅이 계획 또는 진행 중이다.

OpenInbox는 초기 단계이며 활발히 개발 중이다. 다양한 도메인, 제공자, 메일 클라이언트와 Cloudflare 계정 설정에서 충분한 시험이 필요하다. 먼저 여분의 도메인에서 사용하고 복구 키를 안전하게 보관해야 한다. 문제가 생기면 GitHub 이슈를 열 수 있다. 프로젝트는 테스터, 버그 보고, 수정, 새 발송 제공자와 로드맵 기여를 받고 있다.

개발 참여

기여자는 먼저 버그를 보고하거나 큰 변경을 논의하는 이슈를 열고, 저장소를 포크해 개발 환경을 설정한다. 풀 리퀘스트를 열기 전에 다음 명령을 실행한다.

npm run lint && npm run typecheck && npm test && npm run test:e2e

개발 환경을 시작하는 명령은 다음과 같다.

npm ci
# create .dev.vars with the lines below
npm run db:migrate:local
npm run dev:mock # terminal 1: mock Cloudflare and provider APIs on :8790
npm run dev # terminal 2: app on http://localhost:5173

로컬 .dev.vars에는 실제 자격 증명을 넣지 않는다.

ENCRYPTION_KEY=any-long-random-string-for-local-use
CF_API_TOKEN=dev-token
CF_API_BASE=http://127.0.0.1:8790/cf
RESEND_API_BASE=http://127.0.0.1:8790/resend
BREVO_API_BASE=http://127.0.0.1:8790/brevo
MAILJET_API_BASE=http://127.0.0.1:8790/mailjet
GITHUB_API_BASE=http://127.0.0.1:8790/github
WORKER_NAME=openinbox

보안 문제는 공개 이슈가 아니라 GitHub의 Security → Report a vulnerability를 통해 비공개로 신고한다. 라이선스는 MIT다. 발송 제공자 추가는 src/worker/providers/의 어댑터를 통해 기여할 수 있다.