求救,新手!不知道错在哪
运行结果:
代码如下:
代码如下:
程序代码:
#!/usr/bin/python # -*- coding: cp936 -*- import smtplib from email.mime.text import MIMEText import email.mime.multipart from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import Encoders import glob import win32api import os, sys ############################################### mail_subject = "" # 邮件主题 mail_host = "smtp." # 设置服务器 mail_user = "******" # 填入个人的邮箱地址 mail_pass = "*******" # 填入个人邮箱的密码 mail_postfix = "XXX.XX" # 发件箱的后缀 mail_content = "" # 邮件正文,可以写“请注意查收,有问题及时联系”之类的 mail_from = "<" + mail_user + ">" # 这里的hello可以任意设置,收到信后,讲按照设置显示 mail_list = {} xls_list = [] CD_TIME = 5 # 两封邮件之间的间隔时间为 5秒 ############################################### def get_mail_list(config_file): # 读取mailist.csv,每行记录是人名,邮件地址 比如张三,zhangsan@ global mail_list # csv 文件可用excel编辑 f = open(config_file, "rb") l = f.readline() f.close() for i in l: t = i.split(',') mail_list[t[0]] = t[1].rstrip() def get_xls_list(filter): # 遍历当前目录下的xls文件,作为邮件附件,文件名为人名,其他xls不要放在该目录例如总表 global xls_list xls_list = glob.glob(filter) def dump_list(): # 打印两个列表,以便核对 print "mail list:" for k, v in mail_list.iteritems(): print " ", k, "\t", v print print "excel list:" for v in xls_list: print " ", v print def precheck_mail_list(): # 检查邮件列表有没错误 global mail_list, xls_list for xls in xls_list: name = xls[:-4] if name not in mail_list: print 'error:此人的邮箱地址没有配置,', xls, ',删除该文件,或在邮件列表中增加配置' print raise() # raise 加了() def get_mail_subject(): # 获取邮件主题,需要输入月份数字,后面会自动加月份薪资明细,比如输入4,邮件主题就是4月份薪资明细 print '输入发送月份:' this_month = raw_input() if int(this_month) < 1 or int(this_month) > 12: print '没有这个月份,亲爱的!' raise() global mail_subject mail_subject = this_month + '月薪明细' print '确认邮件主题:%s\n(y/n)' % mail_subject confirm = raw_input() if confirm.lower() != 'y': print '取消发送' raise() ############################################### def send_mail(): # 发送邮件 s = smtplib.SMTP() s.connect(mail_host) # 连接smtp服务器 s.login(mail_user, mail_pass) # 登录服务器 send_count = 0 skip_mail = [] global mail_list, xls_list, mail_subject for idx, xls in enumerate(xls_list): # 遍历附件列表 print name = xls[:-4] # 后缀名.XLS占4个字符,去掉后缀名,取人名 mail_address = mail_list[name] # 根据人名取他的邮箱地址 if '@' not in mail_address: print '邮箱没有配置,无法发送:', name skip_mail.append(name) continue print '【正在准备邮件】:%s__>%s' % (xls, mail_address) mail_to = [mail_address, ] # 收件人 msg = MIMEMultipart() body = MIMEText(mail_content, _subtype='html', _charset='gb2312') # 创建一个实例,这里设置为html格式邮件 msg.attach(body) msg['Subject'] = mail_subject # 设置主题 msg['From'] = mail_from msg['To'] = ";".join(mail_to) ## 附件内容,如多个附件,就添加多个 part,如part1,part2 part = MIMEBase('application', 'octet-stream') ### 读入文件内容并格式化,该处理文件为当前目标下,也可指定目标 例如:open(r'/tmp/123.txt','rb') part.set_payload(open(xls, 'rb').read()) Encoders.encode_base64(part) ## 设置附件头 part.add_header('Content-Disposition', 'attachment;filename="%s"%xls') msg.attach(part) # 这里设计了一个倒时的功能,万一检查到人名、邮箱配对的错误,马上可以中断,防止工资条发到别人邮箱 for cd in xrange(CD_TIME, 0, -1): print '准备发送,按CTR+C可中断,倒计时%2d' % cd win32api.Sleep(1000) s.sendmail(mail_from, mail_to, msg.as_string()) # 发送邮件 send_count = send_count + 1 print'【邮件发送成功】:%s__>%s' % (xls, mail_address) ## 删除已发送的邮件,这样的话,万一中间出错只需要重新执行脚本就可以,已发送过的人的邮件不会再3出现,也不会被发送 win32api.DeleteFile(xls) # all complete? if idx < len(xls_list) - 1: for cd in xrange(CD_TIME, 0, -1): print '准备下一封信,按Ctr+c可中断,倒计时%2d' % cd win32api.Sleep(1000) s.close() print print'所有邮件发送成功!总共%d封' % send_count if len(skip_mail) > 0: print '另有%d封邮件无法发送' % len(skip_mail) def do_work(): get_mail_list('maillit.csv') get_xls_list('*.xls') dump_list() precheck_mail_list() get_mail_subject() send_mail() ############################################ if __name__ == '__main__': do_work()