feat(cloudflare): 支持管理员创建临时邮箱

This commit is contained in:
VitaHuang
2026-07-05 21:24:17 +08:00
parent 5bf419f824
commit 1bff080738
6 changed files with 225 additions and 27 deletions
+35 -15
View File
@@ -174,6 +174,8 @@ def cloudflare_build_headers(content_type=False):
if key:
if mode == "x-api-key":
headers["X-API-Key"] = key
elif mode == "x-admin-auth":
headers["x-admin-auth"] = key
elif mode != "none":
headers["Authorization"] = f"Bearer {key}"
return headers
@@ -188,6 +190,22 @@ def cloudflare_apply_auth_params(params=None):
return merged
def cloudflare_next_default_domain():
"""按配置轮换选择 Cloudflare 临时邮箱域名。"""
global _cf_domain_index
domains = [x.strip() for x in str(config.get("defaultDomains", "") or "").split(",") if x.strip()]
if not domains:
return ""
domain = domains[_cf_domain_index % len(domains)]
_cf_domain_index += 1
return domain
def cloudflare_is_admin_create_path(path):
"""判断当前创建邮箱路径是否为 cloudflare_temp_email 管理员创建接口。"""
return str(path or "").rstrip("/").lower() == "/admin/new_address"
def _pick_list_payload(data):
if isinstance(data, list):
return data
@@ -208,19 +226,22 @@ def _pick_list_payload(data):
def cloudflare_create_temp_address(api_base):
"""适配 cloudflare_temp_email v1.8.x: POST /api/new_address -> {address,jwt}"""
global _cf_domain_index
url = f"{api_base}/api/new_address"
payload = {}
try:
# 在多个域名之间轮换,降低单域偶发不收件导致的失败率
domains = [x.strip() for x in str(config.get("defaultDomains", "") or "").split(",") if x.strip()]
if domains:
payload["domain"] = domains[_cf_domain_index % len(domains)]
_cf_domain_index += 1
except Exception:
pass
resp = http_post(url, json=payload, headers={"Content-Type": "application/json"})
"""适配 cloudflare_temp_email 新建地址接口并兼容 admin 创建模式。"""
path = get_cloudflare_path("cloudflare_path_accounts", "/api/new_address")
url = f"{api_base}{path}"
domain = cloudflare_next_default_domain()
is_admin_create = cloudflare_is_admin_create_path(path)
if is_admin_create:
payload = {"name": generate_username(10), "enablePrefix": True}
if domain:
payload["domain"] = domain
headers = cloudflare_build_headers(content_type=True)
else:
payload = {}
if domain:
payload["domain"] = domain
headers = {"Content-Type": "application/json"}
resp = http_post(url, json=payload, headers=headers)
resp.raise_for_status()
try:
data = resp.json()
@@ -2480,7 +2501,7 @@ class GrokRegisterGUI:
add_label(2, 2, "Cloudflare 鉴权模式:")
self.cloudflare_auth_mode_var = tk.StringVar(value=config.get("cloudflare_auth_mode", "bearer"))
self.cloudflare_auth_mode_combo = tk_option_menu(
config_frame, self.cloudflare_auth_mode_var, ["query-key", "bearer", "x-api-key", "none"], width=12
config_frame, self.cloudflare_auth_mode_var, ["query-key", "bearer", "x-api-key", "x-admin-auth", "none"], width=12
)
add_field(self.cloudflare_auth_mode_combo, 2, 3, sticky=tk.W)
@@ -2989,4 +3010,3 @@ def main():
if __name__ == "__main__":
main()