import os import argparse import logging import platform from app import create_app from app.services import SMTPServer, MailStore, EmailProcessor from app.services import register_smtp_server, register_mail_store, register_email_processor from app.models import get_session from flask import Flask # 检测是否Windows环境 IS_WINDOWS = platform.system().lower() == 'windows' # 解析命令行参数 parser = argparse.ArgumentParser(description='启动邮箱系统') parser.add_argument('--host', type=str, default='0.0.0.0', help='HTTP服务器主机地址') parser.add_argument('--port', type=int, default=5000, help='HTTP服务器端口') parser.add_argument('--smtp-host', type=str, help='SMTP服务器主机地址') parser.add_argument('--smtp-port', type=int, help='SMTP服务器端口') parser.add_argument('--debug', action='store_true', help='启用调试模式') args = parser.parse_args() # 创建Flask应用 app = create_app() # Windows环境下的特殊处理 if IS_WINDOWS: try: # 尝试导入本地设置 import local_settings if getattr(local_settings, 'SMTP_HOST', None): app.config['SMTP_HOST'] = local_settings.SMTP_HOST logging.info(f"使用Windows特殊设置: SMTP_HOST={local_settings.SMTP_HOST}") if getattr(local_settings, 'SMTP_PORT', None): app.config['SMTP_PORT'] = local_settings.SMTP_PORT logging.info(f"使用Windows特殊设置: SMTP_PORT={local_settings.SMTP_PORT}") except ImportError: logging.warning("未找到local_settings.py,将使用标准配置") # 更新SMTP配置,如果命令行参数中指定了 if args.smtp_host: app.config['SMTP_HOST'] = args.smtp_host if args.smtp_port: app.config['SMTP_PORT'] = args.smtp_port # 初始化服务实例 mail_store = MailStore(get_session) smtp_server = SMTPServer( host=app.config.get('SMTP_HOST', '127.0.0.1' if IS_WINDOWS else '0.0.0.0'), port=app.config.get('SMTP_PORT', 3825 if IS_WINDOWS else 25), mail_store=mail_store ) email_processor = EmailProcessor(mail_store) # 注册服务实例到全局对象 register_mail_store(mail_store) register_smtp_server(smtp_server) register_email_processor(email_processor) def start_services(): """启动所有服务""" logging.info("正在启动所有服务...") # 启动邮件处理器 if email_processor.start(): logging.info("邮件处理器启动成功") else: logging.error("邮件处理器启动失败") # 启动SMTP服务器 if smtp_server.start(): logging.info(f"SMTP服务器启动成功,监听 {smtp_server.host}:{smtp_server.port}") else: logging.error("SMTP服务器启动失败") logging.info("所有服务已启动") def stop_services(): """停止所有服务""" logging.info("正在停止所有服务...") # 停止SMTP服务器 if smtp_server.stop(): logging.info("SMTP服务器已停止") # 停止邮件处理器 if email_processor.stop(): logging.info("邮件处理器已停止") logging.info("所有服务已停止") @app.teardown_appcontext def teardown_appcontext(exception=None): """应用上下文销毁时停止所有服务""" stop_services() if __name__ == '__main__': try: # 启动服务 start_services() # 启动Web服务器 app.run( host=args.host, port=args.port, debug=args.debug ) finally: # 确保在退出时停止所有服务 stop_services()