runlot
데이터

이메일

워커에서 메일을 보내고, 프로젝트 주소로 온 메일을 워커가 받습니다. 발신자 관리와 수신 서버는 Runlot이 맡습니다.

runlot.json
{ "email": true }
runlot deploy

배포하면 프로젝트마다 메일 주소가 하나 생깁니다. 예를 들어 조직 acme의 프로젝트 shop은 이렇습니다.

주소
보내는 주소[email protected]
받는 주소*@shop.acme.runlot.email — 로컬 파트는 아무거나 됩니다

주소는 대시보드의 이메일 탭이나 runlot email로 확인합니다.

보내기

export default {
  async fetch(request, env) {
    await env.email.send({
      to: "[email protected]",           // 문자열 또는 배열 (10명까지)
      subject: "주문이 접수됐습니다",
      text: "감사합니다. 곧 배송됩니다.",
      html: "<p>감사합니다. 곧 배송됩니다.</p>",   // text나 html 중 하나는 있어야 합니다
      replyTo: "[email protected]",       // 선택
    });
    return new Response("ok");
  },
};

from은 적지 않습니다. 발신자는 프로젝트 주소로 정해져 있고, 다른 주소로는 보낼 수 없습니다. 응답은 { id }이고, 실패하면 예외가 납니다 — e.status가 HTTP 상태입니다 (429는 시간당 한도).

받기

export default {
  async fetch(request, env) { /* … */ },

  async email(message, env, ctx) {
    // message.from, message.to, message.headers (Headers), message.raw (ReadableStream), message.rawSize
    const raw = await new Response(message.raw).text();
    await env.db.query("insert into inbox (from_addr, to_addr, raw) values ($1, $2, $3)",
      [message.from, message.to, raw]);

    // 받지 않으려면 — 보낸 쪽이 이 문장을 받습니다
    if (message.headers.get("authentication-results")?.includes("spf=fail")) {
      message.setReject("SPF 검사에 실패했습니다");
    }
  },
};

email 핸들러는 Cloudflare Email Workers와 같은 모양입니다. 옮겨 오는 코드는 대개 그대로 됩니다. message.raw는 메일 원문 전체(헤더 포함)이고, 첨부를 다루려면 postal-mime 같은 파서를 쓰세요.

핸들러를 내보내지 않은 프로젝트로 온 메일은 반송됩니다. 핸들러가 예외를 던지면 보낸 쪽이 잠시 뒤 다시 보냅니다 (일시적 오류로 취급).

한도

시간당 발신무료 30통 · 프로 300통 — 로그인 인증 메일(env.auth)과 같은 한도를 씁니다
한 통의 수신자10명
시간당 수신600통
받는 메일 한 통25 MiB
핸들러 한 회30초

한도를 넘긴 발신은 429, 수신은 보낸 쪽에 "잠시 뒤 다시" 로 답합니다.

주고받은 메일 보기

보낸 것과 받은 것을 한 통씩 남깁니다 — 대시보드의 이메일 탭 아래 목록에서 시각·방향·보낸 사람·받는 사람·제목·결과·크기를 보고, 클릭하면 헤더와 본문이 열립니다. 원문은 .eml로 내려받을 수 있습니다. HTML 본문은 그리지 않고 원문 그대로 보여 줍니다.

요금제보관
무료30일
프로365일
runlot email log                       # 최근 50통
runlot email log --direction in        # 받은 것만
runlot email log --cursor <cursor>     # 다음 장
runlot email raw <mailId> > mail.eml   # 원문

받은 메일의 결과는 핸들러가 어떻게 답했는지입니다 — 받았음·거절·핸들러 없음·핸들러 오류. 보낸 메일은 릴레이에 넘겼는지, 못 넘겼으면 왜인지가 남습니다.

없는 것

  • 커스텀 발신 도메인. 지금은 *.runlot.email만 됩니다.
  • 첨부 발신. texthtml뿐입니다.
  • 뉴스레터. 수신자 10명이 선입니다.
  • forward()·reply(). 둘 다 env.email.send로 대신할 수 있습니다.

CLI

runlot email            # 주소와 지난 1시간·24시간의 보낸·받은 통
runlot email --json
runlot email delete     # 끕니다 (admin). 이 주소로 오는 메일은 반송됩니다

이 페이지의 목차