TempMail Gratis

Backend Live Belum Terhubung: Alamat email ini berjalan dalam mode lokal/offline. Untuk menerima email nyata dari luar, hubungkan URL Cloudflare Worker Anda atau aktifkan Mode Demo untuk uji coba.
Memeriksa inbox secara otomatis...
Pemeriksaan berikutnya dalam: 10s

Kotak Masuk

0

Kotak Masuk Kosong

Gunakan email di atas untuk mendaftar layanan. Pesan baru akan muncul di sini secara otomatis.

Belum Ada Pesan Dipilih

Klik salah satu pesan dari kotak masuk di sebelah kiri untuk membaca isinya.

Privasi Terjamin

Lindungi email pribadi Anda dari spam, phishing, dan pelacak iklan.

Pesan Instan

Menerima kode verifikasi & tautan konfirmasi secara real-time tanpa pendaftaran.

Otomatis Dihapus

Semua email dan pesan akan dibersihkan secara berkala untuk keamanan Anda.

Notifikasi

Cara Mengatasi "Delivery Failed" di Cloudflare

Panduan Perbaikan Email Routing & Worker Backend

1 Periksa Rekor DNS MX (TIDAK Boleh Bentrok)

Masuk ke Cloudflare Dashboard > DNS > Records. Hapus rekor MX lama (cPanel/Hostinger/Zoho dll) dan pastikan hanya ada 3 rekor MX resmi Cloudflare:

  • isaac.mx.cloudflare.net (Priority: 73)
  • linda.mx.cloudflare.net (Priority: 16)
  • amir.mx.cloudflare.net (Priority: 83)

2 Gunakan Script Cloudflare Worker Terbaru (Anti-Error & Case-Insensitive)

Script ini menyelesaikan masalah status "Handled" dengan membersihkan format message.to, memaksa huruf kecil (lowercase), serta memberikan respon diagnostik KV.

export default {
  // Handle Incoming Cloudflare Email Routing
  async email(message, env, ctx) {
    try {
      // 1. Dapatkan alamat email penerima & bersihkan karakter nama/tanda panah < >
      let rawTo = message.to || "";
      const match = rawTo.match(/<([^>]+)>/);
      if (match) rawTo = match[1];
      
      const cleanTo = rawTo.trim().toLowerCase();
      const from = message.from || "Unknown";
      const subject = message.headers.get("subject") || "(Tanpa Subjek)";
      
      const parts = cleanTo.split("@");
      if (parts.length < 2) return;
      
      const login = parts[0].trim();
      const domain = parts[1].trim();

      // 2. Baca isi pesan raw
      let rawText = "";
      try {
        rawText = await new Response(message.raw).text();
      } catch (e) {
        rawText = "Gagal membaca isi teks email.";
      }
      
      const msgData = {
        id: Date.now(),
        from: from,
        to: cleanTo,
        subject: subject,
        date: new Date().toLocaleString("id-ID", { timeZone: "Asia/Jakarta" }),
        textBody: rawText.substring(0, 3000),
        htmlBody: `
${rawText.replace(//g, ">")}
` }; // 3. Simpan ke KV Storage Cloudflare if (env.TEMPMAIL_KV) { const key = `msg:${domain}:${login}:${msgData.id}`; // Simpan email dengan expired 24 jam (86400 detik) await env.TEMPMAIL_KV.put(key, JSON.stringify(msgData), { expirationTtl: 86400 }); } else { console.error("ERROR CRITICAL: Variable TEMPMAIL_KV belum di-bind di Worker Settings!"); } } catch (err) { console.error("Email Worker Exception:", err); } }, // Handle Fetch Request dari Web App (Frontend) async fetch(request, env, ctx) { const corsHeaders = { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "GET, POST, OPTIONS", "Access-Control-Allow-Headers": "*" }; if (request.method === "OPTIONS") return new Response(null, { headers: corsHeaders }); const url = new URL(request.url); const login = (url.searchParams.get("login") || "").trim().toLowerCase(); const domain = (url.searchParams.get("domain") || "").trim().toLowerCase(); // Endpoint tes diagnostik status KV if (url.pathname.includes("/status")) { return new Response(JSON.stringify({ status: "ok", kvBound: !!env.TEMPMAIL_KV, time: new Date().toISOString() }), { headers: { ...corsHeaders, "Content-Type": "application/json" } }); } // Endpoint mengambil daftar email if (url.pathname.includes("/messages")) { if (!env.TEMPMAIL_KV) { return new Response(JSON.stringify({ error: "TEMPMAIL_KV_NOT_BOUND" }), { status: 500, headers: { ...corsHeaders, "Content-Type": "application/json" } }); } const prefix = `msg:${domain}:${login}:`; const list = await env.TEMPMAIL_KV.list({ prefix }); const messages = []; for (const key of list.keys) { const val = await env.TEMPMAIL_KV.get(key.name); if (val) { try { messages.push(JSON.parse(val)); } catch(e){} } } // Urutkan dari yang terbaru messages.sort((a, b) => b.id - a.id); return new Response(JSON.stringify(messages), { headers: { ...corsHeaders, "Content-Type": "application/json" } }); } // Default return domain list yang didukung return new Response(JSON.stringify([domain || "domainanda.com"]), { headers: { ...corsHeaders, "Content-Type": "application/json" } }); } };

3 Checklist Wajib: Mengapa Status "Handled" Tapi Email Belum Masuk?

Pastikan KV Binding Terpasang:

  1. Buka Cloudflare Dashboard > Workers & Pages > Klik Worker Anda.
  2. Masuk ke Settings > Variables > KV Namespace Bindings.
  3. Klik Add binding: Isikan Variable Name persis: TEMPMAIL_KV dan pilih Namespace KV Anda.
  4. Klik Save and Deploy. (Jika ini lupa dilakukan, status akan tetap "Handled" tetapi email tidak pernah tersimpan ke database!).

Buka Alamat Email

Masukkan username/alamat email kustom yang ingin Anda periksa pesan masuknya.

Pengaturan Backend API Worker

TempMail memerlukan Cloudflare Worker untuk menerima email masuk secara nyata. Masukkan URL endpoint Cloudflare Worker Anda di bawah ini:

Kosongkan jika Anda ingin menguji dengan Mode Demo saja.

Belum Punya Backend?

Klik tombol "Solusi Delivery Failed" di bagian atas halaman untuk menyalin script Worker dan panduan setup Cloudflare Email Routing gratis.