# 创建excel表并填入信息 import student_test import openpyxl import smtplib from email.mime.text import MIMEText import imapclient import email # 创建excel文件存放学生信息 def create(): try: wb = openpyxl.Workbook('学生作业信息表.xlsx') wb.save(filename='学生作业信息表.xlsx') except Exception as e: print(e) try: wb = openpyxl.load_workbook('学生作业信息表.xlsx') sheet = wb.active for row, info in enumerate(student_test.student_info_list): for column, cell in enumerate(info): sheet.cell(row=row + 1, column=column + 1).value = cell wb.save(filename='学生作业信息表.xlsx') except Exception as e: print(e) else: print('程序运行正常...') # 进入教师邮箱统计交过作业的学生 def cheak(): finish_list = [] # 建立imap连接 conn = imapclient.IMAPClient(host='imap.163.com', ssl='True') # 登陆教师邮箱 conn.login('[email protected]', 'redhat111') # 读取收件箱 conn.select_folder('INBOX', readonly='True') # 在收件箱中查找未读的邮件 参数为邮件的状态 返回值为所有未读邮件的编号 result = conn.search('UNSEEN') # 通过fetch()函数 查看邮件的信息 返回值为一个多重嵌套字典 包含邮件id和邮件的所有信息 msgdict = conn.fetch(result, ['BODY.PEEK[]']) try: for message_id, message in msgdict.items(): # 将每个邮件的信息按utf-8编码方式 提取出来 e = email.message_from_string(str(message[b'BODY[]'], encoding='utf8')) # 提取发件人信息 mail_from = email.header.make_header(email.header.decode_header(e['From'])) from_student = str(mail_from) finish_list.append(from_student) except Exception as e: print(e) finally: conn.logout() return finish_list # 修改表中学生作业状态 def alter_sheet(): wb = openpyxl.load_workbook('学生作业信息表.xlsx') sheet = wb.active finish_info = cheak() try: for student_info in finish_info: for row, info in enumerate(sheet.rows): if sheet.cell(row=row + 1, column=3).value in student_info: sheet.cell(row=row + 1, column=2).value = 1 except Exception as e: print(e) finally: wb.save(filename='学生作业信息表.xlsx') def msg_info(eml): content = ''' 赶快交作业''' msg = MIMEText(content, 'plain', 'utf-8') msg['To'] = eml msg['From'] = '[email protected]' msg['Subject'] = 'homework' return msg # 按表中所显示 给未交作业的学生发送邮件 def auto_send_mail(): create() alter_sheet() wb = openpyxl.load_workbook('学生作业信息表.xlsx') sheet = wb.active try: conn = smtplib.SMTP('smtp.163.com') conn.login('[email protected]', 'redhat111') for row, info in enumerate(sheet.rows): if sheet.cell(row=row + 1, column=2).value == 0: eml = sheet.cell(row=row + 1, column=3).value msg = msg_info(eml) conn.sendmail('[email protected]', eml, msg.as_string()) except smtplib.SMTPException as e: print(e) else: print('邮件发送成功...') auto_send_mail()
eg:教师邮箱为[email protected] 学生1学生2的邮箱为[email protected] 学生3学生4的邮箱为[email protected]
目前教师邮箱有一封来自学生1 ,2邮箱的未读邮件,模拟学生12已经交过作业
运行脚本后 应该只给学生34发送交作业邮件
#运行脚本
#学生12的邮箱没有交作业的未读邮件
#学生34的邮箱应该有两封交作业的未读邮件
####设置脚本每周四中午十二点自动运行#####
crontab -e 进入自动运行文件设置
编辑: