在本篇博客中,我们将深入解析一个使用 wxPython 构建的邮件发送器 GUI 程序。这个工具能够自动查找指定目录中的文件作为附件,并提供邮件发送功能。本文将从功能、代码结构、关键技术等方面进行详细分析。
C:\pythoncode\new\ATemplateFromWeekReportByMail.py
1. 项目概述
该程序是一个基于 wxPython 的 GUI 工具,允许用户通过直观的界面输入邮件内容、添加收件人、抄送、正文,并自动从指定文件夹中提取附件,最后使用 SMTP 发送邮件。
核心功能:
- 用户界面:基于 wxPython 构建,包含邮件标题、正文、附件列表等组件。
- 配置管理:自动加载并保存用户的邮件配置,如 SMTP 服务器、发件人邮箱等。
- 附件自动匹配:程序可以自动查找当前周五的文件夹,并将其中的文件作为邮件附件。
- 邮件发送:使用 Python 的
smtplib
发送邮件,并支持 SSL 加密。
2. 代码结构分析
该程序的主逻辑封装在 EmailSenderFrame
类中,继承自 wx.Frame
,负责 GUI 组件的创建和事件绑定。
(1)构造函数:初始化窗口与加载配置
class EmailSenderFrame(wx.Frame):
def __init__(self, parent, title):
super(EmailSenderFrame, self).__init__(parent, title=title, size=(800, 600))
# 默认附件文件夹路径
self.attachment_base_dir = r"c:\mydocs\每周工作"
# 创建配置文件路径
self.config_file = os.path.join(os.path.expanduser("~"), "email_sender_config.json")
# 默认邮箱设置
self.smtp_server = "smtp.exmail.qq.com"
self.smtp_port = 465
self.from_email = ""
self.password = ""
self.use_ssl = True
# 创建界面
self.create_ui()
# 加载之前保存的配置
self.load_config()
# 自动查找当前周五的附件
self.update_attachments()
# 显示窗口
self.Centre()
self.Show()
关键点解析
self.attachment_base_dir
指定了附件存储的默认路径。self.config_file
定义了配置文件路径,方便持久化用户设置。self.smtp_server
、self.smtp_port
以及self.from_email
等变量存储邮件服务器信息,默认使用腾讯企业邮箱。create_ui()
方法负责界面布局。load_config()
读取本地保存的用户配置,避免每次运行都重新输入信息。update_attachments()
自动查找当前周五的附件文件。
(2)创建 UI 界面
def create_ui(self):
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
# 邮件标题
subject_box = wx.BoxSizer(wx.HORIZONTAL)
subject_label = wx.StaticText(panel, label="标题:")
self.subject_ctrl = wx.TextCtrl(panel)
subject_box.Add(subject_label, flag=wx.RIGHT, border=8)
subject_box.Add(self.subject_ctrl, proportion=1)
vbox.Add(subject_box, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, border=10)
# 省略部分代码...
# 设置布局
panel.SetSizer(vbox)
关键点解析
- 采用
wx.BoxSizer(wx.VERTICAL)
创建垂直布局,保持界面整洁。 - 使用
wx.TextCtrl
作为输入框,并绑定wx.StaticText
作为标签。 - 采用
proportion=1
使输入框占据界面的大部分空间,方便用户输入邮件信息。
(3)加载和保存用户配置
def load_config(self):
"""加载之前保存的配置"""
if os.path.exists(self.config_file):
try:
with open(self.config_file, 'r', encoding='utf-8') as f:
config = json.load(f)
self.subject_ctrl.SetValue(config.get('subject', ''))
self.to_ctrl.SetValue(config.get('to', ''))
self.cc_ctrl.SetValue(config.get('cc', ''))
self.body_ctrl.SetValue(config.get('body', ''))
saved_dir = config.get('attachment_base_dir', '')
if saved_dir and os.path.exists(saved_dir):
self.attachment_base_dir = saved_dir
self.folder_ctrl.SetValue(self.attachment_base_dir)
self.smtp_server = config.get('smtp_server', 'smtp.exmail.qq.com')
self.smtp_port = config.get('smtp_port', 465)
self.from_email = config.get('from_email', '')
self.password = config.get('password', '')
self.use_ssl = config.get('use_ssl', True)
except Exception as e:
wx.MessageBox(f"加载配置时出错: {str(e)}", "错误", wx.OK | wx.ICON_ERROR)
关键点解析
- 读取
email_sender_config.json
文件,恢复上次保存的邮件设置。 - 采用
json.load(f)
解析 JSON 数据并填充界面组件。 - 如果
attachment_base_dir
存在,则恢复该目录,确保附件路径有效。
(4)获取当前周五的文件夹路径
def get_this_friday_folder(self):
"""获取当前选择的文件夹路径"""
selected_folder = self.attachment_base_dir
# 检查文件夹是否存在
if not os.path.exists(selected_folder):
wx.MessageBox(f"选择的文件夹不存在: {selected_folder}", "错误", wx.OK | wx.ICON_ERROR)
return ""
return selected_folder
关键点解析
self.attachment_base_dir
设定默认的工作文件夹,该路径可以通过 UI 进行调整。- 使用
os.path.exists()
确保路径有效,否则弹出错误提示框。
(5)自动查找附件文件
def update_attachments(self):
"""在选定的文件夹中查找所有文件"""
folder = self.get_this_friday_folder()
if folder:
files = glob.glob(os.path.join(folder, "*")) # 获取所有文件
self.attach_list.Set(files) # 更新 UI 列表
关键点解析
glob.glob(os.path.join(folder, "*"))
获取所有文件路径。self.attach_list.Set(files)
直接将文件路径添加到wx.ListBox
组件中,方便用户查看附件。
3. 总结
本项目基于 wxPython
实现了一个邮件发送 GUI 工具,整合了 配置管理、自动查找附件、邮件发送 等功能。通过 wxPython
提供的 UI 组件,用户可以直观地输入邮件信息,并快速附加文件进行发送。
技术要点回顾
- wxPython 用于 GUI 构建,提供直观的邮件编辑界面。
- JSON 配置管理 让程序具备持久化存储功能,提升用户体验。
- 自动附件匹配 通过
glob
查找文件,提高效率。 - SMTP 发送邮件 结合
smtplib
实现邮件投递,支持 SSL 加密。
本代码适用于自动发送周报、批量邮件处理等应用场景,并可进一步扩展。