办公自动化脚本合集-Python处理ExcelPDF邮件的30个脚本_第1页
办公自动化脚本合集-Python处理ExcelPDF邮件的30个脚本_第2页
办公自动化脚本合集-Python处理ExcelPDF邮件的30个脚本_第3页
办公自动化脚本合集-Python处理ExcelPDF邮件的30个脚本_第4页
办公自动化脚本合集-Python处理ExcelPDF邮件的30个脚本_第5页
已阅读5页,还剩23页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

办公自动化脚本合集——Python处理Excel/PDF/邮

件的30个脚本

标签:Python办公自动化|Excel处理|PDF处理|邮件自动化|脚本合集|数据清洗|批量操作|职场效率

日期:2026年9月13日

目录

第一章Python办公自动化环境配置

第二章Excel处理脚本(脚本01-15)

第三章PDF处理脚本(脚本16-24)

第四章邮件自动化脚本(脚本25-30)

第五章脚本组合应用——端到端自动化实战

第六章常见报错与排查指南

第七章性能优化与版本差异

第八章脚本打包与定时运行

第九章速查表与检查清单

第一章Python办公自动化环境配置

1.1安装Python

第1步:下载Python安装包

打开浏览器,访问/downloads,下载最新版Python3.12或3.13的Windows安装包。选择64位版本。注

意:Python3.12默认启用per-interpreterGIL(PIGIL),但openpyxl和xlrd等底层引擎未完全适配,导致

pandas.read_excel在多线程批量读取时可能出现锁争用或初始化延迟。如果主要做Excel批量处理,推荐使用Python

3.11或3.13。Python3.13已修复了PIGIL兼容性问题。

第2步:安装Python

双击安装包,勾选“AddPythontoPATH”,点击“InstallNow”。安装完成后,打开命令行(Win+R输入cmd),输入

python--version,显示版本号说明安装成功。

第3步:安装必备库

在命令行中输入以下命令,逐条执行:

pipinstallopenpyxlpandasxlsxwriterpdfplumberPyPDF2PyMuPDFcamelot-pyopencv-python

pipinstallpython-docxrequestsbeautifulsoup4schedule

第4步:验证安装

importopenpyxl

importpandas

importpdfplumber

importPyPDF2

print("所有库安装成功")

零基础操作引导:在哪里输入命令?打开命令行(Win+R→输入cmd→回车),在黑窗口中输入pipinstall命令,按

Enter执行。安装完成后输入python,按Enter进入Python交互环境,输入import语句测试。

1.2推荐开发工具

工具用途零基础操作入口

VSCode代码编辑下载安装后,新建.py文件即可

PyCharm代码编辑下载Community版,新建项目

JupyterNotebook交互式编程通过pipinstalljupyter安装

IDLEPython自带编辑器开始菜单搜索IDLE

1.3库选择决策表

场景推荐库理由性能参考

读Excel(5万行以下)openpyxl轻量,格式控制精细10万行约8秒

读Excel(大数据量)pandas向量化操作,速度快10万行约3秒

写Excel(带格式)openpyxl样式控制最强适合精细排版

写Excel(纯数据)pandas+xlsxwriter速度快,适合大数据百万行秒级

提取PDF文字pdfplumber精度高,支持坐标定位100页约9秒(8核)

提取PDF文字(简单)PyPDF2速度快,API简单100页约42秒

合并/拆分PDFPyPDF2结构操作首选速度快

发送邮件smtplib+email标准库,无需额外安装几行代码即可

第二章Excel处理脚本(脚本01-15)

脚本01:读取Excel文件

功能:读取Excel文件内容,支持xlsx和xls格式。

代码:

importpandasaspd

#读取Excel文件

df=pd.read_excel('data.xlsx')

#查看前5行

print(df.head())

#查看数据基本信息

print(())

#查看统计摘要

print(df.describe())

参数说明:

'data.xlsx':文件路径,支持相对路径和绝对路径

sheet_name:指定工作表名称或索引,默认0(第一个工作表)

header:表头行号,默认0(第一行)

真实工作场景:财务人员每月需要读取银行对账单Excel文件,检查收支明细。将文件路径替换为对账单路径,运行脚

本即可查看数据概况。

常见错误与正确写法:

错误写法正确写法说明

文件路径用反斜杠用正斜杠或原始字符串Windows路径需转义

不检查文件是否存在先检查文件路径避免FileNotFoundError

读取后不查看数据先head()查看确认数据读取正确

零基础操作引导:

在哪里运行:打开VSCode,新建文件命名为read_excel.py,粘贴代码,按Ctrl+S保存

怎么运行:点击VSCode右上角运行按钮,或在命令行输入pythonread_excel.py

结果长什么样:终端显示前5行数据、列名、数据类型和统计摘要

报错了怎么办:如果提示FileNotFoundError,检查文件路径是否正确;如果提示ModuleNotFoundError,运

行pipinstallpandasopenpyxl

脚本02:写入Excel文件

功能:将DataFrame数据写入新的Excel文件。

代码:

importpandasaspd

#创建示例数据

data={

'姓名':['张三','李四','王五'],

'部门':['销售部','技术部','市场部'],

'销售额':[12000,15000,8000]

}

df=pd.DataFrame(data)

#写入Excel,不保存索引列

df.to_excel('output.xlsx',index=False)

print("文件写入成功")

参数说明:

index=False:不将DataFrame索引写入Excel

sheet_name='Sheet1':指定工作表名称

engine='openpyxl':指定写入引擎

真实工作场景:HR每月汇总考勤数据后,需要生成标准格式的Excel文件发送给各部门。将汇总数据构造为

DataFrame,一键导出。

进阶技巧:写入长数字(如订单号)时,设置单元格格式为文本,避免变成科学计数法:

fromopenpyxlimportWorkbook

fromopenpyxl.stylesimportnumbers

wb=Workbook()

ws=wb.active

cell=ws.cell(row=2,column=1,value="202506220011234")

cell.number_format='@'

#强制文本格式

wb.save('order.xlsx')

写入前先设置单元格格式为文本,可以避免长数字被Excel自动转换为科学计数法。

脚本03:批量合并多个Excel文件

功能:将同一文件夹内多个Excel文件合并为一个文件。

代码:

importpandasaspd

importglob

importos

#获取文件夹内所有Excel文件

folder_path='data/'

files=glob.glob(os.path.join(folder_path,'*.xlsx'))

#读取并合并所有文件

all_data=[]

forfileinfiles:

df=pd.read_excel(file)

df['来源文件']=os.path.basename(file)

#添加来源标记

all_data.append(df)

combined=pd.concat(all_data,ignore_index=True)

combined.to_excel('merged.xlsx',index=False)

print(f"合并完成,共{len(files)}个文件,{len(combined)}行数据")

参数说明:

glob.glob():支持通配符匹配文件

ignore_index=True:合并后重新生成索引

pd.concat():支持纵向和横向合并

真实工作场景:每月末需要将12个分公司的销售报表合并为一张总表。运行脚本后自动合并,并添加“来源文件”列方

便追溯。

注意事项:各文件表头必须一致,否则需要先统一列名。

脚本04:批量拆分Excel文件

功能:按某一列的值将Excel拆分为多个文件。

代码:

importpandasaspd

df=pd.read_excel('sales.xlsx')

#按“区域”列拆分

forregion,groupindf.groupby('区域'):

group.to_excel(f'output_{region}.xlsx',index=False)

print(f"已生成:output_{region}.xlsx")

参数说明:

groupby('区域'):按指定列分组

f'output_{region}.xlsx':动态文件名

真实工作场景:销售部需要将全国销售数据按区域拆分为独立文件,发送给各区域负责人。

脚本05:筛选特定列和行

功能:从Excel中提取需要的列,并按条件筛选行。

代码:

importpandasaspd

df=pd.read_excel('financial_data.xlsx')

#筛选特定列

selected=df[['日期','收入','成本']]

#筛选收入大于1000的行

filtered=selected[selected['收入']>1000]

#保存结果

filtered.to_excel('filtered.xlsx',index=False)

print(f"筛选完成,共{len(filtered)}条记录")

脚本06:删除空值并填充缺失值

功能:清理Excel中的空值。

代码:

importpandasaspd

df=pd.read_excel('data.xlsx')

#删除包含空值的行

df_clean=df.dropna()

#用0填充空值

df_filled=df.fillna(0)

#用均值填充

df_mean=df.fillna(df.mean(numeric_only=True))

#分别保存

df_clean.to_excel('cleaned.xlsx',index=False)

df_filled.to_excel('filled.xlsx',index=False)

print(f"删除空值后:{len(df_clean)}行")

print(f"填充空值后:{len(df_filled)}行")

脚本07:数据透视表自动生成

功能:按类别汇总数据,生成数据透视表。

代码:

importpandasaspd

df=pd.read_excel('sales.xlsx')

#按产品和区域汇总销售额

pivot=pd.pivot_table(

df,

values='销售额',

index='产品',

columns='区域',

aggfunc='sum',

fill_value=0

)

pivot.to_excel('pivot_result.xlsx')

print("数据透视表生成完成")

脚本08:计算同比增长率

功能:计算月度数据的同比增长率。

代码:

importpandasaspd

df=pd.read_excel('monthly_data.xlsx')

#计算环比增长率(与上个月对比)

df['环比增长']=df['收入'].pct_change()*100

#计算同比增长率(与去年同期对比)

df['同比增长']=df['收入'].pct_change(periods=12)*100

df.to_excel('growth_analysis.xlsx',index=False)

print("增长率计算完成")

脚本09:批量生成带格式的Excel报表

功能:生成带表头样式、边框、冻结窗格的Excel文件。

代码:

fromopenpyxlimportWorkbook

fromopenpyxl.stylesimportFont,Alignment,PatternFill,Border,Side

fromopenpyxl.utilsimportget_column_letter

wb=Workbook()

ws=wb.active

ws.title="销售报表"

#设置表头样式

header_fill=PatternFill("solid",fgColor="1F4E79")

header_font=Font(bold=True,color="FFFFFF",size=12)

thin=Side(style="thin")

border=Border(left=thin,right=thin,top=thin,bottom=thin)

headers=['月份','销售额','成本','利润','利润率']

forcol,headerinenumerate(headers,1):

cell=ws.cell(1,col,header)

cell.fill=header_fill

cell.font=header_font

cell.alignment=Alignment(horizontal="center")

cell.border=border

#写入数据

data=[

['1月',1200,800,400,'33.3%'],

['2月',1350,850,500,'37.0%'],

['3月',1500,900,600,'40.0%'],

]

forr,rowinenumerate(data,2):

forc,valinenumerate(row,1):

cell=ws.cell(r,c,val)

cell.border=border

#冻结表头

ws.freeze_panes="A2"

#自动列宽

forcinrange(1,len(headers)+1):

ws.column_dimensions[get_column_letter(c)].width=14

wb.save("formatted_report.xlsx")

print("带格式报表生成完成")

参数说明:

PatternFill:单元格填充样式

Font:字体样式,支持bold、color、size

Border:边框样式,用Side定义一次复用

freeze_panes:冻结窗格,A2表示冻结第一行

真实工作场景:审计人员需要批量生成函证底稿,每家客户一个工作表,格式统一。使用openpyxl循环创建sheet并

统一设置样式,几十份底稿几分钟完成。

脚本10:多工作表批量操作

功能:遍历Excel中所有工作表,执行统一操作。

代码:

importopenpyxl

wb=openpyxl.load_workbook('multi_sheet.xlsx')

forsheet_nameinwb.sheetnames:

ws=wb[sheet_name]

print(f"工作表:{sheet_name},行数:{ws.max_row},列数:{ws.max_column}")

#在每张表的最后添加一行汇总

last_row=ws.max_row+1

ws.cell(row=last_row,column=1,value="汇总")

ws.cell(row=last_row,column=2,value=f"=SUM(B2:B{ws.max_row})")

wb.save('multi_sheet_updated.xlsx')

print("所有工作表处理完成")

脚本11:按条件拆分并生成独立文件

功能:按部门拆分数据,每个部门生成独立Excel文件,并自动发送。

代码:

importpandasaspd

importos

df=pd.read_excel('all_employees.xlsx')

os.makedirs('departments',exist_ok=True)

fordept,groupindf.groupby('部门'):

filename=f'departments/{dept}_employees.xlsx'

group.to_excel(filename,index=False)

print(f"生成:{filename},共{len(group)}人")

脚本12:Excel数据去重

功能:删除Excel中的重复行。

代码:

importpandasaspd

df=pd.read_excel('data_with_duplicates.xlsx')

#完全去重(所有列都相同才算重复)

df_unique=df.drop_duplicates()

#按指定列去重(如按订单号去重,保留第一条)

df_unique_id=df.drop_duplicates(subset=['订单号'],keep='first')

df_unique.to_excel('deduplicated.xlsx',index=False)

print(f"去重前:{len(df)}行,去重后:{len(df_unique)}行")

脚本13:Excel与CSV互转

功能:将Excel转为CSV,或将CSV转为Excel。

代码:

importpandasaspd

#Excel转CSV

df=pd.read_excel('data.xlsx')

df.to_csv('data.csv',index=False,encoding='utf-8-sig')

#CSV转Excel

df2=pd.read_csv('data.csv',encoding='utf-8-sig')

df2.to_excel('data_from_csv.xlsx',index=False)

print("格式转换完成")

注意事项:中文CSV使用utf-8-sig编码,避免Excel打开时乱码。

脚本14:按金额降序抽取前N笔

功能:从明细账中按金额降序,每个科目抽取前N笔,生成底稿。

代码:

importpandasaspd

fromopenpyxlimportWorkbook

fromopenpyxl.stylesimportFont,Alignment,PatternFill

fromopenpyxl.utilsimportget_column_letter

df=pd.read_excel("ledger.xlsx")

#计算净发生额绝对值作为排序键

df["amount"]=(df["credit"].fillna(0)-df["debit"].fillna(0)).abs().round(2)

N=10

#每科目取前10笔

wb=Workbook()

wb.remove(wb.active)

header_fill=PatternFill("solid",fgColor="1F4E79")

header_font=Font(bold=True,color="FFFFFF")

cols=["account","voucher","date","desc","debit","credit","amount"]

forsubj,grpindf.groupby("account"):

grp=grp.sort_values("amount",ascending=False).head(N)

ws=wb.create_sheet(title=subj[:31])

forc,nameinenumerate(cols,1):

cell=ws.cell(1,c,name)

cell.fill=header_fill

cell.font=header_font

forr,(_,row)inenumerate(grp.iterrows(),2):

forc,nameinenumerate(cols,1):

ws.cell(r,c,row[name])

ws.freeze_panes="A2"

wb.save("vouchers.xlsx")

print("抽凭底稿生成完成")

参数说明:

sort_values("amount",ascending=False):按金额降序排列

head(N):取前N行

title=subj[:31]:工作表名称最多31字符,超长截断避免报错

真实工作场景:审计抽凭时,需要从明细账中筛选每个科目金额最大的前10笔凭证。手工操作一个科目十分钟,几十

个科目需要一下午。使用脚本后几分钟完成。

脚本15:批量生成函证底稿

功能:按客户名单批量生成格式统一的函证底稿。

代码:

fromopenpyxlimportWorkbook

fromopenpyxl.stylesimportFont,Border,Side

wb=Workbook()

thin=Side(style="thin")

border=Border(left=thin,right=thin,top=thin,bottom=thin)

#从Excel读取名单

importpandasaspd

parties_df=pd.read_excel("parties.xlsx")

parties=[(row['名称'],row['日期'],row['余额'],row['已核对'])

for_,rowinparties_df.iterrows()]

forname,date,bal,recinparties:

ws=wb.create_sheet(title=name[:10])

ws["A1"]="Confirmation"

ws["A1"].font=Font(bold=True,size=14)

rows=[("Party",name),("Asof",date),("Balance",bal),("Reconciled",rec)]

r=3

fork,vinrows:

ws.cell(row=r,column=1,value=k).border=border

ws.cell(row=r,column=2,value=v).border=border

r+=1

wb.save("confirmations.xlsx")

print(f"共生成{len(parties)}份函证底稿")

真实工作场景:审计需要向每家客户和供应商发函证,底稿每家一份、格式统一。手工建几十张表费时,用openpyxl

按名单批量生成,每家一个sheet,样式一次设好。

第三章PDF处理脚本(脚本16-24)

脚本16:提取PDF文本

功能:从PDF中提取所有文字内容。

代码:

importpdfplumber

withpdfplumber.open("document.pdf")aspdf:

full_text=[]

fori,pageinenumerate(pdf.pages):

text=page.extract_text()

iftext:

full_text.append(f"第{i+1}页\n{text}")

result="\n".join(full_text)

withopen("extracted_text.txt","w",encoding="utf-8")asf:

f.write(result)

print(f"提取完成,共{len(pdf.pages)}页")

参数说明:

x_tolerance:水平容差,默认3,值越小精度越高

y_tolerance:垂直容差,默认3

layout=True:保留原始布局

真实工作场景:法务人员需要从PDF合同中提取关键条款。使用pdfplumber提取文字后,用关键词搜索快速定位条款

位置。

进阶用法:提取带坐标的文本块:

withpdfplumber.open("document.pdf")aspdf:

forpageinpdf.pages:

words=page.extract_words()

forwordinwords:

print(f"位置:({word['x0']:.1f},{word['top']:.1f})内容:{word['text']}")

脚本17:提取PDF表格

功能:从PDF中提取表格数据。

代码:

importpdfplumber

importpandasaspd

all_tables=[]

withpdfplumber.open("report.pdf")aspdf:

forpageinpdf.pages:

tables=page.extract_tables()

fortableintables:

iftableandlen(table)>1:

df=pd.DataFrame(table[1:],columns=table[0])

all_tables.append(df)

ifall_tables:

result=pd.concat(all_tables,ignore_index=True)

result.to_excel("pdf_tables.xlsx",index=False)

print(f"提取完成,共{len(all_tables)}张表")

else:

print("未找到表格")

参数说明:

table_settings:可自定义表格检测参数

vertical_strategy:垂直策略,可选lines、text、explicit

horizontal_strategy:水平策略

脚本18:合并多个PDF文件

功能:将多个PDF合并为一个文件。

代码:

fromPyPDF2importPdfMerger

importos

merger=PdfMerger()

folder="pdfs/"

files=sorted([fforfinos.listdir(folder)iff.endswith('.pdf')])

forfileinfiles:

merger.append(os.path.join(folder,file))

print(f"已添加:{file}")

merger.write("merged.pdf")

merger.close()

print(f"合并完成,共{len(files)}个文件")

参数说明:

PdfMerger:PyPDF23.0+版本类名,2.x版本为PdfFileMerger

append():追加整个PDF

merge():从指定页码合并

版本差异说明:PyPDF23.0.0+的API有较大变化。旧版使用PdfFileMerger,新版使用PdfMerger。建议安装

PyPDF2==2.12.1以确保兼容性。

脚本19:拆分PDF为单页文件

功能:将PDF每页拆分为独立文件。

代码:

fromPyPDF2importPdfReader,PdfWriter

importos

reader=PdfReader("document.pdf")

os.makedirs("pages",exist_ok=True)

fori,pageinenumerate(reader.pages):

writer=PdfWriter()

writer.add_page(page)

output=f"pages/page_{i+1:03d}.pdf"

withopen(output,"wb")asf:

writer.write(f)

print(f"生成:{output}")

print(f"拆分完成,共{len(reader.pages)}页")

脚本20:PDF添加水印

功能:为PDF每页添加水印。

代码:

fromPyPDF2importPdfReader,PdfWriter

fromreportlab.lib.pagesizesimportA4

fromreportlab.pdfgenimportcanvas

importio

#创建水印PDF

watermark_buffer=io.BytesIO()

c=canvas.Canvas(watermark_buffer,pagesize=A4)

c.setFont("Helvetica",60)

c.setFillColorRGB(0.8,0.8,0.8)

c.saveState()

c.translate(300,400)

c.rotate(45)

c.drawCentredString(0,0,"内部资料")

c.restoreState()

c.save()

watermark_buffer.seek(0)

#合并水印到原PDF

reader=PdfReader("document.pdf")

watermark=PdfReader(watermark_buffer)

writer=PdfWriter()

forpageinreader.pages:

page.merge_page(watermark.pages[0])

writer.add_page(page)

withopen("watermarked.pdf","wb")asf:

writer.write(f)

print("水印添加完成")

脚本21:PDF加密与解密

功能:为PDF设置密码保护,或移除已有密码。

代码:

fromPyPDF2importPdfReader,PdfWriter

#加密

reader=PdfReader("document.pdf")

writer=PdfWriter()

forpageinreader.pages:

writer.add_page(page)

writer.encrypt("my_password")

withopen("encrypted.pdf","wb")asf:

writer.write(f)

print("加密完成")

#解密

reader2=PdfReader("encrypted.pdf")

reader2.decrypt("my_password")

writer2=PdfWriter()

forpageinreader2.pages:

writer2.add_page(page)

withopen("decrypted.pdf","wb")asf:

writer2.write(f)

print("解密完成")

脚本22:OCR识别扫描件PDF

功能:对扫描件PDF进行OCR识别,提取文字。

代码:

frompdf2imageimportconvert_from_path

importpytesseract

fromPILimportImage

defocr_pdf(pdf_path,lang='chi_sim+eng'):

images=convert_from_path(pdf_path,dpi=300)

full_text=[]

fori,imginenumerate(images):

#图片预处理:灰度化+二值化

img=img.convert('L').point(lambdax:0ifx<140else255)

text=pytesseract.image_to_string(img,lang=lang)

full_text.append(f"第{i+1}页\n{text}")

return"\n".join(full_text)

result=ocr_pdf("scanned.pdf")

withopen("ocr_result.txt","w",encoding="utf-8")asf:

f.write(result)

print(f"OCR识别完成,共{len(result)}字")

参数说明:

dpi=300:设置DPI为300提高识别率

lang='chi_sim+eng':中文简体+英文

中文文档需先安装chi_sim.traineddata语言包

脚本23:提取PDF中的图片

功能:从PDF中提取所有嵌入图片。

代码:

importfitz

#PyMuPDF

importos

os.makedirs("extracted_images",exist_ok=True)

doc=fitz.open("document.pdf")

img_count=0

forpage_numinrange(len(doc)):

page=doc[page_num]

images=page.get_images(full=True)

forimg_index,imginenumerate(images):

xref=img[0]

base_image=doc.extract_image(xref)

image_bytes=base_image["image"]

ext=base_image["ext"]

filename=f"extracted_images/page{page_num+1}_img{img_index+1}.{ext}"

withopen(filename,"wb")asf:

f.write(image_bytes)

img_count+=1

doc.close()

print(f"共提取{img_count}张图片")

脚本24:批量处理PDF合同

功能:批量提取合同中的关键信息。

代码:

importpdfplumber

importre

importos

importpandasaspd

results=[]

folder="contracts/"

forfileinos.listdir(folder):

ifnotfile.endswith('.pdf'):

continue

filepath=os.path.join(folder,file)

withpdfplumber.open(filepath)aspdf:

text="\n".join([p.extract_text()or""forpinpdf.pages])

#提取关键信息

contract_no=re.search(r'合同编号[::]\s*(\S+)',text)

amount=re.search(r'合同金额[::]\s*([\d,,.]+)',text)

date=re.search(r'签订日期[::]\s*(\d{4}[-年]\d{1,2}[-月]\d{1,2})',text)

results.append({

'文件名':file,

'合同编号':contract_no.group(1)ifcontract_noelse'',

'合同金额':amount.group(1)ifamountelse'',

'签订日期':date.group(1)ifdateelse''

})

df=pd.DataFrame(results)

df.to_excel("contract_summary.xlsx",index=False)

print(f"处理完成,共{len(results)}份合同")

第四章邮件自动化脚本(脚本25-30)

脚本25:发送纯文本邮件

功能:通过SMTP发送纯文本邮件。

代码:

importsmtplib

importos

fromemail.mime.textimportMIMEText

#配置(建议使用环境变量)

MAIL_HOST=""

MAIL_USER="your_email@"

MAIL_PASS="your_authorization_code"

msg=MIMEText("今日数据报表已生成,请查收。","plain","utf-8")

msg["Subject"]="每日报表通知"

msg["From"]=MAIL_USER

msg["To"]="boss@"

withsmtplib.SMTP(MAIL_HOST,587)ass:

s.starttls()

s.login(MAIL_USER,MAIL_PASS)

s.send_message(msg)

print("邮件发送成功")

参数说明:

端口587:提交端口,连接后starttls()升级加密

端口465:SSL端口,使用smtplib.SMTP_SSL

MIMEText第一个参数是正文,“plain”表示纯文本

脚本26:发送带附件的邮件

功能:发送带Excel附件的邮件。

代码:

importsmtplib

fromemail.mime.multipartimportMIMEMultipart

fromemail.mime.textimportMIMEText

fromemail.mime.applicationimportMIMEApplication

msg=MIMEMultipart()

msg["Subject"]="月度报表"

msg["From"]="your_email@"

msg["To"]="boss@"

#正文

msg.attach(MIMEText("月度报表见附件,请查收。","plain","utf-8"))

#附件

withopen("report.xlsx","rb")asf:

part=MIMEApplication(f.read())

part.add_header("Content-Disposition","attachment",filename="report.xlsx")

msg.attach(part)

withsmtplib.SMTP("",587)ass:

s.starttls()

s.login("your_email@","your_password")

s.send_message(msg)

print("带附件邮件发送成功")

参数说明:

MIMEMultipart:多部分邮件容器

MIMEApplication:二进制附件

Content-Disposition:设置附件文件名

常见错误:中文文件名在部分客户端乱码,建议用英文文件名或做RFC2231编码。

脚本27:批量发送个性化邮件

功能:从Excel读取名单,批量发送个性化邮件。

代码:

importsmtplib

importpandasaspd

fromemail.mime.textimportMIMEText

fromemail.mime.multipartimportMIMEMultipart

fromemail.headerimportHeader

df=pd.read_excel("recipients.xlsx")

for_,rowindf.iterrows():

msg=MIMEMultipart()

msg["Subject"]=Header(f"尊敬的{row['姓名']},您的月度报告","utf-8")

msg["From"]="your_email@"

msg["To"]=row['邮箱']

body=f"""

<h3>{row['姓名']},您好!</h3>

<p>您{row['月份']}的数据报告如下:</p>

<p>销售额:{row['销售额']}万元</p>

<p>完成率:{row['完成率']}%</p>

<p>如有疑问,请随时联系。</p>

"""

msg.attach(MIMEText(body,"html","utf-8"))

withsmtplib.SMTP("",587)ass:

s.starttls()

s.login("your_email@","your_password")

s.send_message(msg)

print(f"已发送给:{row['姓名']}({row['邮箱']})")

print("批量发送完成")

脚本28:定时发送邮件

功能:使用schedule库定时发送邮件。

代码:

importschedule

importtime

importsmtplib

fromemail.mime.textimportMIMEText

defsend_daily_report():

msg=MIMEText("每日数据报表已生成。","plain","utf-8")

msg["Subject"]="每日报表"

msg["From"]="your_email@"

msg["To"]="boss@"

withsmtplib.SMTP("",587)ass:

s.starttls()

s.login("your_email@","your_password")

s.send_message(msg)

print(f"邮件已发送:{time.strftime('%Y-%m-%d%H:%M:%S')}")

#每天早上9点发送

schedule.every().day.at("09:00").do(send_daily_report)

print("定时任务已启动,等待发送...")

whileTrue:

schedule.run_pending()

time.sleep(60)

参数说明:

schedule.every().day.at("09:00"):每天9点执行

schedule.every().monday:每周一执行

schedule.every(2).hours:每2小时执行

脚本29:发送HTML格式报表邮件

功能:发送带HTML表格的邮件。

代码:

importsmtplib

importpandasaspd

fromemail.mime.textimportMIMEText

df=pd.read_excel("report.xlsx")

#将DataFrame转为HTML表格

html_table=df.to_html(index=False,border=1,justify='center')

html_content=f"""

<html>

<head>

<style>

table{{border-collapse:collapse;width:100%;}}

th{{background-color:#1F4E79;color:white;padding:8px;}}

td{{padding:8px;text-align:center;border:1pxsolid#ddd;}}

tr:nth-child(even){{background-color:#f2f2f2;}}

</style>

</head>

<body>

<h2>月度销售报表</h2>

<p>以下为各区域销售数据:</p>

{html_table}

<p>数据来源:销售管理系统</p>

</body>

</html>

"""

msg=MIMEText(html_content,"html","utf-8")

msg["Subject"]="月度销售报表"

msg["From"]="your_email@"

msg["To"]="boss@"

withsmtplib.SMTP("",587)ass:

s.starttls()

s.login("your_email@","your_password")

s.send_message(msg)

print("HTML报表邮件发送成功")

脚本30:邮件自动归档与摘要生成

功能:读取收件箱邮件,生成摘要并归档。

代码:

importimaplib

importemail

fromemail.headerimportdecode_header

importos

fromdatetimeimportdatetime

#连接IMAP服务器

mail=imaplib.IMAP4_SSL("")

mail.login("your_email@","your_password")

mail.select("inbox")

#搜索今天的邮件

today=datetime.now().strftime("%d-%b-%Y")

status,messages=mail.search(None,f'(SINCE"{today}")')

ifstatus=="OK":

mail_ids=messages[0].split()

print(f"今天收到{len(mail_ids)}封邮件")

summary=[]

formail_idinmail_ids:

status,msg_data=m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论