给成绩单中的学生发送电子邮件

给成绩单中的学生发送电子邮件,告知平时成绩

1.功能要求

  • 隐私性:每位同学只能看到自己的平时成绩,确保每位同学的隐私
  • 方便快捷:若每个同学都来询问成绩,再挨个回复,效率不高且容易出现错漏。发放电子成绩单,则比较方便快捷。

2. 实现

2.1 获取邮箱号

这一步有两个重要的前提:

  • 所有同学都加入了QQ群
  • 所有同学都按照要求将群名片改成了自己的名字

在上述条件满足的情况下,就可以导出带有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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值