runlot
データ

メール

ワーカーからメールを送り、プロジェクトのアドレス宛のメールをワーカーで受け取ります。送信者の評価と受信サーバーは Runlot が担います。

runlot.json
{ "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 のみです。
  • 送信の添付。 texthtml だけです。
  • ニュースレター。 宛先 10 人が境界です。
  • forward() · reply() どちらも env.email.send で代替できます。

CLI

runlot email            # アドレスと直近 1 時間・24 時間の送受信数
runlot email --json
runlot email delete     # 無効にする(admin)。このアドレス宛のメールはバウンスします

このページの目次