邮件发送器:使用 Python 构建带 GUI 的邮件自动发送工具

在本篇博客中,我们将深入解析一个使用 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_serverself.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 加密。

本代码适用于自动发送周报、批量邮件处理等应用场景,并可进一步扩展。

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984404.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb-HttpServletRequest请求域接口

文章目录 HttpServletRequest请求域接口HttpServletRequest请求域接口简介关于请求域和应用域的区别 请求域接口中的相关方法获取前端请求参数(getParameter系列方法)存储请求域名参数(Attribute系列方法)获取客户端的相关地址信息获取项目的根路径 关于转发和重定向的细致剖析…

IO多路复用实现并发服务器

一.select函数 select 的调用注意事项 在使用 select 函数时,需要注意以下几个关键点: 1. 参数的修改与拷贝 readfds 等参数是结果参数 : select 函数会直接修改传入的 fd_set(如 readfds、writefds 和 exceptfds&#xf…

实现静态网络爬虫(入门篇)

一、了解基本概念以及信息 1.什么是爬虫 爬虫是一段自动抓取互联网信息的程序,可以从一个URL出发,访问它所关联的URL,提取我们所需要的数据。也就是说爬虫是自动访问互联网并提取数据的程序。 它可以将互联网上的数据为我所用,…

计算机网络——交换机

一、什么是交换机? 交换机(Switch)是局域网(LAN)中的核心设备,负责在 数据链路层(OSI第二层)高效转发数据帧。它像一位“智能交通警察”,根据设备的 MAC地址 精准引导数…

【SpringBoot】深入解析 Maven 的操作与配置

Maven 1.什么是Maven? Maven是一个项目管理工具,通过pom.xml文件的配置获取jar包,而不用手动去添加jar包; 2. 创建一个Maven项目 IDEA本身已经集成了Maven,我们可以直接使用,无需安装 以下截图的idea版本为&#xff…

MySQL的安装以及数据库的基本配置

MySQL的安装及配置 MySQL的下载 选择想要安装的版本,点击Download下载 Mysql官网下载地址:​ ​https://downloads.mysql.com/archives/installer/​​ MySQL的安装 选择是自定义安装,所以直接选择“Custom”,点击“Next”​ …

Manus AI : Agent 元年开启.pdf

Manus AI : Agent 元年开启.pdf 是由华泰证券出品的一份调研报告,共计23页。报告详细介绍了Manus AI 及 Agent,主要包括Manus AI 的功能、优势、技术能力,Agent 的概念、架构、应用场景,以及 AI Agent 的类型和相关案例&#xff0…

2.数据结构-栈和队列

数据结构-栈和队列 2.1栈2.1.1栈的表示和实现2.1.2栈的应用举例数制转换括号匹配检验迷宫给求解表达式求值 2.1.3链栈的表示和实现2.1.4栈与递归的实现遍历输出链表中各个结点的递归算法*Hanoi塔问题的递归算法 2.2队列2.2.1循环队列——队列的顺序表示和实现2.2.2链队——队列…

(十七) Nginx解析:架构设计、负载均衡实战与常见面试问题

什么是Nginx? Nginx 是一款高性能的 HTTP 服务器和反向代理服务器,同时支持 IMAP/POP3/SMTP 协议。其设计以高并发、低资源消耗为核心优势,广泛应用于负载均衡、静态资源服务和反向代理等场景。 一、Nginx 的核心优势 高并发处理能力采用异步非阻塞的…

Cpu100%问题(包括-线上docker服务以及Arthas方式进行处理)

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

【大模型】WPS 接入 DeepSeek-R1详解,打造全能AI办公助手

目录 一、前言 二、WPS接入AI工具优势​​​​​​​ 三、WPS接入AI工具两种方式 3.1 手动配置的方式 3.2 Office AI助手 四、WPS手动配置方式接入AI大模型 4.1 安装VBA插件 4.1.1 下载VBA插件并安装 4.2 配置WPS 4.3 WPS集成VB 4.4 AI助手效果测试 4.5 配置模板文…

架构思维:高性能架构_01基础概念

文章目录 概述基础概念性能指标利特尔法则(O T L)系统优化策略1. 降低耗时(L↓)2. 增加容量(O↑)3. 增加时延(L↑) 场景化指标选择响应时间优先吞吐量/容量优先平衡策略 概述 一个…

解决stylelint对deep报错

报错如图 在.stylelintrc.json的rules中配置 "selector-pseudo-class-no-unknown": [true,{"ignorePseudoClasses": ["deep"]} ]

VScode 中文符号出现黄色方框的解决方法

VScode 中文符号出现黄色方框的解决方法 我的vscode的python多行注释中会将中文字符用黄色方框框处: 只需要打开设置搜索unicode,然后将这一项的勾选取消掉就可以了: 取消之后的效果如下: 另一种情况:中文显示出现黄色…

大模型架构记录2

一 应用场景 1.1 prompt 示例 1.2 自己搭建一个UI界面,调用接口 可以选用不同的模型,需要对应的API KEY 二 Agent 使用 2.1 构建GPT

深度学习实战车辆目标跟踪与计数

本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化,该数据集包含丰富的车辆目标图像样本…

升级到Android Studio 2024.2.2 版本遇到的坑

一、上来就编译报错,大概率是因为选择了替换安装,本地配置文件出错 找到本地当前版本的配置文件,删掉,重启studio就好了: 1、打开终端 2、“cd /Users/用户名/Library/Application\ Support/Google” //到Google目录 …

Git - 补充工作中常用的一些命令

Git - 补充工作中常用的一些命令 1 一些场景1.1 场景11.2 场景21.3 场景31.4 场景41.5 场景51.6 场景61.7 场景71.8 场景81.9 场景91.10 场景101.11 场景111.12 场景121.13 场景131.14 场景141.15 场景15 2 git cherry-pick \<commit-hash\> 和 git checkout branch \-\-…

【网络安全工程】任务11:路由器配置与静态路由配置

目录 一、概念 二、路由器配置 三、配置静态路由CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog 一、概念 1、路由器的作用&#xff1a;通过路由表进行数据的转发。 2、交换机的作用&#xff1a;通过学习和识别 MAC 地址&#xff0c;依据 M…

如何用更少的内存训练你的PyTorch模型?深度学习GPU内存优化策略总结

在训练大规模深度学习模型时&#xff0c;GPU 内存往往成为关键瓶颈&#xff0c;尤其是面对大型语言模型&#xff08;LLM&#xff09;和视觉 Transformer 等现代架构时。由于大多数研究者和开发者难以获得配备海量 GPU 内存的高端计算集群&#xff0c;掌握高效的内存优化技术至关…