使用背景:

由于我们公司APP1.0版本要停用,而2.0版本跟1.0不在同一环境中,所以需要邮件通知客户进行更换;

老板甩过来一个Excel表格,里面有3000多客户的邮箱列表,wtf!!

自己手动发肯定是要通宵,而且还不一定能发的完,刚好在学python就试着用python写点代码帮我发了吧。


首先的思路就是:

1、我要读取Excel表格里的邮箱,拿到所有邮箱后,再一一发送;

2、然后使用python发送邮件的库,进行循环发邮件

#-*-coding:utf-8-*-fromemail.headerimportHeaderfromemail.mime.textimportMIMETextimporttimeimportxlrdfromdatetimeimportdate,datetime#导入smtplib邮件发送模块importsmtplibdefread_excel():#打开Excel表格ExceFileUrl=xlrd.open_workbook(r'C:\Users\user\Desktop\2015.xlsx')#print(ExceFileUrl.sheet_names())#获取第一个sheet页面sheet_date=ExceFileUrl.sheet_by_index(0)#print(sheet_date.name,sheet_date.nrows,sheet_date.ncols)#获取低19列的邮箱列表email_data=sheet_date.col_values(19)#print(email_data)returnemail_datamail_list=read_excel()mysender='xxx-service@XXXXX.net'defsender_mail():#创建对象smt_p=smtplib.SMTP()#设置smtp服务器smt_p.connect(host='smtp.mxhichina.com',port=25)#进行邮箱登录一次smt_p.login(user=mysender,password='QiXin123-')count_num=1#使用for循环来进行发邮件foriinmail_list:#因为表格中有的邮箱格式不正确,还有一些空字符,在发邮件的时候会出现异常报错,所以要进行捕获下,捕获到这些异常就跳过try:send_msg=MIMEText('您好,''XXX2.0全新升级,XXX1.0版本到2018年10月31号停止所有服务,切换新版本2.0;如有迁移、续费、使用等需求问题请联系XXX,联系电话188XXXXXXXX。','plain','utf-8')send_msg['From']='E企信'send_msg['To']=isend_msg['subject']='【XXXX2.0启用】1.0停用--通知'smt_p.sendmail(mysender,i,send_msg.as_string())#sleep5秒是因为发送频率过快,判定垃圾邮件的几率大大增加了。time.sleep(5)print('第%d次发送给%s'%(count_num,i))count_num=count_num+1except(UnicodeEncodeError,smtplib.SMTPRecipientsRefused,smtplib.SMTPSenderRefused,AttributeError)ase:#这样打印出来我能知道在发送第几次的时候,哪个邮箱有问题,而且阿里云邮箱一个邮箱最多能发300个print('第%d次给%s发送邮件的时候出现了异常'%(count_num,i))continuesmt_p.quit()sender_mail()

由于阿里云的邮箱限制每个邮箱账号每天最多发300封邮件,我都是手动更换的,遇到Reject的异常程序就停掉了,我就自己更换邮箱账号。

其实可以预先弄一二十个邮箱账号,修改程序,让捕获到smtplib.SMTPDataError: (554, b'Reject这种异常的时候进行更换账号进行发送;

因为比较懒,所以我就没有去修改升级代码;

大致思路是,当碰到smtplib.SMTPDataError: (554, b'Reject异常的时候,获取当前发送邮箱地址所在列表的索引值,

当更换完账号再次进行发邮件的时候,则从获取的索引值那个位置进行发送邮件,这样就不会重复发送了。