172 行
5.2 KiB
TypeScript
172 行
5.2 KiB
TypeScript
![]() |
import axios, {AxiosInstance, AxiosRequestConfig, CreateAxiosDefaults} from 'axios';
|
||
|
import {md5, randomStr} from "./index";
|
||
|
|
||
|
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',
|
||
|
}
|
||
|
|
||
|
export function CreateEmail(tempMailType: TempEmailType, options?: BaseOptions): BaseEmail {
|
||
|
switch (tempMailType) {
|
||
|
case TempEmailType.TempEmail44:
|
||
|
return new TempMail44(options);
|
||
|
case TempEmailType.TempEmail:
|
||
|
return new TempMail(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<string>
|
||
|
|
||
|
public abstract waitMails(): Promise<BaseMailMessage[]>
|
||
|
}
|
||
|
|
||
|
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 = axios.create({
|
||
|
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<string> {
|
||
|
this.address = `${randomStr()}${await this.randomDomain()}`;
|
||
|
this.mailID = md5(this.address);
|
||
|
return this.address;
|
||
|
}
|
||
|
|
||
|
public async waitMails(): Promise<TempMailMessage[]> {
|
||
|
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++;
|
||
|
}, 1000);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
async getDomainsList(): Promise<string[]> {
|
||
|
const res = await this.client.get(`/domains/`);
|
||
|
return res.data;
|
||
|
}
|
||
|
|
||
|
async randomDomain(): Promise<string> {
|
||
|
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 = axios.create({
|
||
|
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<string> {
|
||
|
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<TempMailMessage[]> {
|
||
|
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++;
|
||
|
}, 1000);
|
||
|
});
|
||
|
}
|
||
|
}
|