| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- (function attachGeneratedEmailHelpers(root, factory) {
- root.MultiPageGeneratedEmailHelpers = factory();
- })(typeof self !== 'undefined' ? self : globalThis, function createGeneratedEmailHelpersModule() {
- const A4SKY_PROVIDER = 'a4sky';
- function createGeneratedEmailHelpers(deps = {}) {
- const {
- addLog,
- buildGeneratedAliasEmail,
- buildCloudflareTempEmailHeaders,
- CLOUDFLARE_TEMP_EMAIL_GENERATOR,
- DUCK_AUTOFILL_URL,
- fetch,
- fetchIcloudHideMyEmail,
- getCloudflareTempEmailAddressFromResponse,
- getCloudflareTempEmailConfig,
- getState,
- joinCloudflareTempEmailUrl,
- normalizeCloudflareDomain,
- normalizeCloudflareTempEmailAddress,
- normalizeEmailGenerator,
- isGeneratedAliasProvider,
- reuseOrCreateTab,
- sendToContentScript,
- setEmailState,
- throwIfStopped,
- } = deps;
- function padNumber(value) {
- return String(value).padStart(2, '0');
- }
- function buildA4skyTimestamp(date = new Date()) {
- return [
- date.getFullYear(),
- padNumber(date.getMonth() + 1),
- padNumber(date.getDate()),
- padNumber(date.getHours()),
- padNumber(date.getMinutes()),
- padNumber(date.getSeconds()),
- ].join('');
- }
- async function fetchA4skyEmail() {
- throwIfStopped();
- const email = `n${buildA4skyTimestamp()}@edu.a4sky.com`;
- await setEmailState(email);
- await addLog(`A4Sky 邮箱:已生成 ${email}`, 'ok');
- return email;
- }
- function generateCloudflareAliasLocalPart() {
- const letters = 'abcdefghijklmnopqrstuvwxyz';
- const digits = '0123456789';
- const chars = [];
- for (let i = 0; i < 6; i++) {
- chars.push(letters[Math.floor(Math.random() * letters.length)]);
- }
- for (let i = 0; i < 4; i++) {
- chars.push(digits[Math.floor(Math.random() * digits.length)]);
- }
- for (let i = chars.length - 1; i > 0; i--) {
- const j = Math.floor(Math.random() * (i + 1));
- [chars[i], chars[j]] = [chars[j], chars[i]];
- }
- return chars.join('');
- }
- async function fetchCloudflareEmail(state, options = {}) {
- throwIfStopped();
- const latestState = state || await getState();
- const domain = normalizeCloudflareDomain(latestState.cloudflareDomain);
- if (!domain) {
- throw new Error('Cloudflare 域名为空或格式无效。');
- }
- const localPart = String(options.localPart || '').trim().toLowerCase() || generateCloudflareAliasLocalPart();
- const aliasEmail = `${localPart}@${domain}`;
- await setEmailState(aliasEmail);
- await addLog(`Cloudflare 邮箱:已生成 ${aliasEmail}`, 'ok');
- return aliasEmail;
- }
- function ensureCloudflareTempEmailConfig(state, options = {}) {
- const {
- requireAdminAuth = false,
- requireDomain = false,
- } = options;
- const config = getCloudflareTempEmailConfig(state);
- if (!config.baseUrl) {
- throw new Error('Cloudflare Temp Email 服务地址为空或格式无效。');
- }
- if (requireAdminAuth && !config.adminAuth) {
- throw new Error('Cloudflare Temp Email 缺少 Admin Auth。');
- }
- if (requireDomain && !config.domain) {
- throw new Error('Cloudflare Temp Email 域名为空或格式无效。');
- }
- return config;
- }
- async function requestCloudflareTempEmailJson(config, path, options = {}) {
- const {
- method = 'GET',
- payload,
- searchParams,
- timeoutMs = 20000,
- } = options;
- const url = new URL(joinCloudflareTempEmailUrl(config.baseUrl, path));
- if (searchParams && typeof searchParams === 'object') {
- for (const [key, value] of Object.entries(searchParams)) {
- if (value === undefined || value === null || value === '') continue;
- url.searchParams.set(key, String(value));
- }
- }
- const controller = new AbortController();
- const timeoutId = setTimeout(() => controller.abort(new Error('timeout')), timeoutMs);
- let response;
- try {
- response = await fetch(url.toString(), {
- method,
- headers: buildCloudflareTempEmailHeaders(config, {
- json: payload !== undefined,
- }),
- body: payload !== undefined ? JSON.stringify(payload) : undefined,
- signal: controller.signal,
- });
- } catch (err) {
- const errorMessage = err?.name === 'AbortError'
- ? `Cloudflare Temp Email 请求超时(>${Math.round(timeoutMs / 1000)} 秒)`
- : `Cloudflare Temp Email 请求失败:${err.message}`;
- throw new Error(errorMessage);
- } finally {
- clearTimeout(timeoutId);
- }
- const text = await response.text();
- let parsed;
- try {
- parsed = text ? JSON.parse(text) : {};
- } catch {
- parsed = text;
- }
- if (!response.ok) {
- const payloadError = typeof parsed === 'object' && parsed
- ? (parsed.message || parsed.error || parsed.msg)
- : '';
- throw new Error(`Cloudflare Temp Email 请求失败:${payloadError || text || `HTTP ${response.status}`}`);
- }
- return parsed;
- }
- async function fetchCloudflareTempEmailAddress(state, options = {}) {
- throwIfStopped();
- const latestState = state || await getState();
- const config = ensureCloudflareTempEmailConfig(latestState, {
- requireAdminAuth: true,
- requireDomain: true,
- });
- const requestedName = String(options.localPart || options.name || '').trim().toLowerCase() || generateCloudflareAliasLocalPart();
- const payload = {
- enablePrefix: true,
- name: requestedName,
- domain: config.domain,
- };
- const result = await requestCloudflareTempEmailJson(config, '/admin/new_address', {
- method: 'POST',
- payload,
- });
- const address = normalizeCloudflareTempEmailAddress(getCloudflareTempEmailAddressFromResponse(result));
- if (!address) {
- throw new Error('Cloudflare Temp Email 未返回可用邮箱地址。');
- }
- await setEmailState(address);
- await addLog(`Cloudflare Temp Email:已生成 ${address}`, 'ok');
- return address;
- }
- async function fetchDuckEmail(options = {}) {
- throwIfStopped();
- const { generateNew = true } = options;
- await addLog(`Duck 邮箱:正在打开自动填充设置(${generateNew ? '生成新地址' : '复用当前地址'})...`);
- await reuseOrCreateTab('duck-mail', DUCK_AUTOFILL_URL);
- const result = await sendToContentScript('duck-mail', {
- type: 'FETCH_DUCK_EMAIL',
- source: 'background',
- payload: { generateNew },
- });
- if (result?.error) {
- throw new Error(result.error);
- }
- if (!result?.email) {
- throw new Error('未返回 Duck 邮箱地址。');
- }
- await setEmailState(result.email);
- await addLog(`Duck 邮箱:${result.generated ? '已生成' : '已读取'} ${result.email}`, 'ok');
- return result.email;
- }
- async function fetchManagedAliasEmail(state, options = {}) {
- throwIfStopped();
- const provider = String(options.mailProvider || state?.mailProvider || '').trim().toLowerCase();
- const mergedState = {
- ...(state || {}),
- mailProvider: provider,
- };
- if (options.gmailBaseEmail !== undefined) {
- mergedState.gmailBaseEmail = String(options.gmailBaseEmail || '').trim();
- }
- if (options.mail2925BaseEmail !== undefined) {
- mergedState.mail2925BaseEmail = String(options.mail2925BaseEmail || '').trim();
- }
- const email = buildGeneratedAliasEmail(mergedState);
- await setEmailState(email);
- await addLog(`${provider === 'gmail' ? 'Gmail +tag' : '2925'}:已生成 ${email}`, 'ok');
- return email;
- }
- async function fetchGeneratedEmail(state, options = {}) {
- const currentState = state || await getState();
- const provider = String(options.mailProvider || currentState.mailProvider || '').trim().toLowerCase();
- if (provider === A4SKY_PROVIDER) {
- return fetchA4skyEmail();
- }
- if (isGeneratedAliasProvider?.(provider)) {
- return fetchManagedAliasEmail(currentState, options);
- }
- const generator = normalizeEmailGenerator(options.generator ?? currentState.emailGenerator);
- if (generator === 'custom') {
- throw new Error('当前邮箱生成方式为自定义邮箱,请直接填写注册邮箱。');
- }
- if (generator === 'icloud') {
- return fetchIcloudHideMyEmail();
- }
- if (generator === 'cloudflare') {
- return fetchCloudflareEmail(currentState, options);
- }
- if (generator === CLOUDFLARE_TEMP_EMAIL_GENERATOR) {
- return fetchCloudflareTempEmailAddress(currentState, options);
- }
- return fetchDuckEmail(options);
- }
- return {
- ensureCloudflareTempEmailConfig,
- fetchA4skyEmail,
- fetchCloudflareEmail,
- fetchCloudflareTempEmailAddress,
- fetchDuckEmail,
- fetchGeneratedEmail,
- buildA4skyTimestamp,
- generateCloudflareAliasLocalPart,
- requestCloudflareTempEmailJson,
- };
- }
- return {
- createGeneratedEmailHelpers,
- };
- });
|