from flask import Flask, request, jsonify
from flask_cors import CORS
import smtplib
import ssl  # 导入 SSL 模块，兼容 Python 3.7
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import os
from dotenv import load_dotenv

# 加载 1.env 环境变量文件（指定 GBK 编码，兼容 Windows 系统）
try:
    with open("1.env", "r", encoding="UTF-8") as f:
        load_dotenv(stream=f)
    print("1.env 文件加载成功（编码）")
except Exception as e:
    print(f"1.env 文件加载失败：{str(e)}")
    print("将尝试使用系统环境变量或默认值")

# 读取环境变量（添加默认值，避免 None 报错）
SMTP_HOST = os.getenv("SMTP_HOST", "smtp.qq.com")  # 默认 QQ 邮箱 SMTP 服务器
SMTP_PORT = int(os.getenv("SMTP_PORT", 465))  # 默认 SSL 端口 465
SMTP_USER = os.getenv("SMTP_USER", "")  # 发送方邮箱（必须在 1.env 中配置）
SMTP_PASS = os.getenv("SMTP_PASS", "")  # 发送方邮箱授权码（必须在 1.env 中配置）
TARGET_EMAIL = os.getenv("TARGET_EMAIL", "")  # 接收方邮箱（必须在 1.env 中配置）

# 初始化 Flask 应用
app = Flask(__name__)
# 跨域配置：开发环境允许所有域名，生产环境可修改为指定域名
CORS(app, resources={r"/send-email": {"origins": "*"}})

def send_email(name, email, content):
    """发送邮件核心函数（增强错误捕获和兼容性）"""
    # 验证核心配置是否存在
    if not SMTP_USER or not SMTP_PASS or not TARGET_EMAIL:
        print("错误：SMTP_USER、SMTP_PASS、TARGET_EMAIL 配置不能为空！")
        return False

    # 创建邮件对象
    msg = MIMEMultipart()
    try:
        # 邮件主题（处理中文编码）
        subject = f"新的网站留言 - 来自 {name}"
        msg["Subject"] = Header(subject, "utf-8")
        
        # 发件人（显示名称 + 实际邮箱）
        msg["From"] = f"{Header(name, 'utf-8')} <{SMTP_USER}>"
        
        # 收件人（支持多个邮箱，用逗号分隔）
        msg["To"] = Header(TARGET_EMAIL, "utf-8")
        
        # 邮件正文（HTML 格式，支持换行）
        html_content = f"""
        <!DOCTYPE html>
        <html>
        <body>
            <h3 style="color: #333; border-bottom: 1px solid #eee; padding-bottom: 10px;">网站留言通知</h3>
            <p><strong>发送人：</strong>{name}</p>
            {f'<p><strong>联系邮箱：</strong>{email}</p>' if email else '<p><strong>联系邮箱：</strong>未提供</p>'}
            <p><strong>留言内容：</strong></p>
            <div style="background: #f5f5f5; padding: 15px; border-radius: 4px; margin: 10px 0;">
                <p style="margin: 0; white-space: pre-line;">{content}</p>
            </div>
            <p style="color: #666; font-size: 12px; margin-top: 20px;">此邮件由网站自动发送，请勿直接回复</p>
        </body>
        </html>
        """
        msg.attach(MIMEText(html_content, "html", "utf-8"))
    except Exception as e:
        print(f"邮件内容构建失败：错误类型：{type(e).__name__}，详情：{str(e)}")
        return False

    # 发送邮件（兼容 Python 3.7 的 SSL 配置）
    try:
        # 创建 SSL 上下文（解决 Python 3.7 握手问题）
        context = ssl.create_default_context()
        # 连接 SMTP 服务器（SSL 加密）
        with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, context=context, timeout=15) as server:
            # 打印调试信息
            print(f"\n=== 邮件发送调试信息 ===")
            print(f"SMTP 服务器：{SMTP_HOST}:{SMTP_PORT}")
            print(f"发送方邮箱：{SMTP_USER}")
            print(f"接收方邮箱：{TARGET_EMAIL}")
            print(f"邮件主题：{subject}")
            
            # 登录邮箱
            server.login(SMTP_USER, SMTP_PASS)
            print("邮箱登录成功")
            
            # 拆分多个接收邮箱，发送邮件
            recipient_list = [email.strip() for email in TARGET_EMAIL.split(",") if email.strip()]
            server.sendmail(SMTP_USER, recipient_list, msg.as_string())
            print("邮件发送成功！")
        return True
    except smtplib.SMTPAuthenticationError:
        print("错误：邮箱登录失败！请检查 SMTP_USER（发送方邮箱）和 SMTP_PASS（授权码）是否正确")
        return False
    except smtplib.SMTPConnectError:
        print(f"错误：无法连接到 SMTP 服务器 {SMTP_HOST}:{SMTP_PORT}！请检查服务器地址和端口是否正确")
        return False
    except ssl.SSLError:
        print("错误：SSL 连接失败！可能是端口不匹配（465 对应 SSL，587 对应 TLS）")
        return False
    except Exception as e:
        print(f"邮件发送失败：错误类型：{type(e).__name__}，详情：{str(e)}")
        return False

# 邮件发送接口
@app.route("/send-email", methods=["POST"])
def handle_send_email():
    try:
        # 接收前端 JSON 数据
        data = request.get_json()
        if not data:
            return jsonify({"message": "请提交有效的表单数据"}), 400
        
        # 获取并验证表单数据
        name = data.get("name", "").strip()
        email = data.get("email", "").strip()
        content = data.get("content", "").strip()
        
        if not name:
            return jsonify({"message": "您的姓名不能为空"}), 400
        if not content:
            return jsonify({"message": "留言内容不能为空"}), 400
        
        # 调用发送邮件函数
        send_success = send_email(name, email, content)
        if send_success:
            return jsonify({"message": "邮件发送成功！我们会尽快回复您"}), 200
        else:
            return jsonify({"message": "邮件发送失败，请稍后再试"}), 500
    except Exception as e:
        print(f"接口处理失败：{str(e)}")
        return jsonify({"message": "服务器内部错误，请稍后再试"}), 500

# 启动服务器（开发环境启用 debug，生产环境需关闭）
if __name__ == "__main__":
    print(f"服务器启动中... 端口：5000")
    print(f"SMTP 配置预览：{SMTP_HOST}:{SMTP_PORT}（发送方：{SMTP_USER}）")
    app.run(debug=True, host="0.0.0.0", port=5000)