|
|
"""
|
|
|
邮箱配置界面
|
|
|
用于设置SMTP发送邮箱
|
|
|
"""
|
|
|
import tkinter as tk
|
|
|
from tkinter import ttk, messagebox
|
|
|
from email_config import DEFAULT_SENDER_CONFIG, EMAIL_HELP_TEXT
|
|
|
import json
|
|
|
import os
|
|
|
|
|
|
class EmailConfigWindow:
|
|
|
"""邮箱配置窗口"""
|
|
|
|
|
|
def __init__(self, parent, data_manager):
|
|
|
self.parent = parent
|
|
|
self.data_manager = data_manager
|
|
|
self.config_file = "email_config.json"
|
|
|
|
|
|
# 创建配置窗口
|
|
|
self.window = tk.Toplevel(parent)
|
|
|
self.window.title("邮箱配置")
|
|
|
self.window.geometry("500x400")
|
|
|
self.window.resizable(False, False)
|
|
|
self.window.grab_set() # 模态窗口
|
|
|
|
|
|
self.create_widgets()
|
|
|
self.load_config()
|
|
|
|
|
|
def create_widgets(self):
|
|
|
"""创建界面组件"""
|
|
|
main_frame = ttk.Frame(self.window, padding="20")
|
|
|
main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
|
|
|
|
|
|
# 标题
|
|
|
title_label = ttk.Label(main_frame, text="邮箱配置",
|
|
|
font=("Arial", 16, "bold"))
|
|
|
title_label.grid(row=0, column=0, columnspan=2, pady=10)
|
|
|
|
|
|
# 说明
|
|
|
info_label = ttk.Label(main_frame,
|
|
|
text="配置用于发送验证码的邮箱(建议使用QQ邮箱)",
|
|
|
font=("Arial", 10))
|
|
|
info_label.grid(row=1, column=0, columnspan=2, pady=5)
|
|
|
|
|
|
# 发送邮箱
|
|
|
ttk.Label(main_frame, text="发送邮箱:").grid(row=2, column=0, sticky=tk.W, pady=5)
|
|
|
self.email_entry = ttk.Entry(main_frame, width=30)
|
|
|
self.email_entry.grid(row=2, column=1, padx=10, pady=5)
|
|
|
|
|
|
# 授权码
|
|
|
ttk.Label(main_frame, text="授权码:").grid(row=3, column=0, sticky=tk.W, pady=5)
|
|
|
self.password_entry = ttk.Entry(main_frame, width=30, show="*")
|
|
|
self.password_entry.grid(row=3, column=1, padx=10, pady=5)
|
|
|
|
|
|
# 发送者名称
|
|
|
ttk.Label(main_frame, text="发送者名称:").grid(row=4, column=0, sticky=tk.W, pady=5)
|
|
|
self.name_entry = ttk.Entry(main_frame, width=30)
|
|
|
self.name_entry.grid(row=4, column=1, padx=10, pady=5)
|
|
|
|
|
|
# 帮助按钮
|
|
|
help_btn = ttk.Button(main_frame, text="获取授权码帮助",
|
|
|
command=self.show_help)
|
|
|
help_btn.grid(row=5, column=0, columnspan=2, pady=10)
|
|
|
|
|
|
# 测试按钮
|
|
|
test_btn = ttk.Button(main_frame, text="测试邮箱配置",
|
|
|
command=self.test_email)
|
|
|
test_btn.grid(row=6, column=0, columnspan=2, pady=5)
|
|
|
|
|
|
# 按钮框架
|
|
|
button_frame = ttk.Frame(main_frame)
|
|
|
button_frame.grid(row=7, column=0, columnspan=2, pady=20)
|
|
|
|
|
|
# 保存按钮
|
|
|
save_btn = ttk.Button(button_frame, text="保存配置",
|
|
|
command=self.save_config)
|
|
|
save_btn.grid(row=0, column=0, padx=10)
|
|
|
|
|
|
# 取消按钮
|
|
|
cancel_btn = ttk.Button(button_frame, text="取消",
|
|
|
command=self.window.destroy)
|
|
|
cancel_btn.grid(row=0, column=1, padx=10)
|
|
|
|
|
|
def load_config(self):
|
|
|
"""加载配置"""
|
|
|
try:
|
|
|
if os.path.exists(self.config_file):
|
|
|
with open(self.config_file, 'r', encoding='utf-8') as f:
|
|
|
config = json.load(f)
|
|
|
self.email_entry.insert(0, config.get("email", ""))
|
|
|
self.password_entry.insert(0, config.get("password", ""))
|
|
|
self.name_entry.insert(0, config.get("name", "数学学习软件"))
|
|
|
else:
|
|
|
# 使用默认配置
|
|
|
self.name_entry.insert(0, DEFAULT_SENDER_CONFIG["name"])
|
|
|
except Exception as e:
|
|
|
print(f"加载配置失败: {e}")
|
|
|
|
|
|
def save_config(self):
|
|
|
"""保存配置"""
|
|
|
email = self.email_entry.get().strip()
|
|
|
password = self.password_entry.get().strip()
|
|
|
name = self.name_entry.get().strip()
|
|
|
|
|
|
if not email or not password:
|
|
|
messagebox.showerror("错误", "请填写邮箱和授权码")
|
|
|
return
|
|
|
|
|
|
if "@" not in email:
|
|
|
messagebox.showerror("错误", "请输入有效的邮箱地址")
|
|
|
return
|
|
|
|
|
|
if not name:
|
|
|
name = "数学学习软件"
|
|
|
|
|
|
config = {
|
|
|
"email": email,
|
|
|
"password": password,
|
|
|
"name": name
|
|
|
}
|
|
|
|
|
|
try:
|
|
|
# 保存到文件
|
|
|
with open(self.config_file, 'w', encoding='utf-8') as f:
|
|
|
json.dump(config, f, ensure_ascii=False, indent=2)
|
|
|
|
|
|
# 更新数据管理器配置
|
|
|
self.data_manager.sender_config = config
|
|
|
|
|
|
messagebox.showinfo("成功", "邮箱配置保存成功!")
|
|
|
self.window.destroy()
|
|
|
except Exception as e:
|
|
|
messagebox.showerror("错误", f"保存配置失败: {e}")
|
|
|
|
|
|
def test_email(self):
|
|
|
"""测试邮箱配置"""
|
|
|
email = self.email_entry.get().strip()
|
|
|
password = self.password_entry.get().strip()
|
|
|
name = self.name_entry.get().strip()
|
|
|
|
|
|
if not email or not password:
|
|
|
messagebox.showerror("错误", "请填写邮箱和授权码")
|
|
|
return
|
|
|
|
|
|
# 临时更新配置
|
|
|
old_config = self.data_manager.sender_config.copy()
|
|
|
self.data_manager.sender_config = {
|
|
|
"email": email,
|
|
|
"password": password,
|
|
|
"name": name or "数学学习软件"
|
|
|
}
|
|
|
|
|
|
# 发送测试邮件
|
|
|
test_code = "123456"
|
|
|
success = self.data_manager.send_verification_email(email, test_code)
|
|
|
|
|
|
# 恢复原配置
|
|
|
self.data_manager.sender_config = old_config
|
|
|
|
|
|
if success:
|
|
|
messagebox.showinfo("测试成功", f"测试邮件已发送到 {email}")
|
|
|
else:
|
|
|
messagebox.showerror("测试失败", "邮件发送失败,请检查配置")
|
|
|
|
|
|
def show_help(self):
|
|
|
"""显示帮助信息"""
|
|
|
help_window = tk.Toplevel(self.window)
|
|
|
help_window.title("授权码获取帮助")
|
|
|
help_window.geometry("600x500")
|
|
|
help_window.resizable(False, False)
|
|
|
|
|
|
text_widget = tk.Text(help_window, wrap=tk.WORD, padx=10, pady=10)
|
|
|
text_widget.pack(fill=tk.BOTH, expand=True)
|
|
|
text_widget.insert(tk.END, EMAIL_HELP_TEXT)
|
|
|
text_widget.config(state=tk.DISABLED)
|
|
|
|
|
|
# 关闭按钮
|
|
|
close_btn = ttk.Button(help_window, text="关闭",
|
|
|
command=help_window.destroy)
|
|
|
close_btn.pack(pady=10) |