给成绩单中的学生发送电子邮件,告知平时成绩
文章目录
1.功能要求
- 隐私性:每位同学只能看到自己的平时成绩,确保每位同学的隐私
- 方便快捷:若每个同学都来询问成绩,再挨个回复,效率不高且容易出现错漏。发放电子成绩单,则比较方便快捷。
2. 实现
2.1 获取邮箱号
这一步有两个重要的前提:
- 所有同学都加入了QQ群
- 所有同学都按照要求将群名片改成了自己的名字
在上述条件满足的情况下,就可以导出带有QQ号的群成员名单,操作见QQ群导出名单
将此页面的内容复制粘贴到Excel中,我们得到了学生的QQ号,在QQ号后面加上@qq.com,就可以得到邮箱了。
2.2 匹配邮箱号与学生名单
在这一步,我们需要将【成绩单】和【学生邮箱】两个表进行合并,得到以下的形式,每一行代表了一位同学的成绩和对应的邮箱。
使用Vlookup命令可以实现上述的操作
=VLOOKUP(B3,$G$3:$H$5,2,FALSE)
2.3 邮件发送
这一节可以分成三个小的步骤:读取成绩单,设计邮件内容形式,python发送邮件
2.3.1 读取成绩单
这一步比较简单,根据文件的路径读取成绩单,然后逐行读取每位同学的成绩,得到必要的字段。
def send_score():
file_path = r"成绩单.csv"
scores = pd.read_csv(file_path, encoding="gbk") # 防止出现中文乱码
for index, row in scores.iterrows(): # 选择需要的字段
uid = row['学号']
name = row['姓名']
subject = row['专业']
test1 = row['测试1']
test2 = row['测试2']
attendancy = row['考勤分']
homework = row['作业分']
total_score = row['四舍五入']
addr = row['邮箱']
content = get_message(uid, name, subject, test1, test2, attendancy, homework, total_score)
send_email(content, addr)
time.sleep(5) # 避免发送太快被封
2.3.1 设计邮件内容形式
不追求花里胡哨的效果,突出成绩和其他要点,一眼看过去干净整洁
def get_message(uid, name, subject, test1, test2, attendancy, homework, total_score):
content = f"""<p>亲爱的{name}同学:
学号:{uid}
专业:{subject}
第一次测试成绩:{test1}
第二次测试成绩:{test2}
出勤分:{attendancy}
作业分:{homework}
平时总分:{total_score}
PS:平时分和期末成绩四六开,平时分中,第一、二次各占30%,作业分占30%,出勤分占10%!
如果对平时分有异议的同学可以找我沟通~
祝大家前程似锦!大家江湖再见~</p>
"""
return content
具体效果如下图所示:
2.3.2 python发送邮件
这一步是最重要的一步了,首先得设置好QQ邮箱STMP代理发送邮件,教程详情见QQ邮箱如何设置SMTP代理收发邮件
开启IMAP/SMTP服务后,会给你一串密钥,写在send_email的password处即可。
def send_email(message: str, to_addr):
from_addr = 'xxxx@qq.com' # 你自己的邮箱
password = 'xxxxxxx' # 邮箱密钥
to_addr = to_addr # 要发送的邮箱
subject = "概率论平时成绩" # 邮箱主题
sender_show = "概率论助教-XX" # 邮箱所显示的发送人
msg = MIMEText(message, 'plain', 'utf-8')
msg['Subject'] = subject
msg['from'] = sender_show
msg['To'] = to_addr
smtp_server = 'smtp.qq.com'
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465)
server.login(from_addr, password)
server.sendmail(from_addr, to_addr, msg.as_string())
server.quit()
3. 总结与展望
- 邮件发送功能比较粗糙,可能会出现异常的情况(比如对方邮箱的设置,可能会拒收邮件),未来可进行改善。
- 前提很重要,完整的名单和对应的邮箱是必要条件。
- 为了避免频繁发送邮箱被封掉,本次设置了5秒的暂停时间,未来可以设置随机暂停时间;不确定在人数较多的情况下,邮箱代理会不会被系统禁掉
完整版代码如下所示:
import time
import smtplib
from email.mime.text import MIMEText
import pandas as pd
def send_score():
file_path = r"成绩单.csv"
scores = pd.read_csv(file_path, encoding="gbk") # 防止出现中文乱码
for index, row in scores.iterrows(): # 选择需要的字段
uid = row['学号']
name = row['姓名']
subject = row['专业']
test1 = row['测试1']
test2 = row['测试2']
attendancy = row['考勤分']
homework = row['作业分']
total_score = row['四舍五入']
addr = row['邮箱']
content = get_message(uid, name, subject, test1, test2, attendancy, homework, total_score)
send_email(content, addr)
time.sleep(5) # 避免发送太快被封
def get_message(uid, name, subject, test1, test2, attendancy, homework, total_score):
content = f"""<p>亲爱的{name}同学:
学号:{uid}
专业:{subject}
第一次测试成绩:{test1}
第二次测试成绩:{test2}
出勤分:{attendancy}
作业分:{homework}
平时总分:{total_score}
PS:平时分和期末成绩四六开,平时分中,第一、二次各占30%,作业分占30%,出勤分占10%!
如果对平时分有异议的同学可以找我沟通~
祝大家前程似锦!大家江湖再见~</p>
"""
return content
def send_email(message: str, to_addr):
from_addr = 'xxxx@qq.com' # 你自己的邮箱
password = 'xxxxxxx' # 邮箱密钥
to_addr = to_addr # 要发送的邮箱
subject = "概率论平时成绩" # 邮箱主题
sender_show = "概率论助教-XX" # 邮箱所显示的发送人
msg = MIMEText(message, 'plain', 'utf-8')
msg['Subject'] = subject
msg['from'] = sender_show
msg['To'] = to_addr
smtp_server = 'smtp.qq.com'
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465)
server.login(from_addr, password)
server.sendmail(from_addr, to_addr, msg.as_string())
server.quit()
send_score()