利用python上传文件发邮件

  1. 故事背景
    疫情期间, 由于网课作业都是发电子邮件的, 那么这个时候, 改完作业, 如何将批改后的作业发回给学生, 便是一个麻烦的问题了, 毕竟老师只有一个, 学生却有那么多个, 这个时候, 就可以利用下面这个代码, 解决这一麻烦了.
  2. 应用举例
    现在小明有附件1到附件20这20封邮件要发送, 每封邮件要发给不同的人, 如邮件1对应着发送给小一, 邮件2对应着发送给小二. 这个时候, 手动一个一个发就很麻烦, 就可以利用下面的代码进行发送.
  3. 准备材料
    a. 将待发送的所有批改后的作业放在同一个文件夹中(假设为E:\邮箱\作业), 并且每个文件的名字要包含学生的学号
    b. 一个excel(假设为E:\邮箱\信息.xlsx), 内含学生的学号(第一列)以及对应的邮箱(第二列)
    c. 一个用于发邮箱的账号及授权码(注意不是邮箱密码), 需要先在邮箱的设置中对其进行配置, 步骤: 登陆邮箱–点击设置–找到POP3/SMTP服务–点击开启–要邮箱要求获取授权码
    d. 下面的代码('E:\邮箱\代码.py)
  4. 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)
	

如有错误, 还望指出, 我会进行改正的.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值