import {AxiosInstance, AxiosRequestConfig, CreateAxiosDefaults} from 'axios'; import {md5, randomStr} from "./index"; import {CreateAxiosProxy} from "./proxyAgent"; export enum TempEmailType { // need credit card https://rapidapi.com/Privatix/api/temp-mail TempEmail = 'temp-email', // not need credit card , hard limit 100/day https://rapidapi.com/calvinloveland335703-0p6BxLYIH8f/api/temp-mail44 TempEmail44 = 'temp-email44', // not need credit card and not need credit rapid_api_key TempMailLOL = 'tempmail-lol', } export function CreateEmail(tempMailType: TempEmailType, options?: BaseOptions): BaseEmail { switch (tempMailType) { case TempEmailType.TempEmail44: return new TempMail44(options); case TempEmailType.TempEmail: return new TempMail(options); case TempEmailType.TempMailLOL: return new TempMailLOL(options); default: throw new Error('not support TempEmailType') } } export interface BaseMailMessage { // main content of email content: string; } export interface TempMailMessage extends BaseMailMessage { _id: { oid: string; }; createdAt: { milliseconds: number; }; mail_id: string; mail_address_id: string; mail_from: string; mail_subject: string; mail_preview: string; mail_text_only: string; mail_text: string; mail_html: string; mail_timestamp: number; mail_attachments_count: number; mail_attachments: { attachment: any[]; }; } interface BaseOptions { } abstract class BaseEmail { protected constructor(options?: BaseOptions) { } public abstract getMailAddress(): Promise public abstract waitMails(): Promise } export interface TempMailOptions extends BaseOptions { apikey?: string; } class TempMail extends BaseEmail { private readonly client: AxiosInstance; private address: string | undefined; private mailID: string = ''; constructor(options?: TempMailOptions) { super(options) const apikey = options?.apikey || process.env.rapid_api_key; if (!apikey) { throw new Error('Need apikey for TempMail') } this.client = CreateAxiosProxy({ baseURL: 'https://privatix-temp-mail-v1.p.rapidapi.com/request/', headers: { 'X-RapidAPI-Key': apikey, 'X-RapidAPI-Host': 'privatix-temp-mail-v1.p.rapidapi.com' } } as CreateAxiosDefaults); } public async getMailAddress(): Promise { this.address = `${randomStr()}${await this.randomDomain()}`; this.mailID = md5(this.address); return this.address; } public async waitMails(): Promise { const mailID = this.mailID; return new Promise(resolve => { let time = 0; const itl = setInterval(async () => { const response = await this.client.get(`/mail/id/${mailID}`); if (response.data && response.data.length > 0) { resolve(response.data.map((item: any) => ({...item, content: item.mail_html}))); clearInterval(itl); return; } if (time > 5) { resolve([]); clearInterval(itl); return; } time++; }, 5000); }); } async getDomainsList(): Promise { const res = await this.client.get(`/domains/`); return res.data; } async randomDomain(): Promise { const domainList = await this.getDomainsList(); return domainList[Math.floor(Math.random() * domainList.length)]; } } class TempMail44 extends BaseEmail { private readonly client: AxiosInstance; private address: string = ''; constructor(options?: TempMailOptions) { super(options) const apikey = options?.apikey || process.env.rapid_api_key; if (!apikey) { throw new Error('Need apikey for TempMail') } this.client = CreateAxiosProxy({ baseURL: 'https://temp-mail44.p.rapidapi.com/api/v3/email/', headers: { 'X-RapidAPI-Key': apikey, 'X-RapidAPI-Host': 'temp-mail44.p.rapidapi.com' } } as CreateAxiosDefaults); } public async getMailAddress(): Promise { const response = await this.client.post('/new', {}, { headers: { 'content-type': 'application/json', } } as AxiosRequestConfig); this.address = response.data.email; return this.address; } public async waitMails(): Promise { return new Promise(resolve => { let time = 0; const itl = setInterval(async () => { const response = await this.client.get(`/${this.address}/messages`); if (response.data && response.data.length > 0) { resolve(response.data.map((item: any) => ({...item, content: item.body_html}))); clearInterval(itl); return; } if (time > 5) { resolve([]); clearInterval(itl); return; } time++; }, 5000); }); } } class TempMailLOL extends BaseEmail { private readonly client: AxiosInstance; private address: string = ''; private token: string = ''; constructor(options?: TempMailOptions) { super(options) this.client = CreateAxiosProxy({ baseURL: 'https://api.tempmail.lol' } as CreateAxiosDefaults); } public async getMailAddress(): Promise { const response = await this.client.get('/generate'); this.address = response.data.address; this.token = response.data.token; return this.address; } public async waitMails(): Promise { return new Promise(resolve => { let time = 0; const itl = setInterval(async () => { const response = await this.client.get(`/auth/${this.token}`); if (response.data && response.data.email.length > 0) { resolve(response.data.email.map((item: any) => ({...item, content: item.html}))); clearInterval(itl); return; } if (time > 5) { resolve([]); clearInterval(itl); return; } time++; }, 5000); }); } }