# 创建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('wanglangcode@163.com', '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'] = 'wanglangcode@163.com'
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('wanglangcode@163.com', '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('wanglangcode@163.com', eml, msg.as_string())
except smtplib.SMTPException as e:
print(e)
else:
print('邮件发送成功...')
auto_send_mail()
eg:教师邮箱为wanglangcode@163.com 学生1学生2的邮箱为a645461397@foxmail.com 学生3学生4的邮箱为15929961493@163.com
目前教师邮箱有一封来自学生1 ,2邮箱的未读邮件,模拟学生12已经交过作业
运行脚本后 应该只给学生34发送交作业邮件
#运行脚本
#学生12的邮箱没有交作业的未读邮件
#学生34的邮箱应该有两封交作业的未读邮件
####设置脚本每周四中午十二点自动运行#####
crontab -e 进入自动运行文件设置
编辑: