适配支持2925邮箱

This commit is contained in:
yangshen
2026-04-13 11:21:31 +08:00
parent 60e4bcda38
commit 42680642c3
5 changed files with 618 additions and 9 deletions
+59
View File
@@ -67,6 +67,7 @@ const PERSISTED_SETTING_DEFAULTS = {
cloudflareDomain: '', // 仅当 emailGenerator=cloudflare 时填写自定义域名。
cloudflareDomains: [], // Cloudflare 可选域名列表。
hotmailAccounts: [],
emailPrefix: '',
};
const PERSISTED_SETTING_KEYS = Object.keys(PERSISTED_SETTING_DEFAULTS);
@@ -155,6 +156,7 @@ function normalizeMailProvider(value = '') {
case '163-vip':
case 'qq':
case 'inbucket':
case '2925':
return normalized;
default:
return PERSISTED_SETTING_DEFAULTS.mailProvider;
@@ -220,6 +222,8 @@ function normalizePersistentSettingValue(key, value) {
return normalizeMailProvider(value);
case 'emailGenerator':
return normalizeEmailGenerator(value);
case 'emailPrefix':
return String(value || '').trim();
case 'inbucketHost':
return String(value || '').trim();
case 'inbucketMailbox':
@@ -1051,6 +1055,34 @@ async function pollHotmailVerificationCode(step, state, pollPayload = {}) {
throw lastError || new Error(`步骤 ${step}:未在 Hotmail 收件箱中找到新的匹配验证码。`);
}
function generateRandomSuffix(length = 6) {
const chars = 'abcdefghjkmnpqrstuvwxyz23456789';
let suffix = '';
for (let i = 0; i < length; i++) {
suffix += chars[Math.floor(Math.random() * chars.length)];
}
return suffix;
}
function isGeneratedAliasProvider(provider) {
return provider === '2925';
}
function buildGeneratedAliasEmail(state) {
const provider = state.mailProvider || '163';
const emailPrefix = (state.emailPrefix || '').trim();
if (!emailPrefix) {
throw new Error('2925 邮箱前缀未设置,请先在侧边栏填写。');
}
if (provider === '2925') {
return `${emailPrefix}${generateRandomSuffix(6)}@2925.com`;
}
throw new Error(`未支持的别名邮箱类型:${provider}`);
}
// ============================================================
// Tab Registry
// ============================================================
@@ -1170,6 +1202,8 @@ function matchesSourceUrlFamily(source, candidateUrl, referenceUrl) {
return Boolean(reference)
&& candidate.origin === reference.origin
&& candidate.pathname.startsWith('/m/');
case 'mail-2925':
return candidate.hostname === '2925.com' || candidate.hostname === 'www.2925.com';
case 'vps-panel':
return Boolean(reference)
&& candidate.origin === reference.origin
@@ -1832,6 +1866,7 @@ function getSourceLabel(source) {
'sub2api-panel': 'SUB2API 后台',
'qq-mail': 'QQ 邮箱',
'mail-163': '163 邮箱',
'mail-2925': '2925 邮箱',
'inbucket-mail': 'Inbucket 邮箱',
'duck-mail': 'Duck 邮箱',
'hotmail-api': 'Hotmail(微软 Graph',
@@ -2541,6 +2576,10 @@ async function handleMessage(message, sender) {
if (message.payload.email) {
await setEmailState(message.payload.email);
}
if (message.payload.emailPrefix !== undefined) {
await setPersistentSettings({ emailPrefix: message.payload.emailPrefix });
await setState({ emailPrefix: message.payload.emailPrefix });
}
await executeStep(step);
return { ok: true };
}
@@ -3150,6 +3189,14 @@ async function ensureAutoEmailReady(targetRun, totalRuns, attemptRuns) {
return account.email;
}
if (isGeneratedAliasProvider(currentState.mailProvider)) {
if (!currentState.emailPrefix) {
throw new Error('2925 邮箱前缀未设置,请先在侧边栏填写。');
}
await addLog(`=== 目标 ${targetRun}/${totalRuns} 轮:2925 模式已启用,将在步骤 3 自动生成邮箱(第 ${attemptRuns} 次尝试)===`, 'info');
return null;
}
if (currentState.email) {
return currentState.email;
}
@@ -3338,6 +3385,7 @@ async function autoRunLoop(totalRuns, options = {}) {
autoRunDelayMinutes: prevState.autoRunDelayMinutes,
mailProvider: prevState.mailProvider,
emailGenerator: prevState.emailGenerator,
emailPrefix: prevState.emailPrefix,
inbucketHost: prevState.inbucketHost,
inbucketMailbox: prevState.inbucketMailbox,
cloudflareDomain: prevState.cloudflareDomain,
@@ -3663,6 +3711,8 @@ async function executeStep3(state) {
preferredAccountId: state.currentHotmailAccountId || null,
});
resolvedEmail = account.email;
} else if (isGeneratedAliasProvider(state.mailProvider)) {
resolvedEmail = buildGeneratedAliasEmail(state);
}
if (!resolvedEmail) {
@@ -3724,6 +3774,15 @@ function getMailConfig(state) {
injectSource: 'inbucket-mail',
};
}
if (provider === '2925') {
return {
source: 'mail-2925',
url: 'https://2925.com/#/mailList',
label: '2925 邮箱',
inject: ['content/utils.js', 'content/mail-2925.js'],
injectSource: 'mail-2925',
};
}
return { source: 'qq-mail', url: 'https://wx.mail.qq.com/', label: 'QQ 邮箱' };
}