初始化提交,包含完整的邮件系统代码

This commit is contained in:
huangzhenpc
2025-02-25 19:50:00 +08:00
commit aeffc4f8b8
52 changed files with 6673 additions and 0 deletions

111
run.py Normal file
View File

@@ -0,0 +1,111 @@
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()