当前位置: 首页 > 科技观察

Python自动化办公Excel拆分并自动发送邮件

时间:2023-03-12 00:56:11 科技观察

需要向大约500个用户发送带有Excel附件的邮件,同时需要用户从Excel主文件中拆分数据创建自己的特定文件,然后发送通过电子邮件将文件发送给正确的用户。需求分析的大致流程就是上图。首先拆分Excel数据,提取对应的邮箱地址和用户数据信息,然后自动添加到邮件的附件中。先代码实现先来看看我们手中的Excel数据格式是怎么样的。importdatetimeimportosimportshutilfrompathlibimportPathimportpandasaspdsrc_file=Path.cwd()/'data'/'Example4.xlsx'df=pd.read_excel(src_file)df.head()可以看出CUSTOMER_ID为唯一用户ID,让我们按此字段分组以获取以下数据。customer_group=df.groupby('CUSTOMER_ID')forID,group_dfincustomer_group:print(ID)>>>Output>>>A1000A1001A1002A1005...我们来看用户A1005对应的数据格式。接下来,我们将为每个用户创建一个Excel,稍后可以作为附件使用。attachment_path=Path.cwd()/'data'/'attachments'today_string=datetime.datetime.today().strftime('%m%d%Y_%I%p')attachments=[]forID,group_dfincustomer_group:attachment=attachment_path/f'{ID}_{today_string}.xlsx'group_df.to_excel(attachment,index=False)attachments.append((ID,str(attachment)))我们来看变量attachments中包含的数据酒吧。[('A1000','c:\\Users\\luobo\\notebooks\\2020-10\\data\\attachments\\A1000_01162021_12PM.xlsx'),('A1001','c:\\Users\\luobo\\notebooks\\2020-10\\data\\attachments\\A1001_01162021_12PM.xlsx'),('A1002','c:\\Users\\luobo\\notebooks\\2020-10\\data\\attachments\\A1002_01162021_12PM.xlsx'),('A1005','c:\\Users\\luobo\\notebooks\\2020-10\\data\\attachments\\A1005_01162021_12PM.xlsx')]最后我们可以通过DataFrame合并在一起以生成包含电子邮件地址的文件列表。email_merge=pd.merge(df,df2,how='left')combined=email_merge[['CUSTOMER_ID','EMAIL','FILE']].drop_duplicates()得到的DataFrame如下:我们收集了客户列表,他们的电子邮件和附件,现在我们可以使用Outlook发送电子邮件。将win32com.client导入为win32today_string2=datetime.datetime.today().strftime('%b%d,%Y')classEmailsS??ender:def__init__(self):self.outlook=win32.Dispatch('outlook.application')defsend_email(self,to_email_address,attachment_path):mail=self.outlook.CreateItem(0)mail.To=to_email_addressmail.Subject=today_string2+'Report'mail.Body="""请附上今天的报告。"""mail.Attachments.Add(Source=attachment_path)#用它来显示邮件#mail.Display(True)#取消注释发送#mail.Send()通过上面的简单类,我们可以生成一封邮件并附上一个Excel文件.同时我们也注意到这里使用了win32。关于这个库的具体使用,我们会在下一篇文章中进行讲解。email_sender=EmailsS??ender()forindex,rowincombined.iterrows():email_sender.send_email(row['EMAIL'],row['FILE'])最后,我们将所有生成的Excel存档以供日后审查,比同行。archive_dir=Path.cwd()/'archive'forfinattachments:shutil.move(f[1],archive_dir)至此,我们的编码就结束了,总体来说还是比较简单的。