Example #1
0
  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()
Example #2
0
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)