Python 压缩文件夹并发送邮件功能

news/2024/11/28 2:35:19/文章来源:https://www.cnblogs.com/echohye/p/18573384

Python 压缩文件夹并发送邮件功能

1. 功能概述

本笔记介绍如何使用 Python 进行以下操作:

  • 将指定文件夹中的文件压缩为 .zip 文件,不包含子文件夹及其内容。
  • 将压缩后的文件通过电子邮件发送给指定收件人,使用 QQ 邮箱作为发送邮件的 SMTP 服务器。

2. 将文件夹压缩为 ZIP 文件(不含子文件夹)

代码:

import os
import zipfiledef zip_folder(folder_path: str, output_path: str) -> None:"""将指定文件夹中的文件压缩为 zip 文件,不包含子文件夹及其内容:param folder_path: 要压缩的文件夹路径 (str):param output_path: 压缩文件保存路径 (str):return: None"""# 使用 'w' 模式打开 zip 文件,表示创建一个新的 zip 文件并写入内容with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zipf:# 遍历指定文件夹中的所有文件,不包括子文件夹for file in os.listdir(folder_path):file_path = os.path.join(folder_path, file)# 仅处理文件(忽略子文件夹)if os.path.isfile(file_path):# 将文件添加到 zip 文件中zipf.write(file_path, arcname=file)  # arcname=file 使压缩包内文件保持原文件名# 输出压缩成功信息print(f"文件夹中的文件已压缩为:{output_path}")

代码解释:

  1. os.listdir(folder_path):列出文件夹中的所有文件和子文件夹。
  2. os.path.isfile(file_path):检查文件路径是否为文件,忽略子文件夹。
  3. zipfile.ZipFile:创建并写入 zip 文件,arcname=file 确保压缩包中的文件没有包含文件夹路径。

3. 通过邮件发送压缩文件

代码:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encodersclass FolderZipperAndEmailSender:def __init__(self, smtp_server: str, smtp_port: int, sender_email: str, sender_password: str):"""初始化邮件发送器:param smtp_server: SMTP 服务器地址:param smtp_port: SMTP 端口号:param sender_email: 发送方邮箱:param sender_password: 授权码(非邮箱密码)"""self.smtp_server = smtp_serverself.smtp_port = smtp_portself.sender_email = sender_emailself.sender_password = sender_passworddef send_email(self, recipient_email: str, subject: str, body: str, attachment_path: str) -> None:"""发送带附件的邮件:param recipient_email: 接收方邮箱:param subject: 邮件主题:param body: 邮件正文:param attachment_path: 附件路径:return: None"""# 创建邮件对象msg = MIMEMultipart()msg['From'] = self.sender_emailmsg['To'] = recipient_emailmsg['Subject'] = subject# 添加邮件正文msg.attach(MIMEText(body, 'plain'))# 添加附件with open(attachment_path, 'rb') as attachment:part = MIMEBase('application', 'octet-stream')part.set_payload(attachment.read())encoders.encode_base64(part)part.add_header('Content-Disposition',f'attachment; filename={os.path.basename(attachment_path)}')msg.attach(part)# 发送邮件 (好像用with邮件发送成功但会报错)with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as server:  # 使用 SSLserver.login(self.sender_email, self.sender_password)server.send_message(msg)print("邮件已发送")

代码解释:

  1. 邮件发送类 FolderZipperAndEmailSender:该类负责发送邮件。需要提供 SMTP 配置、发送者邮箱和授权码。
  2. send_email 方法:负责构建并发送邮件,支持正文和附件。使用 MIMETextMIMEBase 构建邮件内容。
  3. SMTP 配置
    • 使用 QQ 邮箱的 SMTP 服务器 (smtp.qq.com)。
    • 使用 SSL 连接(端口 465)确保安全通信。
    • 登录时使用授权码而不是邮箱密码。

4. 整合成完整的工作流程

整合代码:

import os
import zipfile
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encodersclass FolderZipperAndEmailSender:def __init__(self, smtp_server: str, smtp_port: int, sender_email: str, sender_password: str):"""初始化邮件发送器:param smtp_server: SMTP 服务器地址:param smtp_port: SMTP 端口号:param sender_email: 发送方邮箱:param sender_password: 授权码(非邮箱密码)"""self.smtp_server = smtp_serverself.smtp_port = smtp_portself.sender_email = sender_emailself.sender_password = sender_passworddef zip_folder(self, folder_path: str, output_path: str) -> None:"""将指定文件夹中的文件压缩为 zip 文件,不包含子文件夹及其内容:param folder_path: 要压缩的文件夹路径 (str):param output_path: 压缩文件保存路径 (str):return: None"""with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zipf:for file in os.listdir(folder_path):file_path = os.path.join(folder_path, file)if os.path.isfile(file_path):zipf.write(file_path, arcname=file)print(f"文件夹中的文件已压缩为:{output_path}")def send_email(self, recipient_email: str, subject: str, body: str, attachment_path: str) -> None:"""发送带附件的邮件:param recipient_email: 接收方邮箱:param subject: 邮件主题:param body: 邮件正文:param attachment_path: 附件路径:return: None"""msg = MIMEMultipart()msg['From'] = self.sender_emailmsg['To'] = recipient_emailmsg['Subject'] = subjectmsg.attach(MIMEText(body, 'plain'))with open(attachment_path, 'rb') as attachment:part = MIMEBase('application', 'octet-stream')part.set_payload(attachment.read())encoders.encode_base64(part)part.add_header('Content-Disposition', f'attachment; filename={os.path.basename(attachment_path)}')msg.attach(part)with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as server:server.login(self.sender_email, self.sender_password)server.send_message(msg)print("邮件已发送")# 使用示例
if __name__ == "__main__":sender = FolderZipperAndEmailSender(smtp_server="smtp.qq.com",smtp_port=465,sender_email="your_email@qq.com",sender_password="your_authorization_code")folder_to_zip = "./example_folder"zip_file_path = "./example_folder.zip"# 压缩文件夹sender.zip_folder(folder_to_zip, zip_file_path)recipient_email = "recipient_email@example.com"subject = "压缩文件发送示例"body = "请查收附件中的压缩文件。"# 发送邮件sender.send_email(recipient_email, subject, body, zip_file_path)

5. 总结

通过以上的代码,我们实现了以下功能:

  1. 压缩文件夹:只压缩指定文件夹中的文件,不包括子文件夹。
  2. 发送邮件:通过 QQ 邮箱发送带附件的邮件。使用授权码代替密码,并使用 SSL 连接保证安全性。

这个工作流程可以帮助我们方便地将文件夹中的内容压缩并通过邮件发送,适用于批量文件传输和自动化任务。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python迷你HTML渲染框架(by GPT)

# 文件名: html.pydef html_tag(tag_name):"""创建通用 HTML 标签函数"""def tag_func(*content, **attrs):# 处理属性attr_str = " ".join(f{key}="{value}" if value is not None else keyfor key, value in attrs.items(…

bios里面有多个引导项,删除多余的启动项

现在是2024年11月28日,星期四. 比如我的笔记本是win10系统,在bios界面有多个引导项,很多都没有用了,我想要删除其中多余的启动项, 我有2个Windows Boot Manager, 2个Linpus lite, 1个ubuntu, 我以前安装过一个deepin和windows双系统,然后又重装过windows系统,不知道为啥会出现出…

深入云电脑PC Farm技术探讨,以阿里云、华为云、ToDesk为例

🌝引言 近年来,云计算技术的飞速发展为各行各业的数字化转型带来了全新机遇,其中云电脑作为一种虚拟化桌面解决方案,逐渐成为个人用户与企业的核心选择。从远程办公、在线教育到高性能计算需求,云电脑通过为用户提供随时随地的访问能力、高效的计算资源分配以及低成本的硬…

搜索树与图

目录Dfs模板原理代码实现Bfs模板原理代码实现邻接表拓扑序列原理突破代码实现最短路问题Dijkstra代码实现bellman_ford算法bellamn_ford代码实现spfas算法代码实现判断负环floid算法代码实现最小生成树问题Prim算法代码思路代码实现 Dfs模板原理 dfs原名叫做深度优先遍历,以上…

开源 - Ideal库 - Excel帮助类,设计思路(一)

封装Excel常用操作,围绕导入导出设计,通过DataTable实现对象集合与Excel转换,分为对象集合与DataTable转换、DataTable与Excel转换两部分,最终整合为对象集合与Excel转换方法。今天开始和大家分享关于Excel最长常用操作封装。01、起因 市面上有很多Excel操作库,这些库设计…

C++动态库详解

dmjcb个人博客 原文地址动态库 概念 动态库($Dynamic$ $Library$), 又称动态链接库($Dynamic$ $Link$ $Library$, $DLL$), 是一种在程序运行时所加载文件 其与静态库主要区别在于动态库代码并不在程序编译时直接包含, 而是在程序执行时根据需要动态加载 格式 graph LR;X(格式)X…

数分笔记

符号说明(部分) 存在唯一:\(\exist|\) 或 \(\exist!\) 使得:\(\operatorname{s.t.}\)(so that/such that) 非:\(\neg\) 正整数:\(\mathbb{Z}^+,\mathbb{N}_+,\mathbb{Z}_+,\mathbb{N}^+\) 定义为:\(\triangleq\) 或 \(\dot=\) 笛卡尔乘积 \(A\times B=\{(a,b)|a\in A,…

自用软件推荐、 思源笔记插件 | 记录

效率软件mykeyMap,可以设置键盘快捷键,提高码字效率。小键盘福音。 ​​自用习惯:(超级键Caps组合) 可以设置快捷启动软件 可以快速切换窗口,管理窗口。 可以快速调节音量 可以划词直接搜索其他网站内容(还挺好用的,平时搜索素材不用一个一个地打开网站再复制进去搜索)…

从零开始学 Maven:简化 Java 项目的构建与管理

Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。一、关于Maven 1.1 简介 Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。M…

左侧导航栏element -2024/11/27

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>首页</title><style>.demo-table-expand {font-size: 0;}.demo-table-expand label {width: 90px;color: #99a9bf;}.demo-table-expand …

考研打卡(28)

开局(28) 开始时间 2024-11-27 22:50:07 结束时间 2024-11-27 23:25:29明天是1124刚才和室友去吃了一百一的羊肉火锅数据结构 设哈希表长m=14,哈希函数H(key)=key MOD 11。 表中已有4个节点addr(15)=4,addr(38)=5,addr(61)=6,addr(84)=7, 其余地址为空,如用二次探查再散…

ThreeJs-04详解材质与纹理

一.matcap材质 这个材质不会受到光照影响,但是如果图片本身有光就可以一直渲染这个图片本来的样子,用来将一个图片纹理渲染到物体上的材质代码实现 加载模型后,开启纹理渲染,并把它的材质变为这个材质,并且贴上纹理图二.Lambert材质 Lambert网格材质是Three.js中最基本和常…