이메일
워커에서 메일을 보내고, 프로젝트 주소로 온 메일을 워커가 받습니다. 발신자 관리와 수신 서버는 Runlot이 맡습니다.
{ "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만 됩니다. - 첨부 발신.
text와html뿐입니다. - 뉴스레터. 수신자 10명이 선입니다.
forward()·reply(). 둘 다env.email.send로 대신할 수 있습니다.
CLI
runlot email # 주소와 지난 1시간·24시간의 보낸·받은 통
runlot email --json
runlot email delete # 끕니다 (admin). 이 주소로 오는 메일은 반송됩니다