项目初衷
手里有大量的学员家长邮箱,以前都是利用163邮件客户端将邮件地址复制黏贴到收件栏然后群发,效率不高,于是琢磨着能不能设计一款应用程序实现自动发送邮件功能,并且该程序分享给朋友,让朋友在没有Python开发环境下也能帮忙发一部分,从诞生了——yagmail发邮件辅助系统。
设计理念
手里头有一张学员家长信息excel表单,里面有一列为邮件地址,通过程序读取里面的邮件地址生成一个待发送邮件列表,由于服务器一次性发送有阈值,所以要进行邮件数量控制,输入起始数 , 再输入结束数 , 用来截取一段长为 邮件地址,然后通过对截取下来的邮件地址一个一个发送邮件,并要有进度条显示发送进程,最好能打印出发送错误的邮件地址作为反馈,并且分别计数。
主体程序
import pandas as pd #导入数据分析模块
import time #导入时间模块
from tqdm import tqdm #进度条
data=pd.read_excel("test.xlsx",index_col=u'序号') #读取数据
email=data[u'邮箱'] #邮箱地址
m=input("请输入起始数码按回车键:")
n=input("请输入结束数码按回车键:")
recipients=tqdm(email[int(m):int(n)]) #待发送的邮件列表recipients
print("start sending……")
import yagmail #导入发邮箱模块
yag=yagmail.SMTP(user="******",password="******",host='smtp.126.com',encoding='utf-8') #链接邮箱服务器
content=[
"<h1 style='color:red'>暑假线上答疑招生啦!</h1>" ,#可以是html语言,一级标题
"暑假是数学打基础提分的关键时期,可能你的孩子已经在其他辅导机构狂补特补,数学知识的大量摄入必然会导致消化不良。",
"我们三行答疑专门从事数学微信群在线答疑,有一流的师资队伍, 为你的孩子搭建知识架构,解答疑惑,帮助消化,让你家孩子数学永不掉线。",
"只要你孩子想学习数学,就可以来报名,费用美丽,报名入口“三行科创”微信公众号菜单→在线答疑。",
yagmail.inline("D:/PythonProgram/sendmail/qrcode.jpg"), #图片会内嵌到正文
"前50名免费体验。",
"D:/PythonProgram/sendmail/poster1.jpeg", #图片文件以附件形式发送
] #邮件正文
i=0 #用来记总数
k=0 #用来记发送成功数
s=0 #用来记发送失败数
failure_send=[] #用来存放发送失败的邮件
for j in recipients: #对邮箱地址列表循环
i=i+1 #计总数
try:
yag.send(to=j, #发给谁
contents=content, #邮件正文
subject="暑假线上答疑招生啦!", #主题
headers={"From": "曾老师"}, #来自何方
)
k=k+1 #发送成功个数
time.sleep(0.5) #每发一个挂起0.5秒,防止发太快了
except:
print("\n%s is not valid" %j) #如果邮件地址错误打印出错误邮件地址
failure_send.append(j) #追加发送失败的邮件
s=s+1 #发送失败个数
yagmail.SMTP.close(yag) #关闭服务器链接
print("finished!") #1388
print("totally send: %s " %i) #发送邮件总数
print("send sucessfully: %s " %k) #发送成功数
print("send failure: %s " %s) #发送失败数
程序解释
程序大致过程是读取Excel里面的邮件地址形成一个recipients待发送列表,然后对recipients进行循环,利用yagmail一个一个发送,并且给发送的邮件打上标签,发送成功或者发送失败,收集发送失败的邮件地址存在failure_send列表里面。
yagmail模块分析
首先,yagmail比较简单,整体思路清晰,最智能的是能够判断contents列表里面的内容的类型, 先判断是否为本地文件, 如果是本地文件, 则置于附件中发送,可以是相对路径, 也可以填写绝对路径,其次会判断是否为html语言, 是的话, 能够在正文中被浏览器渲染. 如果都不是, 则当作普通文本, 放在邮件正文。
后话
最好不要添加大量的附件,会拖垮发送进程的,也不要让 足够大,不管是163还是126还是qq等第三方邮件服务器都有流量限制和spam措施,应多注意,下一步就是打包成可执行的Windows程序分享给朋友。