From 624ca1e1cca7f4f456b4468df19986f26a7bbc7c Mon Sep 17 00:00:00 2001 From: Logic Date: Sat, 21 Mar 2026 15:41:02 +0800 Subject: [PATCH] feat(config): load mail provider api keys from env --- README.md | 12 +++++++++--- src/config.py | 1 + src/vmail_client.py | 18 ++++++++++++++---- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 539ab53..740dc0a 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,12 @@ SOCKS5_PROXY=socks5://user:pass@host:port # 临时邮箱服务(可选:vmail / mailtm / yyds) MAIL_PROVIDER=vmail +# vmail.dev(MAIL_PROVIDER=vmail 时需要) +VMAIL_API_KEY=your_vmail_api_key + +# YYDS Mail(MAIL_PROVIDER=yyds 时需要) +YYDS_API_KEY=your_yyds_api_key + # YesCaptcha(注册功能需要) YESCAPTCHA_API_KEY=your_key_here @@ -61,9 +67,9 @@ CURRENCY=usd | Provider | `MAIL_PROVIDER` 值 | 说明 | |---|---|---| -| vmail.dev | `vmail` | 默认选项;注册时会返回 `mailbox_id`,部分邮箱还会返回 `mailbox_password` | -| mail.tm | `mailtm` | 支持自动创建邮箱并轮询 OTP | -| YYDS Mail | `yyds` | 支持自动创建邮箱并轮询 OTP | +| vmail.dev | `vmail` | 需要 `VMAIL_API_KEY`;注册时会返回 `mailbox_id`,部分邮箱还会返回 `mailbox_password` | +| mail.tm | `mailtm` | 不需要 API key;支持自动创建邮箱并轮询 OTP | +| YYDS Mail | `yyds` | 需要 `YYDS_API_KEY`;支持自动创建邮箱并轮询 OTP | > `register` / `checkout` 都支持以上三种 provider。 > `codex-login` 如需自动拉取邮箱 OTP,建议优先使用 `vmail` 或 `yyds`;`mailtm` 当前更适合手动通过 `--otp` 传入验证码。 diff --git a/src/config.py b/src/config.py index 9e48c1b..3163aa9 100644 --- a/src/config.py +++ b/src/config.py @@ -4,6 +4,7 @@ from pydantic import Field class Settings(BaseSettings): vmail_api_key: str = Field(default="", env="VMAIL_API_KEY") + yyds_api_key: str = Field(default="", env="YYDS_API_KEY") yescaptcha_api_key: str = Field(default="", env="YESCAPTCHA_API_KEY") socks5_proxy: str = Field(default="", env="SOCKS5_PROXY") mail_provider: str = Field(default="vmail", env="MAIL_PROVIDER") # "vmail", "mailtm", or "yyds" diff --git a/src/vmail_client.py b/src/vmail_client.py index 685995f..1f05635 100644 --- a/src/vmail_client.py +++ b/src/vmail_client.py @@ -5,16 +5,26 @@ from abc import ABC, abstractmethod import httpx +try: + from .config import settings +except ImportError: # pragma: no cover - allow direct script execution from source tree + from config import settings + # vmail.dev config VMAIL_BASE = "https://vmail.dev/api/v1" -VMAIL_API_KEY = "vmail_UCjaCMZghzKaH5KrRlKXyxkrCO7ZNesV" # mail.tm config MAILTM_BASE = "https://api.mail.tm" # yyds mail config YYDS_BASE = "https://maliapi.215.im" -YYDS_API_KEY = "AC-4a23c58b8f84c19a27ef509e" + + +def _require_api_key(provider: str, env_name: str, value: str) -> str: + api_key = value.strip() + if api_key: + return api_key + raise RuntimeError(f"{provider} requires {env_name} to be set in the environment or .env") class BaseMailClient(ABC): @@ -39,7 +49,7 @@ class VMailClient(BaseMailClient): """vmail.dev temporary email client.""" def __init__(self): - self.api_key = VMAIL_API_KEY + self.api_key = _require_api_key("vmail.dev", "VMAIL_API_KEY", settings.vmail_api_key) self.headers = {"X-API-Key": self.api_key} self.base = VMAIL_BASE @@ -249,7 +259,7 @@ class YYDSMailClient(BaseMailClient): """YYDS Mail temporary email client (maliapi.215.im).""" def __init__(self): - self.api_key = YYDS_API_KEY + self.api_key = _require_api_key("YYDS Mail", "YYDS_API_KEY", settings.yyds_api_key) self.headers = {"X-API-Key": self.api_key} self.base = YYDS_BASE