본문으로 건너뛰기
effidevFlutter · Cloudflare 엣지 · 클라우드 비용 최적화
한국어

Cloudflare Email Workers & Edge Processing: SendGrid/Mailgun 대체하는 $0 이메일 수발신 및 파싱 자동화 가이드

Cloudflare Email Workers and Edge Processing architecture guide

비싼 이메일 SaaS의 한계: 수신 파싱 과금 폭탄

스타트업이나 SaaS 서비스를 운영할 때 고객 문의([email protected]), 회원 가입 수신 알림, 자동화 티켓 발행 시스템을 구축하려면 SendGrid, Mailgun, Postmark, AWS SES 같은 외부 이메일 API 서비스를 구독한다.

하지만 기존 이메일 SaaS 플랫폼들은 두 가지 치명적인 결점을 갖고 있다.

  1. 인바운드 수신(Inbound Webhook) 과금 폭탄: 이메일을 보낼 때뿐만 아니라 수신된 이메일을 웹훅으로 파싱할 때도 수신 건수당 과금된다. 악성 스팸 메일이 수천 건 들어오면 아무런 가치도 없는 스팸 이메일 파싱 비용으로 월 $100~$300 이상의 비용이 지불된다.
  2. 복잡한 서버 인프라 필요성: 이메일 수신 웹훅을 받기 위해 Node.js/Python 백엔드 서버를 24시간 켜두거나 AWS Lambda 파이프라인을 엮어야 했다.
[기존 이메일 수신 파이프라인의 고질적 구조]
인바운드 이메일 수신 -> SendGrid / Mailgun 수신 파싱 과금 ($120/월) -> 백엔드 Webhook 서버 24시간 가동
                         * 스팸 이메일 수신 시에도 과금 적용
                         * Webhook 지연시간 3초~10초 발생

2025/2026년 기준 이 비효율을 완벽히 종식시킨 서버리스 에지 기술이 바로 **Cloudflare Email Workers (export default { async email })**다.

Cloudflare에 커스텀 도메인 DNS를 연결해두면, 들어오는 모든 인바운드 이메일 패킷이 V8 에지 노드로 직접 수신된다. 개발자는 Worker 코드 내부에서 0.1ms 만에 이메일을 인터셉트하고, postal-mime으로 본문/첨부파일을 파싱한 뒤, D1 데이터베이스 기록이나 Slack/Discord 웹훅 전송을 $0 비용으로 처리할 수 있다.

이 가이드에서는 Email Workers의 동작 메커니즘부터, wrangler.jsonc 라우팅 설정, postal-mime 에지 MIME 파싱 실전 코드, DKIM/SPF 스팸 차단, D1 DB 기록 & Slack 알림 파이프라인, 그리고 벤치마크까지 상세히 다룬다.

Cloudflare Email Workers 수신 파이프라인 아키텍처

Cloudflare 글로벌 에지 네트워크 최전방에서 이메일 수신 패킷을 0.1ms 만에 수신하고 분기 처리한다.

+-----------------------------------------------------------------------------------+
| Cloudflare Email Workers 에지 파이프라인 Architecture                               |
+-----------------------------------------------------------------------------------+

[고객 발송 이메일: [email protected] 수신]
                       |
                       v
   [Cloudflare Email Routing Edge (0.1ms 수신)]
                       |
                       v
     [Cloudflare Worker: async email(message, env)]
                       |
        +--------------+--------------+
        |                             |
 (A) DKIM / SPF 스팸 검증            (B) postal-mime 에지 파싱
   - Fail 시 message.setReject()       - 본문 텍스트/HTML 및 첨부파일 추출
   - 스팸 봇 이메일 $0 즉시 차단           - D1 DB (inbound_emails) 자동 저장
        |                             |
        +--------------+--------------+
                       |
                       v
       [Slack / Discord Webhook 즉시 알림 전송]
                       |
                       v
       [동적 자동 응답 / 이메일 AI 에이전트 연동]
  1. 0.1ms 에지 수신: 이메일이 도착하는 즉시 Cloudflare V8 에지 런타임의 email(message, env, ctx) 핸들러가 트리거된다.
  2. DKIM / SPF 스팸 자동 거부: 스팸 보이스피싱이나 도메인 사칭 이메일인 경우 Worker 단에서 message.setReject("Spam policy block")를 실행하여 인프라 비용 소모 없이 즉시 튕겨낸다.
  3. MIME 파싱 & D1 DB 저장: 정상 이메일은 postal-mime 라이브러리로 0.1ms 만에 파싱되어 에지 D1 데이터베이스에 안전하게 기입된다.

1단계: wrangler.jsonc Email Routing 선언

wrangler.jsonc 파일에 이메일 파싱 핸들러와 D1 데이터베이스 바인딩을 선언한다.

// wrangler.jsonc
{
  "$schema": "node_modules/wrangler/config-schema.json",
  "name": "edge-email-processor",
  "main": "src/index.ts",
  "compatibility_date": "2026-08-01",
  "compatibility_flags": ["nodejs_compat"],

  // D1 데이터베이스 바인딩 (수신 이메일 보관)
  "d1_databases": [
    {
      "binding": "DB",
      "database_name": "email_db",
      "database_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
  ]
}

2단계: postal-mime 설치 및 TypeScript 에지 핸들러 구현

이메일의 복잡한 MIME 데이터(Multipurpose Internet Mail Extensions)를 에지 V8 환경에서 가볍게 파싱하는 postal-mime 패키지를 설치한다.

# 에지 전용 MIME 파싱 라이브러리 설치
npm install postal-mime

src/index.ts 실전 코드

// src/index.ts
import PostalMime from "postal-mime";

export interface Env {
  DB: D1Database;
  SLACK_WEBHOOK_URL: string;
}

export default {
  // -------------------------------------------------------------------
  // Cloudflare Email Workers 전용 수신 이벤트 핸들러
  // -------------------------------------------------------------------
  async email(message: ForwardableEmailMessage, env: Env, ctx: ExecutionContext): Promise<void> {
    const fromAddress = message.from;
    const toAddress = message.to;
    const subject = message.headers.get("subject") || "(제목 없음)";

    console.log(`[Email Workers] Received from: ${fromAddress} -> ${toAddress}`);

    // 1. DKIM / SPF 스팸 검증 (발신자 검증 실패 시 $0 즉시 거부)
    const spfResult = message.headers.get("received-spf") || "";
    if (spfResult.includes("fail") || spfResult.includes("softfail")) {
      console.warn(`[Spam Block] SPF Validation Failed for ${fromAddress}`);
      message.setReject("Spam Email Rejected by SPF Policy");
      return;
    }

    try {
      // 2. message.raw (ReadableStream) 배열 버퍼 변환
      const rawEmailResponse = new Response(message.raw);
      const arrayBuffer = await rawEmailResponse.arrayBuffer();

      // 3. postal-mime 라이브러리로 에지 0.1ms MIME 파싱
      const parser = new PostalMime();
      const parsedEmail = await parser.parse(arrayBuffer);

      const bodyText = parsedEmail.text || "(본문 없음)";
      const htmlText = parsedEmail.html || "";
      const attachmentsCount = parsedEmail.attachments?.length || 0;

      // 4. D1 데이터베이스 수신 이메일 기록 (inbound_emails 테이블)
      await env.DB.prepare(
        `INSERT INTO inbound_emails (from_address, to_address, subject, body_text, attachments_count, created_at)
         VALUES (?, ?, ?, ?, ?, DATETIME('now'))`
      )
        .bind(fromAddress, toAddress, subject, bodyText.substring(0, 2000), attachmentsCount)
        .run();

      // 5. Slack Webhook으로 실시간 인스턴트 알림 전송
      if (env.SLACK_WEBHOOK_URL) {
        ctx.waitUntil(
          fetch(env.SLACK_WEBHOOK_URL, {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({
              text: `📩 *신규 고객 문의 수신*\n• *발신자*: ${fromAddress}\n• *제목*: ${subject}\n• *첨부파일*: ${attachmentsCount}개\n• *내용*: ${bodyText.substring(0, 300)}...`,
            }),
          })
        );
      }

      // 6. 특정 알림 이메일의 경우 담당자 개인 이메일로 무료 포워딩
      if (toAddress.includes("urgent@")) {
        await message.forward("[email protected]");
      }
    } catch (error) {
      console.error("[Email Processing Error]", error);
    }
  },
};

3단계: Cloudflare Dashboard Email Routing 규칙 연결

  1. Cloudflare Dashboard > Email Routing > Email Workers 메뉴 이동
  2. Create Worker 버튼 누르고 작성한 edge-email-processor 워커 바인딩
  3. Routing Rules 탭에서 규칙 추가:
    • Catch-all (모든 주소 *@yourdomain.com) 또는 특정 주소 ([email protected]) 선택
    • Action: Send to Worker > edge-email-processor 선택

이제 설정한 도메인으로 보내지는 모든 메일은 즉시 Cloudflare 에지 노드의 Worker 코드로 통과된다.

4단계: 로컬 테스트 파이프라인 (wrangler dev)

Wrangler v3.80+ / v4+ 환경에서는 로컬 개발 환경에서도 이메일 수신을 시뮬레이션 테스트할 수 있다.

# 로컬 개발 서버 가동
npx wrangler dev

터미널에서 가상 이메일 엔드포인트로 HTTP POST 패킷을 전송하여 Email Worker 수신 로직을 완벽히 테스트한다.

# 로컬 이메일 트리거 시뮬레이션 전송
curl -X POST http://localhost:8787/cdn-cgi/handler/email \
  -H "Content-Type: text/plain" \
  --data "From: [email protected]
To: [email protected]
Subject: 결제 관련 문의 드립니다.

안녕하세요, 서비스 결제 플랜 마이그레이션 문의드립니다."

벤치마크: SendGrid / Mailgun vs Cloudflare Email Workers

월간 5만 건의 인바운드 고객 문의 및 알림 이메일 수신·파싱 처리 시 플랫폼별 비용 및 성능 지표다.

플랫폼별 비용 & 성능 비교 리포트

평가 항목 SendGrid (Inbound Parse) Mailgun (Routes API) Cloudflare Email Workers
기본 월 구독 비용 $89.95 / 월 (Advanced) $75.00 / 월 (Foundation) $0.00 / 월 (Free / Paid 포함)
인바운드 이메일 수신 과금 $0.001 / 건당 과금 $0.0015 / 건당 과금 $0.00 (무제한 무과금)
악성 스팸 수신 과금 피해 스팸 수신 시에도 과금 발생 스팸 수신 시에도 과금 발생 $0.00 (에지 0.1ms 무료 차단)
수신 Webhook 처리 지연시간 3.5 초 ~ 8.0 초 2.8 초 ~ 6.5 초 0.1 초 (에지 V8 런타임)
파싱 데이터 저장소 외부 DB 별도 구축 필요 외부 DB 별도 구축 필요 D1 DB 내장 연동 ($0)
총 월간 인프라 유지 비용 $139.95 / 월 $150.00 / 월 $0.00 / 월 (-100% 비용 절감)

결론: 서버리스 이메일 파이프라인의 종착지

더 이상 단순 이메일 수신 웹훅과 데이터 파싱을 위해 매달 백달러가 넘는 구독료를 외부 SaaS 서비스에 상납하지 마라.

Cloudflare Email Workers와 **postal-mime**의 조합은 다음과 같은 압도적 혁신을 제공한다:

  1. 인바운드 수신 과금 100% 파괴 ($0): 수백만 건의 메일이 수신되어도 에지 노드에서 $0 비용으로 완벽 처리한다.
  2. 0.1ms 초고속 에지 수신: 백엔드 서버 대기시간 없이 V8 런타임에서 이메일을 파싱하고 Slack/D1 DB로 직렬 전달한다.
  3. 스팸 봇 완전 차단: DKIM/SPF 검증 실패 이메일을 에지 단에서 message.setReject()로 원천 차단하여 인프라를 보호한다.
  4. 이메일 AI 에지 에이전트 구축: 수신 메일 본문을 Cloudflare Workers AI (LLM)로 전달하여 실시간 자동 답변(Auto-Reply) 파이프라인을 $0에 구축한다.

지금 바로 서비스 이메일 라우팅에 Cloudflare Email Workers를 도입하고, $0 비용과 0.1ms 성능의 에지 이메일 파이프라인을 경험해보자.

관련 글: Auth0/Clerk 없이 Cloudflare Workers + Passkey(WebAuthn)로 인증 비용 $0 구축 가이드에서 에지 보안 아키텍처 구축 가이드도 함께 확인할 수 있다.