From da2fd92f071d0fd6d049bc3559d02c256c0a4fa6 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 8 Jul 2026 13:00:06 +0800 Subject: [PATCH] support python36 --- __pycache__/app.cpython-36.pyc | Bin 0 -> 30941 bytes __pycache__/mailer.cpython-36.pyc | Bin 0 -> 18811 bytes app.py | 2 +- instance/palladium.db | Bin 0 -> 15360 bytes mailer.py | 10 +++++----- 5 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 __pycache__/app.cpython-36.pyc create mode 100644 __pycache__/mailer.cpython-36.pyc create mode 100644 instance/palladium.db diff --git a/__pycache__/app.cpython-36.pyc b/__pycache__/app.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76f8aca2309a54d8ab0f8061dd7fcd4c8cfc2b97 GIT binary patch literal 30941 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 JQ$79ne*hbS=y(7C literal 0 HcmV?d00001 diff --git a/__pycache__/mailer.cpython-36.pyc b/__pycache__/mailer.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7899060a4266faeaca7ce63506b2b93f96593745 GIT binary patch literal 18811 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 X8SZ`Vy|XFddHhq7enwpN*wcRjREj;p literal 0 HcmV?d00001 diff --git a/mailer.py b/mailer.py index f817ff1..d25990d 100644 --- a/mailer.py +++ b/mailer.py @@ -1,3 +1,4 @@ +from typing import List, Dict, Tuple, Set, Any, Optional, Union """ mailer.py — Palladium Z1 每日报告邮件发送 @@ -5,7 +6,6 @@ mailer.py — Palladium Z1 每日报告邮件发送 所有配置都从环境变量读 (生产建议用 systemd EnvironmentFile 或 .env)。 """ -from __future__ import annotations # PEP 563: 让所有 type hint 变字符串, 兼容 Python 3.7+ import os import smtplib @@ -60,7 +60,7 @@ def get_config() -> dict: } -def config_errors(cfg: dict) -> list[str]: +def config_errors(cfg: dict) -> List[str]: """检查配置是否完整可发送。返回缺失/错误项的列表 (空=OK)。""" errs = [] if not cfg["enabled"]: @@ -416,7 +416,7 @@ def _render_html(data: dict, base_url: str) -> str: # ═══════════════════════════════════════════════════════════════════════════ # 发送 # ═══════════════════════════════════════════════════════════════════════════ -def render_report(data: dict, cfg: dict) -> tuple[str, str, str]: +def render_report(data: dict, cfg: dict) -> Tuple[str, str, str]: """返回 (subject, html, text)。""" latest = data["latest"] if latest: @@ -430,7 +430,7 @@ def render_report(data: dict, cfg: dict) -> tuple[str, str, str]: return subject, html, text -def _send_smtp(cfg: dict, subject: str, html: str, text: str) -> tuple[bool, str]: +def _send_smtp(cfg: dict, subject: str, html: str, text: str) -> Tuple[bool, str]: """实际 SMTP 发送, 返回 (ok, error_msg)。""" msg = MIMEMultipart("alternative") msg["Subject"] = subject @@ -469,7 +469,7 @@ def _send_smtp(cfg: dict, subject: str, html: str, text: str) -> tuple[bool, str return (False, f"{type(e).__name__}: {e}") -def send_report(cfg: dict | None = None) -> dict: +def send_report(cfg: Optional[Dict] = None) -> dict: """ 收集数据 → 渲染 → 发送。 返回: {"ok": bool, "subject": str, "recipients": [...], "error": str, "preview_text": str}