feat(config): load mail provider api keys from env

This commit is contained in:
Logic
2026-03-21 15:41:02 +08:00
parent cf20b9acc6
commit 624ca1e1cc
3 changed files with 24 additions and 7 deletions

View File

@@ -49,6 +49,12 @@ SOCKS5_PROXY=socks5://user:pass@host:port
# 临时邮箱服务可选vmail / mailtm / yyds
MAIL_PROVIDER=vmail
# vmail.devMAIL_PROVIDER=vmail 时需要)
VMAIL_API_KEY=your_vmail_api_key
# YYDS MailMAIL_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` 传入验证码。

View File

@@ -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"

View File

@@ -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