feat: init AI email summarization bot

- Multi-account IMAP email polling with UID tracking
- DeepSeek API integration with JSON Mode structured output
- Telegram notification with formatted MarkdownV2 message
- YAML config with dataclass-based type validation
- Graceful shutdown on SIGINT/SIGTERM
- 60s default polling interval
This commit is contained in:
2026-07-02 19:45:34 +08:00
commit e2826a3e3b
11 changed files with 364 additions and 0 deletions

49
main.py Normal file
View File

@@ -0,0 +1,49 @@
import logging
import signal
import sys
import time
from src.config import load_config
from src.summarizer import process_all
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
logger = logging.getLogger("main")
_running = True
def _signal_handler(signum, frame):
global _running
logger.info("收到退出信号,正在停止...")
_running = False
def main():
global _running
signal.signal(signal.SIGINT, _signal_handler)
signal.signal(signal.SIGTERM, _signal_handler)
cfg_path = sys.argv[1] if len(sys.argv) > 1 else "config.yaml"
cfg = load_config(cfg_path)
logger.info(f"AI邮件摘要机器人已启动轮询间隔: {cfg.polling.interval_seconds}s")
while _running:
try:
process_all(cfg)
except Exception as e:
logger.error(f"轮询出错: {e}", exc_info=True)
if _running:
for _ in range(cfg.polling.interval_seconds):
if not _running:
break
time.sleep(1)
logger.info("机器人已停止")
if __name__ == "__main__":
main()