/** * @fileoverview Modul Layanan Temporary Email (Disposable Email Inbox). * * Mengimplementasikan klien API asinkron untuk penyedia email sementara (temporarymail.com). * Memfasilitasi pembuatan alamat email acak, pengecekan berkala kotak masuk (inbox polling), * serta ekstraksi konten pesan email secara real-time tanpa memerlukan autentikasi kompleks. * * @module services/tempmail * @version 1.0.0 * @author kyiov * @license MIT */ import { pathToFileURL } from 'node:url' /** * @typedef {Object} NewEmailResponse * @property {string} address - Alamat email sementara yang dibuat * @property {string} secretKey - Kunci otorisasi sesi untuk memeriksa kotak masuk */ /** * @typedef {Object} EmailMessage * @property {string} id - Pengenal unik email * @property {string} from - Pengirim email * @property {string} subject - Judul subjek email * @property {string} date - Waktu pengiriman */ /** * Kelas klien pengelola email sementara (TempMail). */ export class TempMail { /** * Menginisialisasi instance TempMail dengan konfigurasi header HTTP standar browser. */ constructor() { this.baseHeaders = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36', 'Accept': '*/*', 'x-requested-with': 'XMLHttpRequest', 'referer': 'https://temporarymail.com/', 'accept-language': 'id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7' } } /** * Membuat alamat email sementara baru secara acak. * * @returns {Promise} Objek berisi alamat email dan secretKey sesi * @throws {Error} Jika server merespons dengan status HTTP gagal */ async getNewEmail() { const url = 'https://temporarymail.com/api/?action=requestEmailAccess&key=&value=random&r=https://www.google.com/' const res = await fetch(url, { headers: this.baseHeaders }) if (!res.ok) throw new Error(`HTTP Error: ${res.status}`) return await res.json() } /** * Memeriksa daftar pesan masuk dalam inbox berdasarkan secretKey. * * @param {string} secretKey - Kunci rahasia sesi email yang diperoleh dari getNewEmail * @returns {Promise} Daftar pesan email dalam kotak masuk * @throws {Error} Jika secretKey kosong atau permintaan HTTP gagal */ async checkInbox(secretKey) { if (!secretKey) throw new Error('Secret Key wajib disertakan.') const url = `https://temporarymail.com/api/?action=checkInbox&value=${encodeURIComponent(secretKey)}` const res = await fetch(url, { headers: this.baseHeaders }) if (!res.ok) throw new Error(`HTTP Error: ${res.status}`) const data = await res.json() return Object.values(data) } /** * Mengambil detail dan isi lengkap dari suatu pesan email berdasarkan ID. * * @param {string} emailId - ID email yang ingin dibaca * @returns {Promise} Konten pesan lengkap (HTML / teks / lampiran) * @throws {Error} Jika emailId kosong atau permintaan HTTP gagal */ async getEmailContent(emailId) { if (!emailId) throw new Error('Email ID wajib disertakan.') const url = `https://temporarymail.com/api/?action=getEmail&value=${encodeURIComponent(emailId)}` const res = await fetch(url, { method: 'POST', headers: { ...this.baseHeaders, origin: 'https://temporarymail.com', 'content-length': '0' } }) if (!res.ok) throw new Error(`HTTP Error: ${res.status}`) const data = await res.json() return data[emailId] } } export default TempMail // Eksekusi mandiri untuk pengujian langsung tanpa argumen CLI if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { try { const client = new TempMail() console.log('Menguji pembuatan email sementara...') const account = await client.getNewEmail() console.log('Hasil Pembuatan Akun:', account) console.log('Memeriksa inbox awal...') const inbox = await client.checkInbox(account.secretKey) console.log('Jumlah email di kotak masuk:', inbox.length) } catch (err) { console.error('Galat eksekusi TempMail:', err.message || err) } }