diff --git a/README.md b/README.md
index 7cf5f51..af19001 100644
--- a/README.md
+++ b/README.md
@@ -75,6 +75,7 @@
- 至少准备一种验证码接收方式:
- DuckDuckGo `@duck.com` + QQ / 163 / Inbucket 转发
- Cloudflare 自定义域邮箱前缀 + QQ / 163 / Inbucket 转发
+ - iCloud Hide My Email,可选择直接从 iCloud 收件箱收码,或转发到 QQ / 163 / 163 VIP / 126 / Gmail 后收码
- 手动填写一个可收信邮箱
- 如果使用 `QQ` / `163` / `163 VIP` / `126` / `Inbucket`,对应页面需要提前能正常打开
@@ -592,6 +593,7 @@ Cloudflare 模式下,插件不会再调用 Cloudflare API 创建路由。
支持:
- `Hotmail`(远程服务 / 本地助手)
+- `iCloud` 收件箱,或 iCloud Hide My Email 转发到 QQ / 163 / 163 VIP / 126 / Gmail 后收码
- `content/qq-mail.js`
- `content/mail-163.js`(163 / 163 VIP / 126)
- `content/inbucket-mail.js`
@@ -773,7 +775,7 @@ content/utils.js 通用工具:等待元素、点击、日志、停
content/vps-panel.js CPA 面板步骤:内部 OAuth 刷新 / Step 10
content/signup-page.js ChatGPT 官网 + OpenAI 注册/登录页步骤:Step 1 / 2 / 3 / 5 / 7 / 9
hotmail-utils.js Hotmail 收信相关通用辅助
-mail-provider-utils.js 网页邮箱 provider 配置辅助
+mail-provider-utils.js 网页邮箱 provider 与 iCloud 转发收码配置辅助
content/duck-mail.js Duck 邮箱自动获取
content/qq-mail.js QQ 邮箱验证码轮询
content/mail-163.js 163 / 163 VIP / 126 邮箱验证码轮询
diff --git a/background.js b/background.js
index 9d3e61e..8190aae 100644
--- a/background.js
+++ b/background.js
@@ -39,6 +39,7 @@ importScripts(
'luckmail-utils.js',
'cloudflare-temp-email-utils.js',
'icloud-utils.js',
+ 'mail-provider-utils.js',
'content/activation-utils.js'
);
@@ -145,6 +146,11 @@ const {
pickReusableIcloudAlias,
toNormalizedEmailSet,
} = self.IcloudUtils;
+const {
+ getIcloudForwardMailConfig: getSharedIcloudForwardMailConfig,
+ normalizeIcloudForwardMailProvider,
+ normalizeIcloudTargetMailboxType,
+} = self.MailProviderUtils;
const {
isRecoverableStep9AuthFailure,
} = self.MultiPageActivationUtils;
@@ -369,6 +375,8 @@ const PERSISTED_SETTING_DEFAULTS = {
customEmailPool: [],
autoDeleteUsedIcloudAlias: false,
icloudHostPreference: 'auto',
+ icloudTargetMailboxType: 'icloud-inbox',
+ icloudForwardMailProvider: 'qq',
icloudFetchMode: 'reuse_existing',
accountRunHistoryTextEnabled: true,
accountRunHistoryHelperBaseUrl: DEFAULT_ACCOUNT_RUN_HISTORY_HELPER_BASE_URL,
@@ -1105,6 +1113,10 @@ function normalizePersistentSettingValue(key, value) {
return Boolean(value);
case 'icloudHostPreference':
return normalizeIcloudHost(value) || 'auto';
+ case 'icloudTargetMailboxType':
+ return normalizeIcloudTargetMailboxType(value);
+ case 'icloudForwardMailProvider':
+ return normalizeIcloudForwardMailProvider(value);
case 'icloudFetchMode':
return normalizeIcloudFetchMode(value);
case 'accountRunHistoryHelperBaseUrl':
@@ -7317,6 +7329,17 @@ function getMailConfig(state) {
const configuredHost = getConfiguredIcloudHostPreference(state)
|| normalizeIcloudHost(state?.preferredIcloudHost)
|| 'icloud.com';
+ const targetMailboxType = normalizeIcloudTargetMailboxType(state?.icloudTargetMailboxType);
+ const useForwardMailbox = targetMailboxType === 'forward-mailbox';
+ if (useForwardMailbox) {
+ const forwardProvider = normalizeIcloudForwardMailProvider(state?.icloudForwardMailProvider);
+ const forwardConfig = getSharedIcloudForwardMailConfig(forwardProvider);
+ return {
+ ...forwardConfig,
+ label: `iCloud 转发(${forwardConfig.label})`,
+ icloudForwarding: true,
+ };
+ }
const loginUrl = getIcloudLoginUrlForHost(configuredHost) || 'https://www.icloud.com/';
const mailUrl = getIcloudMailUrlForHost(configuredHost) || loginUrl;
return {
diff --git a/mail-provider-utils.js b/mail-provider-utils.js
index cccb000..6bd3960 100644
--- a/mail-provider-utils.js
+++ b/mail-provider-utils.js
@@ -1,5 +1,15 @@
const HOTMAIL_PROVIDER = 'hotmail-api';
+const GMAIL_PROVIDER = 'gmail';
const NETEASE_LIST_PATH = '/js6/main.jsp?df=mail163_letter#module=mbox.ListModule%7C%7B%22fid%22%3A1%2C%22order%22%3A%22date%22%2C%22desc%22%3Atrue%7D';
+const ICLOUD_TARGET_MAILBOX_TYPE_INBOX = 'icloud-inbox';
+const ICLOUD_TARGET_MAILBOX_TYPE_FORWARD = 'forward-mailbox';
+const ICLOUD_FORWARD_MAIL_PROVIDER_OPTIONS = [
+ { value: 'qq', label: 'QQ 邮箱' },
+ { value: '163', label: '163 邮箱' },
+ { value: '163-vip', label: '163 VIP 邮箱' },
+ { value: '126', label: '126 邮箱' },
+ { value: GMAIL_PROVIDER, label: 'Gmail 邮箱' },
+];
function normalizeMailProvider(value = '') {
const normalized = String(value || '').trim().toLowerCase();
@@ -16,6 +26,38 @@ function normalizeMailProvider(value = '') {
}
}
+function normalizeIcloudTargetMailboxType(value = '') {
+ return String(value || '').trim().toLowerCase() === ICLOUD_TARGET_MAILBOX_TYPE_FORWARD
+ ? ICLOUD_TARGET_MAILBOX_TYPE_FORWARD
+ : ICLOUD_TARGET_MAILBOX_TYPE_INBOX;
+}
+
+function normalizeIcloudForwardMailProvider(value = '') {
+ const normalized = String(value || '').trim().toLowerCase();
+ return ICLOUD_FORWARD_MAIL_PROVIDER_OPTIONS.some((option) => option.value === normalized)
+ ? normalized
+ : 'qq';
+}
+
+function getIcloudForwardMailProviderOptions() {
+ return ICLOUD_FORWARD_MAIL_PROVIDER_OPTIONS.map((option) => ({ ...option }));
+}
+
+function getIcloudForwardMailConfig(provider = 'qq') {
+ const normalizedProvider = normalizeIcloudForwardMailProvider(provider);
+ if (normalizedProvider === GMAIL_PROVIDER) {
+ return {
+ source: 'gmail-mail',
+ url: 'https://mail.google.com/mail/u/0/#inbox',
+ label: 'Gmail 邮箱',
+ inject: ['content/activation-utils.js', 'content/utils.js', 'content/gmail-mail.js'],
+ injectSource: 'gmail-mail',
+ };
+ }
+
+ return getMailProviderConfig({ mailProvider: normalizedProvider });
+}
+
function getMailProviderConfig(state = {}, options = {}) {
const provider = normalizeMailProvider(state.mailProvider);
const normalizeInbucketOrigin = options.normalizeInbucketOrigin || (() => '');
@@ -66,8 +108,13 @@ function getMailProviderConfig(state = {}, options = {}) {
}
const api = {
+ GMAIL_PROVIDER,
HOTMAIL_PROVIDER,
+ getIcloudForwardMailConfig,
+ getIcloudForwardMailProviderOptions,
getMailProviderConfig,
+ normalizeIcloudForwardMailProvider,
+ normalizeIcloudTargetMailboxType,
normalizeMailProvider,
};
diff --git a/sidepanel/sidepanel.html b/sidepanel/sidepanel.html
index adf2fa0..7a49664 100644
--- a/sidepanel/sidepanel.html
+++ b/sidepanel/sidepanel.html
@@ -685,6 +685,23 @@
+
+ 目标邮箱类型
+
+
+
+ 转发邮箱
+
+
获取策略