- 故事背景
疫情期间, 由于网课作业都是发电子邮件的, 那么这个时候, 改完作业, 如何将批改后的作业发回给学生, 便是一个麻烦的问题了, 毕竟老师只有一个, 学生却有那么多个, 这个时候, 就可以利用下面这个代码, 解决这一麻烦了. - 应用举例
现在小明有附件1到附件20这20封邮件要发送, 每封邮件要发给不同的人, 如邮件1对应着发送给小一, 邮件2对应着发送给小二. 这个时候, 手动一个一个发就很麻烦, 就可以利用下面的代码进行发送. - 准备材料
a. 将待发送的所有批改后的作业放在同一个文件夹中(假设为E:\邮箱\作业), 并且每个文件的名字要包含学生的学号
b. 一个excel(假设为E:\邮箱\信息.xlsx), 内含学生的学号(第一列)以及对应的邮箱(第二列)
c. 一个用于发邮箱的账号及授权码(注意不是邮箱密码), 需要先在邮箱的设置中对其进行配置, 步骤: 登陆邮箱–点击设置–找到POP3/SMTP服务–点击开启–要邮箱要求获取授权码
d. 下面的代码('E:\邮箱\代码.py) - python代码(代码中包含一些***的地方需要根据实际情况进行修改)
'''
邮件发送 2020.04.13
Author: 豆奶
Reference: 忘记了...
'''
import smtplib # smtplib 用于邮件的发信动作
from email.mime.text import MIMEText # email 用于构建邮件内容
from email.header import Header # 用于构建邮件头
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
import os
import xlrd # 读取excel文件
import re
'''
定义send_email函数用于发邮件
inputs:
receivers: str, 收件方邮箱
filepath: str, 待发送邮件的附件所在路径
filename: str, 文件名字
'''
def send_email(receivers, filepath, filename):
# 发信方的信息:发信邮箱, 邮箱授权码
sender = '*******' # 邮箱账号, 将*改成邮箱账号
password = '*****' # 授权码,不是密码, 将*改成授权码
smtp_server = 'smtp.163.com' # 发信服务器
# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
msg = MIMEMultipart()
# 邮件头信息
msg['From'] = Header(sender)
msg['To'] = Header(receivers)
msg['Subject'] = Header(filename)
##添加附件部分
part = MIMEApplication(open(filepath,'rb').read())
part.add_header('Content-Disposition', 'attachment', filename=filename)
msg.attach(part)
try:
server = smtplib.SMTP_SSL(host=smtp_server) # 开启发信服务,这里使用的是加密传输
server.connect(host=smtp_server, port=465)
server.login(sender, password)
server.sendmail(sender, receivers, msg.as_string()) # 发送邮件
# print ("邮件发送成功")
except smtplib.SMTPException as e:
print("Error, 发送失败", filename)
print('发送失败的原因: ', e)
finally:
server.quit() # 关闭服务器
return
'''
定义find_email用于在信息表中匹配学生邮箱
Input:
xuehao: 学生的学号, str
Output:
email: 学生的邮箱号, str
'''
def find_email(xuehao):
file = "E:\\邮箱\\信息.xlsx"
data = xlrd.open_workbook(file) # 打开excel文件读取数据
table = data.sheets()[0] # 通过索引顺序获取第一个sheet
jth_col = table.col_values(0) #获取第 0 列的信息
try:
p = jth_col.index(float(xuehao))
except:
p = -1
# print("不存在学号为:%s 的人"%xuehao)
return -1
email = table.row_values(p)
return email[1]
if __name__ == '__main__':
for root,dirs,files in os.walk(r'E:\邮箱\作业'):
print(files)
print('******************************')
i = 0
for filename in files:
xuehao = re.findall('\d{11}', filename) # 正则读取学生学号
email = find_email(xuehao[0]) # 获取邮箱
if email == -1:
print(xuehao[0], '的邮件号码不存在于信息表中')
else:
filepath = os.path.join(root, filename)
send_email(email, filepath, filename) # 发送邮件
i += 1
print('=========================done=================================')
print('成功发送%s封邮件'%i)
如有错误, 还望指出, 我会进行改正的.