from flask import Flask, request, jsonify, render_template from .config import Config from .utils import (get_latest_emails, get_latest_email_with_code, add_allowed_domain, remove_allowed_domain, get_allowed_domains, get_allowed_domains_with_time, get_all_emails) import redis import json import logging def create_app(): app = Flask(__name__) app.config.from_object(Config) @app.route('/emails', methods=['GET']) def get_emails(): recipient = request.args.get('recipient') limit = request.args.get('limit', default=10, type=int) if not recipient: return jsonify({'error': 'Recipient email is required'}), 400 emails = get_latest_emails(recipient, limit) return jsonify(emails) @app.route('/latest_email', methods=['GET']) def get_latest_email(): recipient = request.args.get('recipient') if not recipient: return jsonify({'error': 'Recipient email is required'}), 400 email_data = get_latest_email_with_code(recipient) if email_data: return jsonify(email_data) return jsonify({'error': 'No emails found for this recipient'}), 404 @app.route('/allowed_domains/add', methods=['POST']) def add_domain(): domain = request.json.get('domain') if not domain: return jsonify({'error': 'Domain is required'}), 400 add_allowed_domain(domain) return jsonify({'message': 'Domain added successfully'}), 201 @app.route('/allowed_domains/remove', methods=['POST']) def remove_domain(): domain = request.json.get('domain') if not domain: return jsonify({'error': 'Domain is required'}), 400 remove_allowed_domain(domain) return jsonify({'message': 'Domain removed successfully'}), 200 @app.route('/allowed_domains/list', methods=['GET']) def list_domains(): domains = get_allowed_domains() return jsonify(domains), 200 @app.route('/allowed_domains/list_with_time', methods=['GET']) def list_domains_with_time(): domains_with_time = get_allowed_domains_with_time() return jsonify(domains_with_time), 200 @app.route('/web/list') def list_emails_page(): try: emails = get_all_emails(count=50) # 检查每个邮件的 message_id for email in emails: logger.debug(f"Email message_id: {email.get('message_id')}") return render_template('email_list.html', emails=emails) except Exception as e: app.logger.error(f"Error in list_emails_page: {str(e)}") return "获取邮件列表失败", 500 @app.route('/web/email/') def view_email_page(message_id): try: logger.debug(f"Accessing email with message_id: {message_id}") # 直接从 Redis 获取邮件数据 email_key = f"email:{message_id}" logger.debug(f"Looking up Redis key: {email_key}") email_data = redis_client.hgetall(email_key) if not email_data: logger.warning(f"No data found for key: {email_key}") return "邮件不存在", 404 logger.debug(f"Found email data with fields: {list(email_data.keys())}") # 转换字节数据为字符串 email = {k.decode(): v.decode() for k, v in email_data.items()} logger.debug(f"Decoded email data: {email.keys()}") # 解析 JSON 字符串字段 for field in ['recipients', 'attachments', 'headers', 'peer']: if field in email: try: email[field] = json.loads(email[field]) logger.debug(f"Successfully parsed {field} field") except Exception as e: logger.warning(f"Failed to parse {field} field: {str(e)}") return render_template('email_detail.html', email=email) except Exception as e: logger.error(f"Error in view_email_page: {str(e)}", exc_info=True) return "获取邮件详情失败", 500 return app