使⽤Python进⾏邮件的批量发送(从Excel读取收件⼈、主题、正⽂、附件地址
等)
背景
由于⼯作需要,经常要批量发送邮件,最开始的解决⽅法是通过Excel的VBA宏+outlook进⾏发送,但由于平时更多的使⽤Foxmail,⽽VBA调⽤Foxmail的办法⾄今都没有很好的解决(汗…)并且,很多环境中excel的vba与outlook的环境并不是每台机⼦都具备,所以萌⽣了使⽤Python打包⼀个邮件批量发送的⼩程序。
程序功能:
收件⼈、抄送⼈、主题、正⽂以及附件均通过Excel控制,只需要制作好Excel⽂件,即可批量发送;
使⽤⽅法:
1. 将主程序与“邮件地址.xlsx"放在同⼀个⽂件夹下python怎么读入excel
2. 发送前要核对邮件地址.xlsx中的数据准确性,且不要改动列的顺序。
3. 发送完成后,会在当前⽬录下⽣成的⽂件,记录发送的结果
4. 可通过pyinstaller⽅法,将Python⽂件进⾏打包,⽅便多种环境(Windows)使⽤。
邮件地址.xlsx的格式如下:
源码如下:
import os
import smtplib
import datetime
from email import encoders
from email.header import Header  # ⽤来设置邮件头和邮件主题
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from import MIMEText
import pandas as pd
def addAttch(attach_file):
att = MIMEBase('application','octet-stream')# 这两个参数不知道啥意思,⼆进制流⽂件
att.set_payload(open(attach_file,'rb').read())
# att.add_header('Content-Disposition', 'attachment', filename=(attach_file.split("\\")[-1]))
att.add_header('Content-Disposition','attachment', filename=('gbk','', attach_file.split("\\")[-1]))    de_base64(att)
return att
print("使⽤前请再次确认邮件地址.xlsx⽂件中的各项数据正确,并仔细阅读提⽰") nowtime = datetime.datetime.strftime(w(),'%Y-%m-%d %H:%M:%S')
# 发件⼈
sender ='XXX@chinatelecom'
# 所使⽤的⽤来发送邮件的SMTP服务器
smtpServer ='smtp.chinatelecom'
# 发送邮箱的⽤户名和密码
username ='XXX@chinatelecom'
password =input("请输⼊邮箱密码")
nowpath = os.getcwd()
df = pd.read_excel(nowpath+"/邮件地址.xlsx")
#print(df)
# 读取项⽬名称列,不要列名
df = df.fillna(value="")
df_li = list()
try:
smtp = smtplib.SMTP_SSL(smtpServer,465)# ssl安全连接,端⼝号465
#smtp = smtplib.SMTP()
#t(smtpserver)
#t(smtpServer,465)  # 连接发送邮件的服务器
smtp.login(username, password)# 登录服务器
for df_li in df_li:
message = MIMEMultipart()
message.attach(MIMEText(df_li[3],'plain','utf-8'))# 邮件正⽂
message['From']= sender  # 邮件上显⽰的发件⼈
message['To']= df_li[0]# 收件⼈
message['cc']= df_li[1]# 抄送⼈
message['Subject']= Header(df_li[2],'utf-8')# 邮件主题
if ists(df_li[4]):
message.attach(addAttch(df_li[4]))#添加附件
else:
print("发送给"+df_li[0]+"的邮件由于没有附件,没有发送")
f =open('.\\',"a+")
f.write(nowtime+"*********发送给"+df_li[0]+"的邮件由于没有附件,没有发送\r\n")
f.close()
continue
smtp.sendmail(sender, message['To'], message.as_string())# 填⼊邮件的相关信息并发送print("发送给"+df_li[0]+"的邮件发送成功")
f =open('.\\',"a+")
f.write(nowtime +"***********发送给"+df_li[0]+"的邮件发送成功\r\n")
f.close()
smtp.quit()
except smtplib.SMTPException:
print("邮件服务器连接错误(请检查⽤户名与密码),邮件发送失败")
其他反思
1. 最开始测试的使⽤的163邮箱,使⽤smtplib.SMTP()即可正确连接smtp服务器,但后来使⽤进⾏发送的时候,由于使⽤了
SSL协议,所以修改为smtplib.SMTP_SSL(smtpServer,465) ,根据的说明配置端⼝号。
2. 通过pyinstaller⽅法进⾏打包程序以后,界⾯会⼀闪⽽逝,⽆法判断所以⼜添加了写⼊log的功能,需要以"a+"权限打开,感觉
效率有些低下,试图寻更好的⽅法。
a+打开⼀个⽂件⽤于读写。如果该⽂件已存在,⽂件指针将会放在⽂件的结尾。⽂件打开时会是追加模式。如果该⽂件不存在,创建新⽂件⽤于读写。
3. 试图通过os.system(‘pause’)⽅法构造任意键继续的效果,但是显⽰乱码,打包后的程序⽆法正确显⽰。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。