def __init__(self, parent, path='HRSLib\\apps\\mail_salary\\'): wx.Frame.__init__(self, None, title=u"发送工资单", size=(640,480)) # create the controls self.statusBar = self.CreateStatusBar() self.menuData = ((u"菜单", (u"打开", u"打开工资表Excel文件", self.OnOpen), #(u"读取", u"读取工资表Excel文件", self.OnReadFile), ), ) # 此编号从0开始计,所以应比excel表格中编号小1 self.resend_list = [] self.test = False # self.test = True self.createMenuBar() self.smtp = MySMTP() self.template = Template(filename=path+'template.mk') self.createMainWindow()
class MailSalaryFrame(wx.Frame): def __init__(self, parent, path='HRSLib\\apps\\mail_salary\\'): wx.Frame.__init__(self, None, title=u"发送工资单", size=(640,480)) # create the controls self.statusBar = self.CreateStatusBar() self.menuData = ((u"菜单", (u"打开", u"打开工资表Excel文件", self.OnOpen), #(u"读取", u"读取工资表Excel文件", self.OnReadFile), ), ) # 此编号从0开始计,所以应比excel表格中编号小1 self.resend_list = [] self.test = False # self.test = True self.createMenuBar() self.smtp = MySMTP() self.template = Template(filename=path+'template.mk') self.createMainWindow() def createMenuBar(self): """创建菜单栏 """ menuBar = wx.MenuBar() for eachMenuData in self.menuData: menuLabel = eachMenuData[0] menuItems = eachMenuData[1:] menuBar.Append(self.createMenu(menuItems), menuLabel) self.SetMenuBar(menuBar) def createMenu(self, menuData): """创建一个菜单 --从创建菜单栏函数中抽象出来的函数 """ menu = wx.Menu() for eachLabel, eachStatus, eachHandler in menuData: if not eachLabel: menu.AppendSeparator() continue menuItem = menu.Append(-1, eachLabel, eachStatus) self.Bind(wx.EVT_MENU, eachHandler, menuItem) return menu wildcard = u"Excel文件(*.xls,*.xlsx)|*.xls*|所有文件(*.*)|*.*" def OnOpen(self, event): dlg = wx.FileDialog(self, u"打开要发送的文件...", os.getcwd(), style=wx.OPEN, wildcard=self.wildcard) if dlg.ShowModal() == wx.ID_OK: self.filename = dlg.GetPath() self.SetPromtingMsg(u"已选择"+self.filename+u"。\n") self.ReadFile(self.filename) dlg.Destroy() def ReadFile(self,filename): self.workingBook = xlrd.open_workbook(filename, encoding_override="cp936") sheet_name_list=self.workingBook.sheet_names() self.statusBar.SetStatusText(u'请选择工资表') self.listCtrl.DeleteAllItems() for index in sheet_name_list: self.listCtrl.InsertStringItem(sheet_name_list.index(index), index) def SetYearMonth(self): '''设置工资单上显示的时间 年: self.year 月: self.month 字符串类型,并检查正确性 ''' self.year = int(self.workingSheet.name.split(".")[0]) self.month = int(self.workingSheet.name.split(".")[1]) if not self.CheckYearMonth(): self.SetPromtingMsg(u'日期解析失败,请勿发送,检查工作表名\n') def CheckYearMonth(self): '''年份为4位,前三位分别为2,0,1 ''' if (type(self.year) != int) or (type(self.month) != int): return False zero = self.year / 10000 first = self.year / 1000 second = (self.year / 100) % 10 third = (self.year / 10) % 10 # last = self.year % 10 return first == 2 and second == 0\ and third == 1 and zero == 0 def OnImport(self, event): index = self.listCtrl.GetFocusedItem() if index == -1: self.SetPromtingMsg(u'没有选择工作表\n') else: self.workingSheet = self.workingBook.sheet_by_index(index) self.SetPromtingMsg(u'读取工作表\"'+self.workingSheet.name+u'\"...') self.SetYearMonth() self.importButton.Disable() self.SetPromtingMsg(u'解析第2行...') row_slice1 = self.workingSheet.row_slice(1) # list of xlrd.sheet.Cell ; 默认读取第二行 index:1 self.title_list = [] for index in row_slice1: self.title_list.append(index.value) # 空列也包含在内 if u'邮箱' in self.title_list and u'身份证号' in self.title_list: self.SetPromtingMsg(u'第2行解析完成\n') self.Analyze() self.sendButton.Enable() else: self.SetPromtingMsg(u'该工作表第2行不含\"邮箱\"或不含\"身份证号\"\n') self.SetPromtingMsg(u'解析失败\n') self.sendButton.Disable() return # self.SetPromtingMsg(u' '.join(self.title_list)+u'\n') def Analyze(self): self.SetPromtingMsg(u'解析工资数据...') self.content = [] nrows = self.workingSheet.nrows for i in range(2,nrows): # 从第三行开始读取 index:2 row_slice = self.workingSheet.row_slice(i) d = dict() for j in self.title_list: if j != '': d[j] = row_slice[self.title_list.index(j)].value self.content.append(d) if len(self.content[-1][u'身份证号'])==0: self.SetPromtingMsg(u'(遇到空的身份证号信息,解析停止)') self.content.remove(self.content[-1]) break self.SetPromtingMsg(u'读取到%d条工资数据\n'%len(self.content)) if self.resend_list: self.SetPromtingMsg(u'重发列表:%s\n'%self.resend_list) self.importButton.Enable() def Send(self): err_list = [] succ_count = 0 fail_count = 0 for idx,val in enumerate(self.content): # if idx == 1: break ## for debug # mail_group_count = 0 ##每5个一组发送 # waiting_time = 00 ##等待10秒 # if idx % 5 == 0: # mail_group_count += 1 # self.SetPromtingMsg(u'已发送%d封,等待%d秒\n'%(5*mail_group_count,waiting_time)) # time.sleep(waiting_time) # ''' # 发送会被coremail邮箱的anti-spam拦截进入灰名单,具体请百度coremail 450 anti-spam GT # 表现为发送5封成功后会返回450错误,不能继续发送 # 需要总行将账号加入白名单,即可 # ''' if self.resend_list != []: if idx not in self.resend_list: continue # 选择发送 # if idx != 115: # continue if val[u'邮箱'].find('@') != -1 and val[u'邮箱'].find('.') != -1: self.SetPromtingMsg(u'正在发送第%d条工资信息...'%idx) mail_content = self.template.render(title_list=self.title_list, content=self.content, index=idx) #self.SetPromtingMsg(val[u'邮箱']) try: if self.test: print "test\n" self.smtp.mail_html=mail_content self.smtp.year=self.year self.smtp.month=self.month self.smtp.qdSMTPSendMail() else: self.smtp.receiver_name=val[u'姓名'] self.smtp.mail_html=mail_content self.smtp.to_addr=val[u'邮箱'] self.smtp.year=self.year self.smtp.month=self.month self.smtp.qdSMTPSendMail() succ_count += 1 self.SetPromtingMsg(u'发送成功\n') #except smtplib.SMTPRecipientsRefused except Exception,ex: print Exception,":",ex tp = (idx,u'错误的邮箱地址\n') self.SetPromtingMsg(u'第%d条工资信息发送失败\n'%idx + tp[1]) err_list.append(tp) else: tp = (idx,u'错误的邮箱地址\n') self.SetPromtingMsg(u'第%d条工资信息发送失败\n'%idx + tp[1]) err_list.append(tp) fail_count += 1 #self.textCtrl.SetDefaultStyle(wx.TextAttr("khaki",font=self.font)) msg = u'发送情况报告:\n' self.SetPromtingMsg(msg) #self.textCtrl.SetDefaultStyle(wx.TextAttr("BLACK",font=self.font)) msg = u'成功发送%d条,'%succ_count msg += u'失败%d条。\n'%fail_count if err_list: msg += u'失败列表:\n' for e in err_list: msg += unicode(e[0]) + self.content[e[0]][u'姓名'] + u'\n' self.SetPromtingMsg(msg)