111 lines
3.5 KiB
Python
111 lines
3.5 KiB
Python
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() |