feat: support custom DuckMail domains

This commit is contained in:
root
2026-03-18 22:43:16 +08:00
parent b38cb7b27c
commit d31f62891e
2 changed files with 21 additions and 12 deletions

View File

@@ -398,9 +398,10 @@ class MoeMailProvider(MailProvider):
# ==================== DuckMail ==================== # ==================== DuckMail ====================
class DuckMailProvider(MailProvider): class DuckMailProvider(MailProvider):
def __init__(self, api_base: str = "https://api.duckmail.sbs", bearer_token: str = ""): def __init__(self, api_base: str = "https://api.duckmail.sbs", bearer_token: str = "", domain: str = ""):
self.api_base = api_base.rstrip("/") self.api_base = api_base.rstrip("/")
self.bearer_token = bearer_token self.bearer_token = bearer_token
self.domain = str(domain).strip()
def _auth_headers(self, token: str = "") -> Dict[str, str]: def _auth_headers(self, token: str = "") -> Dict[str, str]:
h: Dict[str, str] = {"Accept": "application/json"} h: Dict[str, str] = {"Accept": "application/json"}
@@ -419,6 +420,8 @@ class DuckMailProvider(MailProvider):
headers["Authorization"] = f"Bearer {self.bearer_token}" headers["Authorization"] = f"Bearer {self.bearer_token}"
try: try:
domain = self.domain
if not domain:
domains_resp = session.get(f"{self.api_base}/domains", headers={"Accept": "application/json"}, timeout=15, verify=False) domains_resp = session.get(f"{self.api_base}/domains", headers={"Accept": "application/json"}, timeout=15, verify=False)
if domains_resp.status_code != 200: if domains_resp.status_code != 200:
return "", "" return "", ""
@@ -793,6 +796,7 @@ def create_provider_by_name(provider_type: str, mail_cfg: Dict[str, Any]) -> Mai
return DuckMailProvider( return DuckMailProvider(
api_base=api_base or "https://api.duckmail.sbs", api_base=api_base or "https://api.duckmail.sbs",
bearer_token=str(mail_cfg.get("bearer_token", "")).strip(), bearer_token=str(mail_cfg.get("bearer_token", "")).strip(),
domain=str(mail_cfg.get("domain", "")).strip(),
) )
elif provider_type == "cloudflare_temp_email": elif provider_type == "cloudflare_temp_email":
return CloudflareTempEmailProvider( return CloudflareTempEmailProvider(

View File

@@ -632,6 +632,11 @@
<input type="text" data-key="api_base" placeholder="https://api.duckmail.sbs" autocomplete="off" <input type="text" data-key="api_base" placeholder="https://api.duckmail.sbs" autocomplete="off"
spellcheck="false" /> spellcheck="false" />
</div> </div>
<div class="config-field">
<label>分配域名</label>
<input type="text" data-key="domain" placeholder="example.com" autocomplete="off"
spellcheck="false" />
</div>
<div class="config-field"> <div class="config-field">
<label>Bearer Token</label> <label>Bearer Token</label>
<input type="password" data-key="bearer_token" placeholder="DuckMail Bearer Token" <input type="password" data-key="bearer_token" placeholder="DuckMail Bearer Token"