export default { async email(message, env, ctx) { const TELEGRAM_TOKEN = env.TELEGRAM_TOKEN; const TELEGRAM_CHAT_ID = env.TELEGRAM_CHAT_ID; if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID) { return; } try { const from = message.from || "Unknown"; const to = message.to || "Unknown"; let subject = message.headers.get("subject") || "(Tanpa Subjek)"; subject = decodeMimeHeader(subject); // Ambil seluruh teks mentah email const rawEmail = await new Response(message.raw).text(); // 1. Tangkap SEMUA tautan HTTPS (termasuk link verifikasi tersembunyi) const allLinks = extractRawUrls(rawEmail); // 2. Bersihkan teks isi email let bodyText = cleanEmailBody(rawEmail); if (bodyText.length > 1200) { bodyText = bodyText.substring(0, 1200) + "\n\n...(pesan dipotong)"; } // 3. Format Bagian Tautan Verifikasi let linkSection = ""; if (allLinks.length > 0) { linkSection = `\nšŸ”— LINK VERIFIKASI / ACTION (Klik untuk Buka):\n` + allLinks.map((url, i) => `[Link ${i + 1}] ${url}`).join("\n\n") + "\n"; } else { linkSection = `\nāš ļø Tidak ada link verifikasi terdeteksi.\n`; } // 4. Format Pesan HTML Telegram const htmlMessage = `šŸ“© EMAIL MASUK (Temp Mail) šŸ‘¤ Dari: ${escapeHtml(from)} šŸ“„ Untuk: ${escapeHtml(to)} šŸ“Œ Subjek: ${escapeHtml(subject)} ${linkSection} šŸ“ Teks Email:
${escapeHtml(bodyText)}
`; // Kirim ke Telegram API const url = `https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage`; await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ chat_id: TELEGRAM_CHAT_ID, text: htmlMessage, parse_mode: "HTML", disable_web_page_preview: true }) }); } catch (err) { console.error("Error Worker:", err); } } }; // --- FUNGSI EKSTRAKSI LINK EXTREME --- function extractRawUrls(raw) { // Decode Quoted-Printable MIME terlebih dahulu (menghapus =3D dan newline =) let unquoted = raw.replace(/=\r?\n/g, "").replace(/=3D/gi, "="); unquoted = unquoted.replace(/=([0-9A-F]{2})/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16))); const urls = []; // Regex mencari semua pola URL https:// const urlRegex = /https?:\/\/[^\s"'<>(){}]+[^\s"'<>(){}\.,;]/gi; let match; while ((match = urlRegex.exec(unquoted)) !== null) { let url = match[0]; // Filter URL sistem/font/schema yang bukan link verifikasi const isNoise = url.includes("w3.org") || url.includes("schema.org") || url.includes(".png") || url.includes(".jpg") || url.includes(".css"); if (!isNoise && !urls.includes(url)) { urls.push(url); } } return urls.slice(0, 5); // Ambil 5 link pertama } // --- FUNGSI MEMBERSIHKAN TEKS BODY --- function cleanEmailBody(raw) { let text = raw.replace(/=\r?\n/g, "").replace(/=3D/gi, "="); // Ambil bagian setelah header utama const parts = text.split(/\r?\n\r?\n/); if (parts.length > 1) { text = parts.slice(1).join("\n\n"); } // Jika ada tag HTML, buang tagnya tetapi sisakan teksnya text = text.replace(/]*>[\s\S]*?<\/style>/gi, ""); text = text.replace(/]*>[\s\S]*?<\/script>/gi, ""); text = text.replace(/<[^>]*>?/gm, " "); // Rapikan spasi berlebih text = text.replace(/[ \t]+/g, " ").replace(/\n\s*\n/g, "\n").trim(); return text || "(Isi teks tidak dapat dibaca)"; } function decodeMimeHeader(header) { if (!header) return ""; return header.replace(/=\?([^?]+)\?([QB])\?([^?]+)\?=/gi, (_, charset, encoding, text) => { if (encoding.toUpperCase() === "B") { try { return atob(text); } catch (e) { return text; } } else if (encoding.toUpperCase() === "Q") { return text.replace(/=([0-9A-F]{2})/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16))); } return text; }); } function escapeHtml(str) { return String(str) .replace(/&/g, "&") .replace(//g, ">"); }