import tkinter as tk
from tkinter import messagebox
import mail_util as mu
import re

target_names = ['正常邮件', '垃圾邮件']  # 正常、 垃圾


class SpamDetectorApp:
    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry('800x600+500+100')
        self.root.title('Spam Detector')

        # 创建登录页面
        self.login_frame = tk.Frame(self.root)
        self.username_label = tk.Label(self.login_frame, text='Username:')
        self.username_entry = tk.Entry(self.login_frame)

        self.password_label = tk.Label(self.login_frame, text='Password:')
        self.password_entry = tk.Entry(self.login_frame, show='*')

        self.login_button = tk.Button(self.login_frame, text='Login', command=self.login)

        self.username_label.pack()
        self.username_entry.pack()
        self.password_label.pack()
        self.password_entry.pack()
        self.login_button.pack()
        self.login_frame.pack()

        # 创建垃圾邮件检测页面
        self.spam_detector_frame = tk.Frame(self.root)
        self.email_text_label = tk.Label(self.spam_detector_frame, text='Email Text:')
        self.email_text_entry = tk.Text(self.spam_detector_frame, width=100, height=30)
        self.detect_button = tk.Button(self.spam_detector_frame, text='Detect', command=self.detect_spam)
        self.result_label = tk.Label(self.spam_detector_frame, text='')

        self.email_text_label.pack()
        self.email_text_entry.pack()
        self.detect_button.pack()
        self.result_label.pack()
        self.spam_detector_frame.pack()

    def login(self):
        username = self.username_entry.get()
        password = self.password_entry.get()

        # 在这里添加你的登录逻辑
        # 检查用户名和密码是否有效
        if username == 'admin' and password == 'password':
            self.login_frame.pack_forget()  # 隐藏登录页面
            self.spam_detector_frame.pack()  # 显示垃圾邮件检测页面
            self.clf = mu.get_classifier()
        else:
            messagebox.showerror('Error', 'Invalid username or password.')

    def detect_spam(self):
        email_text = self.email_text_entry.get('1.0', tk.END)

        # 在这里添加你的垃圾邮件检测逻辑
        # 根据邮件文本判断是否是垃圾邮件
        if email_text.strip() == '':
            messagebox.showwarning('Warning', 'Please enter email text.')
        elif self.is_spam(email_text) & self.is_spam2(email_text):
            self.result_label.config(background='red')
            self.result_label.config(text='垃圾邮件')
        else:
            self.result_label.config(background='green')
            self.result_label.config(text='正常邮件')

    def is_spam2(self, email_text):
        pattern = re.compile(r'<[^>]+>', re.S)
        content = pattern.sub('', email_text)
        content = content.replace('>', '')
        prediction = self.clf.predict([email_text])[0]
        return prediction

    def is_spam(self, email_text):
        # 在这里添加垃圾邮件的特征检测逻辑
        # 判断邮件文本是否包含垃圾邮件的特征
        if 'anonymous' in email_text.lower() or \
                'generic greeting' in email_text.lower() or \
                'bulk sending' in email_text.lower() or \
                'advertisement' in email_text.lower() :
            return True
        return False

    def run(self):
        self.root.mainloop()


if __name__ == '__main__':
    app = SpamDetectorApp()
    app.run()

优点:

  1. 面向对象的编程风格: 使用类 SpamDetectorApp 来组织代码,便于代码的维护和拓展。
  2. GUI 界面: 使用 Tkinter 库创建图形用户界面,易于用户使用。
  3. 正则表达式: 使用正则表达式处理邮件文本,提高代码可读性和可维护性。
  4. 机器学习: 使用 mail_util 模块中的机器学习模型进行垃圾邮件检测,提高检测准确性。

不足:

  1. 登录逻辑简单: 登录逻辑仅使用简单的用户名和密码验证,安全性较低。建议增加更复杂的验证方式,例如密码哈希、验证码等。
  2. 特征检测逻辑简单: is_spam 函数只检测了几个简单的特征,准确性有限。建议增加更多特征判断,例如邮件主题、发件人地址、邮件内容的词频等。
  3. GUI 布局简单: 界面布局比较简单,缺乏交互和美化。建议增加更多的交互元素,例如进度条、状态提示等,并使用更美观的主题和布局。
  4. 缺乏异常处理: 代码中没有进行异常处理,可能会导致程序崩溃或异常退出。建议使用 try...except 语句捕获异常,并进行相应的处理。

优化建议:

  1. 改进登录逻辑: 使用更安全的验证方式,例如密码哈希、验证码等。
  2. 增强特征检测: 添加更多特征判断,例如邮件主题、发件人地址、邮件内容的词频等。
  3. 优化 GUI 布局: 使用更美观的主题和布局,增加更多的交互元素,提升用户体验。
  4. 添加异常处理: 使用 try...except 语句捕获异常,并进行相应的处理。
  5. 增加测试用例: 编写测试用例,对代码进行测试,确保代码的正确性和稳定性。

代码改进示例:

# ... 其他代码 ...

    def is_spam(self, email_text):
        # 添加更多特征判断
        if 'anonymous' in email_text.lower() or \
                'generic greeting' in email_text.lower() or \
                'bulk sending' in email_text.lower() or \
                'advertisement' in email_text.lower() or \
                'free' in email_text.lower() or \
                'money' in email_text.lower() or \
                'discount' in email_text.lower() or \
                'click here' in email_text.lower():
            return True
        return False

    def run(self):
        try:
            self.root.mainloop()
        except Exception as e:
            messagebox.showerror('Error', f'An error occurred: {e}')

# ... 其他代码 ...

通过以上优化,可以提升垃圾邮件检测器的准确性、安全性、用户体验以及代码的健壮性。

Python 垃圾邮件检测器 GUI 应用 - 使用 Tkinter 和机器学习

原文地址: https://www.cveoy.top/t/topic/oD1i 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录