作为上市公司最有价值的员工,每周都需要检查几十个人谁没发周报。
就是这么“有”意义的工作!我打算把我自己迭代了。
周报是通过腾讯企业邮箱发送的,必须以周报为标题的邮件。
而我的任务是从需要发周报的人里,一个一个排查出谁没发周报。
每次做之前都很抗拒,很焦虑。
但在写完这个脚本之后,初运行的第一周,感觉非常之愉悦,心情都有变好。
2. 收获:- 练习了python的基础语法
- 应用难点在于对于包的掌握和应用,以及细节处理,比如数据类型之间的转换
自从0基础学了Python基础,也对这个任务的半自动化实现方式有了初步的实现步骤:
1、生成《已交周报名单》
2、对比《需要交周报的名单》
3、生成《需要提醒名单》
4. 知识储备这里可能会用到代码“工具”:
- python基础、
- email的imaplib包的导入和关于邮件的导入发送相关方法、
- 文件读取存储、
- 数据类型之间的转换以及列表运算
在写代码的过程中,深刻地体会到了,为什么程序员总是被吐槽:
你今天又写了多少行bug!
所以放代码之前,总结一下这 3 天碰到的坑(坑是程序员宝贵的经验,多总结应该对我有好处)
5. 可能会遇到的bug代码很简单,IMAPlib包第一次使用还是很不好上手的,经常出现的错误就在取数上:
比如:
取值时注意统一好【数值】的【类型】(可计算)和【维度】:
【维度】报错:列表和列表(同类型数值类型)计算的时候,需要注意取值不能再取[列表],一维列表不能和二维列表[[列表]]进行计算;
【类型】报错:文件读取时读取的是字符串,但是进行计算需要将字符串转换成可计算的列表,常出现带字符n,无法直接装进列表里,需要split方法分割成,“逗号”,才能转化成列表
...此处省略层级错误等低水平错误×10084...
Error+10086 :
因为文件被拖动到文件夹下,他获取到的数可能为空,为假值,执行系统就会报错TypeError:'NoneType' object is not subscriptable
解决办法 :用if条件+continue来跳过空置(如果数值为空,则跳过本次循环,遍历下一个)
Error+10087 :发现获取的邮件不全,
解决办法 :找IMAP官方问到,换一个取数的方法(.uid——>.search)
以下是完整的源代码+IMAP的官方说明文档:imaplib --- IMAP4 协议客户端 — Python 3.7.13 說明文件
import imaplib, email, os import re import chardet imapserver = 'imap.exmail.qq.com' emailuser = "waXXXXXg@XXXX.cn" emailpasswd = "XXXX44" attachementdir = r"d:a" # 附件存放的位置 conn = imaplib.IMAP4_SSL(imapserver, 993) conn.login(emailuser, emailpasswd) conn.list() # 列出邮箱中所有的列表,如:收件箱、垃圾箱、草稿箱。。。 # conn.select('INBOX') # 选择收件箱(默认) conn.select() # 选择收件箱(默认) # result, dataid = conn.uid('search', None, '(SUBJECT "周报")') error:用.uid的结果是周报获取不全——>获取的方法可能有问题,得找另一个,就找到了.search # word = "周报" # w = word.encode("utf-8") result, dataid = conn.search('UTF-8', "SUBJECT", str("周报".encode())) #这里的str(),参数是字符串形式的编码 mailidlist = dataid[0].split() # 转成标准列表,获得所有邮件的ID # 解析邮件内容 def get_body(msg): if msg.is_multipart(): return get_body(msg.get_payload(0)) else: return msg.get_payload(None, decode=True) # search('FROM','abc@outlook.com',conn) 根据输入的条件查找特定的邮件 def search(key, value, conn): result, data = conn.search(None, key, '"()"'.format(value)) return data # 获取附件 def get_attachements(msg): for part in msg.walk(): if part.get_content_maintype() == 'multipart': continue if part.get('Content-Disposition') is None: continue filename = part.get_filename() if bool(filename): filepath = os.path.join(attachementdir, filename) with open(filepath, 'wb') as f: f.write(part.get_payload(decode=True)) some_people = [] pattern = re.compile(r"[<](.*?)[>]", re.S) for id in mailidlist: result, data = conn.fetch(id, '(RFC822)') # 通过邮件is2 {'"=?utf-8?B?546L562x5am3?="点个小赞攒,鼓励一下吧~', '=?GBK?B?yr+087fy?=
欢迎评论区交流,吐槽