fix: keep mail and CPA traffic direct

This commit is contained in:
mmc
2026-03-19 11:44:39 +08:00
parent e312a62b08
commit fdada7c8db
5 changed files with 48 additions and 17 deletions

View File

@@ -22,6 +22,8 @@
作用:注册 OpenAI 时使用的固定代理。 作用:注册 OpenAI 时使用的固定代理。
注意:这个代理只用于 OpenAI 注册流程;邮箱服务接口默认直连,不使用代理。
常见填写示例: 常见填写示例:
```json ```json
@@ -95,6 +97,28 @@
} }
``` ```
当前建议DuckMail 直连,不要走 OpenAI 的代理;否则在当前环境下可能出现 `502 Bad Gateway`
如果你填写了 `domain`,程序会固定使用这个域名创建邮箱,不会再随机选择其他 DuckMail 域名。
例如:
```json
"duckmail": {
"api_base": "https://api.duckmail.sbs",
"bearer_token": "your_duckmail_token",
"domain": "cursors.online"
}
```
实际创建出来的邮箱会像:
```text
ocxxxxxxx@cursors.online
```
也就是说,前缀是程序随机生成的,但域名会固定用你填写的 `cursors.online`
### `moemail` ### `moemail`
如果你有 MoeMail 服务: 如果你有 MoeMail 服务:

View File

@@ -69,6 +69,10 @@ python3 /root/standalone_cli/run.py config setup
- `http://127.0.0.1:17891` - `http://127.0.0.1:17891`
说明:这个 `proxy` 用于 OpenAI 注册流程,邮箱服务接口默认直连,不走代理。
如果你在 DuckMail 配置里填写了 `domain`,程序会固定使用这个域名创建邮箱,不会随机切换到其他 DuckMail 域名。
模板里的 URL 现在使用了更明确的占位值: 模板里的 URL 现在使用了更明确的占位值:
- `https://your-cpa.example.com` - `https://your-cpa.example.com`

View File

@@ -201,6 +201,7 @@ def handle_register(args: argparse.Namespace) -> dict[str, Any]:
try: try:
provider_name, provider = mail_router.next_provider() provider_name, provider = mail_router.next_provider()
print(f"[*] 本次使用邮箱提供商: {provider_name}") print(f"[*] 本次使用邮箱提供商: {provider_name}")
print("[*] 邮箱接口默认直连,不使用代理")
token_json = register_run( token_json = register_run(
proxy, proxy,
mail_provider=provider, mail_provider=provider,
@@ -234,7 +235,7 @@ def handle_register(args: argparse.Namespace) -> dict[str, Any]:
run_result: dict[str, Any] = {"ok": True, "file": file_name, "email": email} run_result: dict[str, Any] = {"ok": True, "file": file_name, "email": email}
cpa = get_pool_maintainer(cfg) cpa = get_pool_maintainer(cfg)
if cpa: if cpa:
cpa_ok = cpa.upload_token(file_name, token_data, proxy=proxy or "") cpa_ok = cpa.upload_token(file_name, token_data, proxy="")
run_result["cpa_uploaded"] = cpa_ok run_result["cpa_uploaded"] = cpa_ok
print(f"[{'+' if cpa_ok else '-'}] CPA {'上传成功' if cpa_ok else '上传失败'}: {email}") print(f"[{'+' if cpa_ok else '-'}] CPA {'上传成功' if cpa_ok else '上传失败'}: {email}")
if cfg.get("auto_sync"): if cfg.get("auto_sync"):
@@ -328,6 +329,7 @@ def handle_config_setup(args: argparse.Namespace) -> dict[str, Any]:
cfg = load_sync_config() cfg = load_sync_config()
print("开始交互式配置,直接回车表示使用当前值。\n") print("开始交互式配置,直接回车表示使用当前值。\n")
print("说明: OpenAI 注册流程使用 `proxy`,邮箱接口默认直连,不使用代理。\n")
cfg["proxy"] = _prompt_text("1) 注册代理地址", str(cfg.get("proxy") or "http://127.0.0.1:17891")) cfg["proxy"] = _prompt_text("1) 注册代理地址", str(cfg.get("proxy") or "http://127.0.0.1:17891"))
cfg["auto_register"] = _prompt_bool("2) 池不足时自动注册", bool(cfg.get("auto_register", False))) cfg["auto_register"] = _prompt_bool("2) 池不足时自动注册", bool(cfg.get("auto_register", False)))
@@ -345,7 +347,9 @@ def handle_config_setup(args: argparse.Namespace) -> dict[str, Any]:
elif provider_name == "duckmail": elif provider_name == "duckmail":
provider_cfg["api_base"] = _prompt_text(" DuckMail API 地址", str(provider_cfg.get("api_base") or "https://api.duckmail.sbs")) provider_cfg["api_base"] = _prompt_text(" DuckMail API 地址", str(provider_cfg.get("api_base") or "https://api.duckmail.sbs"))
provider_cfg["bearer_token"] = _prompt_text(" DuckMail Bearer Token", str(provider_cfg.get("bearer_token") or "")) provider_cfg["bearer_token"] = _prompt_text(" DuckMail Bearer Token", str(provider_cfg.get("bearer_token") or ""))
provider_cfg["domain"] = _prompt_text(" DuckMail 域名(可留空)", str(provider_cfg.get("domain") or "")) provider_cfg["domain"] = _prompt_text(" DuckMail 域名(填写后将固定使用该域名,不再随机选域)", str(provider_cfg.get("domain") or ""))
if provider_cfg.get("domain"):
print(f" 已固定 DuckMail 域名: {provider_cfg['domain']},后续邮箱会使用该域名。")
elif provider_name == "moemail": elif provider_name == "moemail":
provider_cfg["api_base"] = _prompt_text(" MoeMail API 地址", str(provider_cfg.get("api_base") or "")) provider_cfg["api_base"] = _prompt_text(" MoeMail API 地址", str(provider_cfg.get("api_base") or ""))
provider_cfg["api_key"] = _prompt_text(" MoeMail API Key", str(provider_cfg.get("api_key") or "")) provider_cfg["api_key"] = _prompt_text(" MoeMail API Key", str(provider_cfg.get("api_key") or ""))

View File

@@ -1325,17 +1325,17 @@ def run(
emitter.info("正在创建临时邮箱...", step="create_email") emitter.info("正在创建临时邮箱...", step="create_email")
try: try:
email, dev_token = mail_provider.create_mailbox( email, dev_token = mail_provider.create_mailbox(
proxy=static_proxy, proxy="",
proxy_selector=mail_proxy_selector, proxy_selector=None,
) )
except TypeError: except TypeError:
email, dev_token = mail_provider.create_mailbox(proxy=static_proxy) email, dev_token = mail_provider.create_mailbox(proxy="")
else: else:
emitter.info("正在创建 Mail.tm 临时邮箱...", step="create_email") emitter.info("正在创建 Mail.tm 临时邮箱...", step="create_email")
email, dev_token = get_email_and_token( email, dev_token = get_email_and_token(
static_proxies, None,
emitter, emitter,
proxy_selector=mail_proxies_selector, proxy_selector=None,
) )
if not email or not dev_token: if not email or not dev_token:
emitter.error("临时邮箱创建失败", step="create_email") emitter.error("临时邮箱创建失败", step="create_email")
@@ -1487,25 +1487,25 @@ def run(
code = mail_provider.wait_for_otp( code = mail_provider.wait_for_otp(
dev_token, dev_token,
email, email,
proxy=static_proxy, proxy="",
proxy_selector=mail_proxy_selector, proxy_selector=None,
stop_event=stop_event, stop_event=stop_event,
) )
except TypeError: except TypeError:
code = mail_provider.wait_for_otp( code = mail_provider.wait_for_otp(
dev_token, dev_token,
email, email,
proxy=static_proxy, proxy="",
stop_event=stop_event, stop_event=stop_event,
) )
else: else:
code = get_oai_code( code = get_oai_code(
dev_token, dev_token,
email, email,
static_proxies, None,
emitter, emitter,
stop_event, stop_event,
proxy_selector=mail_proxies_selector, proxy_selector=None,
) )
if not code: if not code:
return None return None
@@ -1765,12 +1765,12 @@ def run(
return None return None
try: try:
_otp_code2 = mail_provider.wait_for_otp( _otp_code2 = mail_provider.wait_for_otp(
dev_token, email, proxy=static_proxy, dev_token, email, proxy="",
proxy_selector=mail_proxy_selector, stop_event=stop_event, proxy_selector=None, stop_event=stop_event,
) )
except TypeError: except TypeError:
_otp_code2 = mail_provider.wait_for_otp( _otp_code2 = mail_provider.wait_for_otp(
dev_token, email, proxy=static_proxy, stop_event=stop_event, dev_token, email, proxy="", stop_event=stop_event,
) )
if not _otp_code2 or _otp_code2 in _tried_codes: if not _otp_code2 or _otp_code2 in _tried_codes:
time.sleep(2) time.sleep(2)

View File

@@ -743,7 +743,6 @@ def upload_all_tokens_to_cpa(cfg: Optional[Dict[str, Any]] = None, skip_uploaded
maintainer = get_pool_maintainer(config) maintainer = get_pool_maintainer(config)
if not maintainer: if not maintainer:
raise ValueError("请先配置 CPA 地址和 Token") raise ValueError("请先配置 CPA 地址和 Token")
proxy = str(config.get("proxy") or "").strip()
results = [] results = []
for path in iter_token_files(): for path in iter_token_files():
try: try:
@@ -751,7 +750,7 @@ def upload_all_tokens_to_cpa(cfg: Optional[Dict[str, Any]] = None, skip_uploaded
if skip_uploaded and "cpa" in extract_uploaded_platforms(token_data): if skip_uploaded and "cpa" in extract_uploaded_platforms(token_data):
results.append({"file": path.name, "email": token_data.get("email", path.name), "ok": True, "skipped": True}) results.append({"file": path.name, "email": token_data.get("email", path.name), "ok": True, "skipped": True})
continue continue
ok = maintainer.upload_token(path.name, token_data, proxy=proxy) ok = maintainer.upload_token(path.name, token_data, proxy="")
if ok: if ok:
mark_token_uploaded_platform(path, "cpa") mark_token_uploaded_platform(path, "cpa")
results.append({"file": path.name, "email": token_data.get("email", path.name), "ok": ok, "skipped": False}) results.append({"file": path.name, "email": token_data.get("email", path.name), "ok": ok, "skipped": False})