콘텐츠로 이동

Resend에서 마이그레이션

SpacePost는 Resend API를 구현합니다. 경로, 필드 이름, 응답 형식, 오류 형식이 모두 같습니다. 대부분의 앱은 기본 URL과 API 키만 바꾸면 마이그레이션이 끝납니다.

  1. SpacePost API 키를 만듭니다. 대시보드에서 만듭니다. SpacePost 키는 sp_live_로 시작합니다(Resend 키는 re_로 시작합니다).

  2. SpacePost에서 도메인을 추가하고 확인합니다. DNS 레코드가 Resend와 다르므로 새 DKIM CNAME과 send용 MX/TXT 레코드를 추가하세요. DKIM 셀렉터가 겹치지 않으므로 전환하는 동안 Resend 레코드를 그대로 두어도 됩니다. 추가 및 확인을 참고하세요. SPF/DMARC 정책은 send 서브도메인을 바꾼 경우에만 옮기면 됩니다.

  3. 클라이언트를 전환합니다. 아래 옵션 중 하나를 고르세요.

    공식 resend 패키지를 그대로 사용합니다. 환경 변수로 기본 URL을 지정하고 SpacePost 키를 사용하세요.

    .env
    RESEND_API_KEY=sp_live_YOUR_API_KEY
    RESEND_BASE_URL=https://api.spacepost.dev
    import { Resend } from "resend";
    const resend = new Resend(process.env.RESEND_API_KEY);
    await resend.emails.send({ from: "Acme <hello@acme.com>", to: "you@example.com", subject: "Hi", html: "<p>Hi</p>" });

    코드에서 직접 전달할 수도 있습니다.

    const resend = new Resend("sp_live_YOUR_API_KEY", { baseUrl: "https://api.spacepost.dev" });
  4. 웹훅을 다시 만듭니다. SpacePost에서 각 엔드포인트를 다시 생성하고(POST /webhooks) 새 signing_secret을 저장하세요. SpacePost는 같은 Standard Webhooks 헤더(와 중복된 svix-* 헤더)를 보내므로 Resend나 Svix용으로 작성한 검증 코드는 그대로 동작합니다. 서명 검증을 참고하세요.

  5. 오디언스와 연락처를 옮깁니다. POST /audiences/{id}/contacts로 오디언스를 만들고 연락처를 가져옵니다. {{{FIRST_NAME|fallback}}}, {{{RESEND_UNSUBSCRIBE_URL}}} 같은 플레이스홀더는 브로드캐스트에서 그대로 동작합니다.

  6. 테스트를 보낸 뒤 전환합니다. delivered@test.spacepost.dev로 보내고 웹훅이 도착하는지 확인한 다음 배포하세요.

Resend 기능 SpacePost 비고
POST /emails 지원 to/cc/bcc/reply_to는 각각 최대 50개, camelCase 별칭 replyTo, scheduledAt 허용
POST /emails/batch 지원 최대 100통, 이메일마다 첨부 파일과 scheduled_at 사용 가능, 전부 성공하거나 전부 실패
GET /emails/{id}, GET /emails 지원 목록에는 본문이 없음
PATCH /emails/{id} 지원 예약된 이메일의 일정 변경
POST /emails/{id}/cancel 지원 예약된 이메일만 가능
첨부 파일(content, path) 지원 path는 https여야 함
태그, 사용자 지정 헤더 지원 태그에 쓸 수 있는 문자 제약이 같음
Idempotency-Key 지원 24시간, POST /emails와 /emails/batch
도메인(생성, 조회, 목록, 확인, 수정, 삭제) 지원 open_tracking, click_tracking
API 키 지원 full_access, sending_access, 선택적 domain_id
웹훅, Standard Webhooks 서명 지원 svix-* 헤더도 제공
오디언스, 연락처, 브로드캐스트 지원 연락처는 /audiences/{id}/contacts 아래에 있음
발송 제외 API 지원 추가 기능: 항목 목록 조회, 추가, 삭제
테넌트(플랫폼 모드) SpacePost 전용 고객별로 평판을 분리함. 플랫폼 모드 참고. Resend SDK는 tenant_id를 버리므로 resend.post나 테넌트 소유 도메인을 사용하세요
SMTP 릴레이 지원 STARTTLS를 사용하는 smtp.spacepost.dev:25976(465의 암시적 TLS는 아직 미지원)
수신 이메일 아직 미지원
템플릿 편집기 아직 미지원 React Email이나 직접 작성한 HTML 사용
  • last_event 값. Resend의 값(queued, scheduled, sent, delivered, delivery_delayed, bounced, complained, opened, clicked, canceled, failed)이 모두 있습니다. SpacePost는 모든 수신자가 발송 제외 목록에 있을 때 사용하는 suppressed를 추가로 제공합니다. 상태는 뒤로 돌아가지 않습니다. delivered보다 먼저 opened 이벤트가 도착해도 나중 상태가 유지됩니다.
  • 추가 웹훅 이벤트. email.suppressed는 발송 제외 상태라서 수신자를 건너뛸 때 발생합니다. 처리하는 이벤트만 구독하세요. 페이로드는 그 외에는 Resend와 동일하며, 테넌트 메일에는 data.tenant_id가 추가됩니다.
  • 요청 한도. 팀당 초당 10건(Scale은 25건)으로, Resend의 2건보다 높습니다. ratelimit-* 헤더는 같습니다.
  • 가격. Pro는 50,000통에 €9이고 1,000통 초과분마다 €0.25이며, EUR로 VAT 별도 청구됩니다(Resend Pro: USD 20, 1,000통 초과분마다 USD 0.90, Resend의 2026년 10월 23일 기준 USD 가격). 처음 7일이 지나면 Free를 포함한 모든 요금제에 발송량에 따라 늘어나는 일일 한도가 적용됩니다. 1,000통과 최근 14일 중 가장 많이 보낸 날의 두 배 중 큰 값이며, 하루 최대 50,000통입니다. 요금제 및 할당량을 참고하세요.
  • 이메일로 집계되는 기준. 수신자마다 집계됩니다. 수신자 3명(to, cc, bcc 합계)에게 보낸 이메일 한 통은 할당량에서 3통으로 계산됩니다.
  • 테스트 발신자. onboarding@resend.dev 대신 onboarding@test.spacepost.dev를 사용합니다. 테스트 수신함은 resend.dev 대신 test.spacepost.dev에 있습니다. delivered@, bounced@, complained@, delayed@가 있고, SpacePost 전용인 softbounced@도 있습니다.
  • 신규 계정 샌드박스. 처음 7일 동안은 하루 100통으로 제한됩니다. 계정 인증 및 발송 한도를 참고하세요.
  • 자동 일시 중지. 반송률이나 스팸 신고율이 비정상적인 팀은 자동으로 일시 중지됩니다. 자동 일시 중지를 참고하세요.
  • 기본 URL. https://api.spacepost.dev이며 경로는 루트에 있습니다. /v1 접두사도 허용됩니다(https://api.spacepost.dev/v1/emails).