UNPKG

mailbucket

Version:

An npm library that aggregates multiple APIs for creating and receiving temporary emails.

192 lines (191 loc) 9.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EmailnatorProvider = void 0; const tslib_1 = require("tslib"); const axios_1 = tslib_1.__importDefault(require("axios")); const cheerio = tslib_1.__importStar(require("cheerio")); const EMAILNATOR_BASE_URL = 'https://www.emailnator.com'; const USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0"; class EmailnatorProvider { providerName = 'emailnator'; async getSessionTokens() { try { const res = await axios_1.default.get(EMAILNATOR_BASE_URL, { headers: { 'User-Agent': USER_AGENT } }); const cookiesHeader = res.headers['set-cookie']; if (!cookiesHeader || cookiesHeader.length === 0) { return { success: false, message: 'Could not retrieve cookies from Emailnator.' }; } const cookies = decodeURIComponent(cookiesHeader.join('; ')); const xsrfToken = cookies.match(/XSRF-TOKEN=([^;]+)/)?.[1]; const sessionToken = cookies.match(/gmailnator_session=([^;]+)/)?.[1]; if (!xsrfToken || !sessionToken) { console.error("Failed to parse tokens from cookies:", cookies); return { success: false, message: 'Could not parse XSRF or session token from cookies.' }; } const cookieDone = `XSRF-TOKEN=${xsrfToken}; gmailnator_session=${sessionToken}`; return { success: true, data: { cookie: cookieDone, xsrfToken } }; } catch (error) { console.error("Error getting Emailnator session:", error); const message = error.response?.data?.message || error.message || 'Failed to initialize Emailnator session'; return { success: false, message, error }; } } async createAccount() { const tokenResponse = await this.getSessionTokens(); if (!tokenResponse.success || !tokenResponse.data) { return tokenResponse; } const { cookie, xsrfToken } = tokenResponse.data; try { const resCreate = await axios_1.default.post(`${EMAILNATOR_BASE_URL}/generate-email`, { "email": ["domain", "plusGmail", "dotGmail", "googleMail"] }, { headers: { "User-Agent": USER_AGENT, "Accept": "application/json, text/plain, */*", "X-Requested-With": "XMLHttpRequest", "Content-Type": "application/json", "Cookie": cookie, "X-XSRF-TOKEN": xsrfToken, "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", } }); if (resCreate.status !== 200 || !resCreate.data?.email || resCreate.data.email.length === 0) { return { success: false, status: resCreate.status, message: 'Failed to generate email address from Emailnator.' }; } const emailAddress = resCreate.data.email[0]; return { success: true, data: { providerName: this.providerName, address: emailAddress, providerData: { cookie: cookie, xsrfToken: xsrfToken } } }; } catch (error) { console.error("Error creating Emailnator account:", error); const message = error.response?.data?.message || error.message || 'Failed to create Emailnator account'; return { success: false, status: error.response?.status, message, error }; } } async getMessages(account) { if (account.providerName !== this.providerName) { return { success: false, message: 'Invalid account type for EmailnatorProvider' }; } const { cookie, xsrfToken } = account.providerData; const emailAddress = account.address; if (!cookie || !xsrfToken || !emailAddress) { return { success: false, message: 'Missing required provider data (cookie, token, or email) in account object.' }; } try { const response = await axios_1.default.post(`${EMAILNATOR_BASE_URL}/message-list`, { "email": emailAddress }, { headers: { "User-Agent": USER_AGENT, "Accept": "application/json, text/plain, */*", "X-Requested-With": "XMLHttpRequest", "Content-Type": "application/json", "Cookie": cookie, "X-XSRF-TOKEN": xsrfToken, "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", } }); if (response.status !== 200 || !response.data?.messageData) { return { success: false, status: response.status, message: 'Failed to retrieve messages from Emailnator.' }; } const messages = response.data.messageData.map(msg => ({ id: msg.messageID, from: msg.from, subject: msg.subject, receivedAt: msg.time, })); let blackList = { "ADSVPN": true }; for (let i = 0; i < messages.length; i++) { if (blackList[messages[i].id]) { messages.splice(i, 1); } } return { success: true, data: messages }; } catch (error) { console.error(`Error getting Emailnator messages for ${emailAddress}:`, error); const message = error.response?.data?.message || error.message || 'Failed to get Emailnator messages'; return { success: false, status: error.response?.status, message, error }; } } async getMessage(account, messageId) { if (account.providerName !== this.providerName) { return { success: false, message: 'Invalid account type for EmailnatorProvider' }; } const { cookie, xsrfToken } = account.providerData; const emailAddress = account.address; if (!cookie || !xsrfToken || !emailAddress || !messageId) { return { success: false, message: 'Missing required provider data (cookie, token, email, or messageId) in account object.' }; } try { const response = await axios_1.default.post(`${EMAILNATOR_BASE_URL}/message-list`, { "email": emailAddress, "messageID": messageId }, { headers: { "User-Agent": USER_AGENT, "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "X-Requested-With": "XMLHttpRequest", "Content-Type": "application/json", "Cookie": cookie, "X-XSRF-TOKEN": xsrfToken, "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Referer": `${EMAILNATOR_BASE_URL}/inbox/${emailAddress}/${messageId}` } }); const contentType = response.headers['content-type']; let messageData = {}; if (contentType?.includes('html')) { const $ = cheerio.load(response.data); messageData = { id: messageId, bodyHtml: response.data, bodyText: $('[dir=ltr]').text(), from: $('div').text().split('From: ')[1].split('Subject: ')[0], subject: $('div').text().split('Subject: ')[1].split('Time: ')[0], receivedAt: $('div').text().split('Time: ')[0] }; } else if (contentType?.includes('json') && typeof response.data === 'object') { const detail = response.data; messageData = { id: detail.messageID || messageId, from: detail.from, subject: detail.subject, receivedAt: detail.time, bodyHtml: detail.content, }; } else { return { success: false, status: response.status, message: `Unexpected content type received from Emailnator: ${contentType}` }; } if (response.status !== 200) { return { success: false, status: response.status, message: 'Failed to retrieve message details from Emailnator.' }; } return { success: true, data: messageData }; } catch (error) { console.error(`Error getting Emailnator message ${messageId} for ${emailAddress}:`, error); const message = error.response?.data?.message || error.message || 'Failed to get Emailnator message details'; return { success: false, status: error.response?.status, message, error }; } } } exports.EmailnatorProvider = EmailnatorProvider;