Files
emailsystem/run.py
2025-02-25 19:50:00 +08:00

111 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()