师兄: 帮我写个代码,发190份带附件的邮件
我: 爪巴
师兄: 按学院两天工时算钱
我: 亲亲,啥时候要呢?
师兄: 明天下午
我: ok,我需要你提供一份Excel,里面包含邮箱账号和附件名称的对应关系。
师兄: ok
任务明确。
首先用自己的邮箱账号和授权码登录腾讯邮箱服务器
send_user = "xxxx@qq.com"#邮箱password = "xxxx" # 按下面方法获得授权码smtp_server = "smtp.qq.com"# qq邮箱需要绑定的腾讯smtp服务器和端口号smtp_port = 465 smtpObject = smtplib.SMTP_SSL(smtp_server , smtp_port) #qq必须要用.SMTP_SSLsmtpObject.login(send_user , password)
授权码就相当于邮箱的密码, 用代码需要用授权码才能登录,
具体如何获得腾讯邮箱的授权码可以看这篇:
https://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1001256&&id=28
从Excel里取出位于第一行的目的邮箱,收件人姓名和对应的附件
读取Excel文件
data = 'summary.xlsx' d_read = pd.read_excel(data,index_col='序号',)
Excel的内容格式如图:
存储附件的文件夹内容格式:
# 现在 i = 1, 为 第i行, 对应的附件为1.pdf email = d_read.loc[i,'邮箱'] # 读取目标邮箱name = d_read.loc[i,'姓名'] # 获得接收人姓名 用来做邮箱正文内容的称呼sub = "XX证书"# 邮件标题content = name + "同学:\n 你好,XXX,见附件。\n --------XX大学 XXX学院"# 邮箱正文内容 , name 就是这位同学的名字 image = str(i) # 附件对应的名字, 之后会根据名字找到对应的附件1.pdf
开始构建邮件结构,普通邮件包含目标邮箱账号,邮件标题,邮件文本内容,邮件附件。逐一添加后即可发送。
# 写一个发送邮件的类class SendEmail: # 定义一个邮件发送函数 def send_mail(self,user_list,sub,content,image): user = "给自己起个名" + " + send_user + ">" # msg是信封, 把各种内容往信封里塞 msg = MIMEMultipart() # 塞标题 msg['Subject'] = sub # 塞发件人 msg['From'] = user # 塞收件人 msg['To'] = ";".join(user_list) # 塞制作好的邮件内容 msg.attach(MIMEText(content, 'plain', 'utf-8')) # 文件的地址, 类型为pdf image_path = './images/'+image+'.pdf' # 制作附件 word = MIMEApplication(open(image_path,'rb').read()) word.add_header('Content-Disposition', 'attachment', filename=image+'.pdf') # 塞制作好的邮件附件 msg.attach(word) smtpObject.sendmail(send_user , user_list , msg.as_string()) #message.as_string()是将MIMEText对象变成字符串 print( "发送成功")# 实例化后把刚才定义的参数传入
逐行读取Excel,读取完成后退出与腾讯邮件服务器的连接。
完整代码:
#coding:utf-8import smtplibfrom email.mime.text import MIMETextfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipart #创建包含多个部分的邮件体from email.mime.base import MIMEBasefrom email.mime.application import MIMEApplicationimport os.path #分析路径from email import encoderssend_user = "xxxxxxxx@qq.com"password = "xxxxx"smtp_server = "smtp.qq.com"smtp_port = 465 class SendEmail: def send_mail(self,user_list,sub,content,image): user = "发送人的名字" + " + send_user + ">" # 创建一个带附件的实例 msg = MIMEMultipart() msg['Subject'] = sub msg['From'] = user msg['To'] = ";".join(user_list) msg.attach(MIMEText(content, 'plain', 'utf-8')) image_path = './images/'+image+'.pdf' word = MIMEApplication(open(image_path,'rb').read()) word.add_header('Content-Disposition', 'attachment', filename=image+'.pdf') msg.attach(word) smtpObject.sendmail(send_user , user_list , msg.as_string()) #message.as_string()是将MIMEText对象变成字符串 print( "发送成功")if __name__ == '__main__': send = SendEmail() import pandas as pd data = 'summary.xlsx' d_read = pd.read_excel(data,index_col='序号',) print(len(d_read)) smtpObject = smtplib.SMTP_SSL(smtp_server , smtp_port) #qq必须要用.SMTP_SSL smtpObject.login(send_user , password) for i in range(1,len(d_read)+1): user_list = [] print(i) try: email = d_read.loc[i,'邮箱'] # print(email) user_list.append(email) name = d_read.loc[i,'姓名'] # print(name) sub = "标题" content = name+"同学: xxxx" image = str(i) send.send_mail(user_list,sub,content,image) except: print("excel出错") smtpObject.quit() # 发送完就退出连接
如此傻傻的代码赚了几顿饭钱hhh
如果有兴趣还可以再写几个类,
比如读取自己的邮箱,
(下载邮件附件这个操作我试过, 下的很慢, 建议放弃,
邮件读个标题基本就够了)
可以多加附件的文件类型,
(pdf是其中一种, 还有.jpg之类...)
给邮件附件写个多线程发送
(带附件的邮件发送较慢, 一个小附件1秒多, 多线程就快多了)
我: 师兄, 下次还有这种好事记得喊我
师兄: 爪巴