メール
ワーカーからメールを送り、プロジェクトのアドレス宛のメールをワーカーで受け取ります。送信者の評価と受信サーバーは Runlot が担います。
{ "email": true }runlot deployデプロイすると、プロジェクトごとにメールアドレスが 1 つ作られます。組織 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 は 1 時間の上限)。
受信
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 のようなパーサーを使ってください。
ハンドラーをエクスポートしていないプロジェクト宛のメールはバウンスします。ハンドラーが例外を投げると、送信側はしばらくして再送します(一時的な失敗として扱われます)。
上限
| 値 | |
|---|---|
| 1 時間の送信 | 無料 30 通 · プロ 300 通 — ログイン認証メール(env.auth)と同じ上限を共有 |
| 1 通の宛先 | 10 人 |
| 1 時間の受信 | 600 通 |
| 受信メール 1 通 | 25 MiB |
| ハンドラー 1 回 | 30 秒 |
送信の上限を超えると 429、受信の上限を超えると送信側に「後で再試行」と返します。
送受信したメールを見る
送ったものと受け取ったものを 1 通ずつ残します — ダッシュボードの メール タブの下の一覧で日時・方向・送信者・宛先・件名・結果・サイズを見て、クリックするとヘッダーと本文が開きます。原文は .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)。このアドレス宛のメールはバウンスします