最近接到学生会的工作:收集报名表,作为一个总想着偷懒摸鱼的我,当然是想用代码来自动化解决问题啦,最近正好在学python,便试着用python写个程序从邮箱下载附件并自动分类储存,下面便是源代码了。注意看注释。新手第一次发文章,大佬嘴下留情,瑟瑟发抖,谢谢!!!
import os
import sys
import imaplib
import email
# 用户名和密码
email_user = 'your e-mail address'
email_pass = 'password' #密码不行就pop3服务的验证码,下面附截图
# 连接邮箱服务器
imap_url = 'imap.qq.com' #这里可以选择邮箱类型
mail = imaplib.IMAP4_SSL(imap_url, 993)
# 登录邮箱
mail.login(email_user, email_pass)
mail.select('inbox')
# 搜索所有未读邮件
status, email_ids = mail.search(None, "UNSEEN")
# 遍历并下载每个邮件的附件
for email_id in email_ids[0].split():
status, email_data = mail.fetch(email_id, "(RFC822)")
# 解析电子邮件消息
from email import message_from_bytes
email_message = message_from_bytes(email_data[0][1])
# 获取发件人
from_addr = email.utils.parseaddr(email_message['From'])[1]
# 创建以发件人命名的文件夹
folder_path = os.path.join('F:/读书分享会报名表收集', from_addr)
#这里自己可以修改文件夹路径
if not os.path.exists(folder_path):
os.makedirs(folder_path)
# 下载附件并保存到对应的文件夹中
for part in email_message.walk():
content_type = part.get_content_type()
if content_type == "application/octet-stream" \
or content_type == "application/msword" \
#我这里默认的是word文档,可以自己修改所要下载的文件类型,自己上网查一下
or content_type == "application/vnd.openxmlformats-
officedocument.wordprocessingml.document":
# 获取原始文件名和编码格式
filename, charset = email.header.decode_header(part.get_filename())[0]
# 将文件名转换为UTF-8编码,并去除非法字符
filename = filename.decode(charset).encode('utf-8', 'ignore').decode()
with open(os.path.join(folder_path, filename), 'wb') as f:
f.write(part.get_payload(decode=True))
# 关闭邮件连接
mail.close()
mail.logout()
这个就是QQ邮箱的pop3服务开启的地方,在设置-账号里面
对了,为了统计人数和报名的类型,我又写了一段生成excel的代码,废话不多说,看效果
源代码如下:
import os
import pandas as pd
# 设置文件夹路径和分隔符
folder_path = 'F:/读书分享会报名表收集'
delimiter = '-'
#这里需要你自己把文件夹设置好有分隔符,不然提取出来会在一起
# 获取文件夹内所有文件夹的名称
dir_names = [f for f in os.listdir(folder_path) if os.path.isdir(os.path.join(folder_path, f))]
# 将文件夹名称按照分隔符拆分成多个列,并存储到DataFrame中
df = pd.DataFrame([x.split(delimiter) for x in dir_names], columns=['Column 1', 'Column 2', 'Column 3','Column 4'])
#这里可以改列的名称
output_path = 'F:/读书分享会报名表收集/书单.xlsx'
df.to_excel(output_path, index=False)
好了,以上就是全部内容了,感谢阅读,有帮助的话就请点个赞吧。手动狗头。