def mails(self): name = self.mailuser['name'] count = 0 mailinfos = [] for item in self.uidls: i, k = item loginfo('uidl:', i, k) trycount = 0 while True: try: data = self.pop3.retr(i) except Exception, e: logerr(e) trycount += 1 if trycount == 3: break continue trycount = 0 break if trycount == 3: continue filedata = '\n'.join(data[1]) hashdir = '%02d' % (hash(k) % self.hashdir_count) filename = os.path.join(self.time_path, hashdir, '%d.' % (int(time.time())) + k + '.eml') loginfo('file:', filename, 'size:', len(filedata)) try: ret = mailparse.decode_mail_string(filedata) except Exception, e: traceback.print_exc(file=logfile.logobj.log) continue
def OnFileSaveAs(self, event): item = self.tree.last_item_data() if not item: return user = item['user'] panel = item['panel'] data = panel.get_item_data() loginfo('save data:', data) dlg = wx.FileDialog( self, message=u"保存邮件", defaultDir=os.getcwd(), defaultFile="", wildcard=u"邮件内容 (*.html)|*.html", style=wx.SAVE ) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() if path: info = mailparse.decode_mail(data['filepath']) if info['html']: data = u'主 题: ' + info['subject'] + u'<br>发件人: ' + info['from'] + '<br><br>' + info['html'] else: data = u'主 题: ' + info['subject'] + u'<br>发件人: ' + info['from'] + '<br><br>' + info['plain'].replace('\n', '<br>') f = open(path, 'w') f.write(data.encode(mailparse.charset, 'ignore')) f.close() dlg.Destroy()
def OnFileExport(self, event): item = self.tree.last_item_data() if not item: return user = item['user'] panel = item['panel'] data = panel.get_item_data() loginfo('save data:', data) dlg = wx.FileDialog( self, message=u"保存导出邮件", defaultDir=os.getcwd(), defaultFile="", wildcard=u"邮件文件 (*.eml)|*.eml", style=wx.SAVE ) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() if path: fr = open(data['filepath'], 'r') s = fr.read() fr.close() fw = open(path, 'w') fw.write(s) fw.close() dlg.Destroy()
def OnFileGetMail(self, event): data = self.tree.last_item_data() if not data: return x = {'name':data['user'], 'task':'recvmail'} loginfo('add taskq: last_mailbox:', data['user'], 'task:', x) config.taskq.put(x)
def __init__(self, parent, usercf): sc.SizedDialog.__init__(self, None, -1, u"账户属性", style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) self.parent = parent keys = ['name','mailname','email','recv_interval','reserve_time', 'pop3_server','pop3_pass','smtp_server','smtp_pass'] vals = [] for k in keys: loginfo('find:', k) i = config.cf.mailuser_fields.index(k) vals.append(config.cf.mailuser_fields_cn[i]) pane = self.GetContentsPane() pane.SetSizerType("form") self.items = {} for i in range(0, len(keys)): #loginfo('option:', keys[i], usercf[keys[i]]) wx.StaticText(pane, -1, vals[i]) if keys[i] == 'name': x = wx.TextCtrl(pane, -1, usercf[keys[i]], size=(60, -1), style=wx.TE_READONLY) elif keys[i].endswith('pass'): x = wx.TextCtrl(pane, -1, usercf[keys[i]], size=(60, -1), style=wx.TE_PASSWORD) else: x = wx.TextCtrl(pane, -1, usercf[keys[i]], size=(60, -1)) x.SetSizerProps(expand=True) self.items[keys[i]] = x self.SetButtonSizer(self.CreateStdDialogButtonSizer(wx.OK | wx.CANCEL)) self.SetMinSize(wx.Size(400, 350)) self.Fit()
def last_item_rename(self): data = self.last_item_data() dlg = wx.TextEntryDialog(self, u'邮件夹' + data['boxname'] + u'重命名为:') if dlg.ShowModal() == wx.ID_OK: name = dlg.GetValue() else: dlg.Destroy() return dlg.Destroy() usercf = config.cf.users[data['user']] mailbox = usercf['mailbox'] parts = data['path'].split('/') del parts[0] item = data['item'] utils.mailbox_rename(mailbox, parts, name) parts[-1] = name config.cf.dump_conf(data['user']) newpath = '/' + '/'.join(parts) loginfo('newpath:', newpath) oldpanel = self.parent.mailboxs[data['path']] del self.parent.mailboxs[data['path']] self.parent.mailboxs[newpath] = oldpanel self.parent.mgr.AddPane(oldpanel, wx.aui.AuiPaneInfo().Name(newpath).CenterPane().Hide()) data['path'] = newpath data['boxname'] = name self.SetItemText(item, name)
def load_config(self): userpath = os.path.join(config.cf.home, 'data') users = os.listdir(userpath) for u in users: dirpath = os.path.join(userpath, u) if u.endswith('.bak') or os.path.isfile(dirpath): continue ufile = os.path.join(dirpath, 'config.db') mtime = int(os.path.getmtime(ufile)) if self.file_mtime.has_key(ufile) and self.file_mtime[ufile] == mtime: continue self.file_mtime[ufile] = mtime loginfo('load user config:', u) f = open(ufile, 'r') s = f.read() f.close() x = pickle.loads(s) ts = [] self.tasks[ufile] = ts if x['recv_interval']: ri = int(x['recv_interval']) trm = range(1, 60, ri) else: trm = None item = {'time':[trm,None,None,None,None], 'param':{'name':u, 'task':'recvmail'}, 'lastrun':int(time.time())} loginfo('add task:', item) ts.append(item)
def run(self): threadname = threading.currentThread().getName() while self.is_running: # 读取任务 self.load_config() #print threadname, len(self.tasks) time.sleep(10) t1 = time.localtime() # 分,小时,日,月,周 t = [t1[4], t1[3], t1[2], t1[1], t1[6]] # 循环获取任务列表里的任务 for x in self.tasks: vals = self.tasks[x] #loginfo('values:', vals) for item in vals: k = item['time'] #任务执行时间 v = item['param'] #任务参数 ispass = self.check_time(k) tnow = int(time.time()) if ispass and tnow - item['lastrun'] >= 60: loginfo('scheduler run task') config.taskq.put(v) item['lastrun'] = tnow loginfo('put task ok!')
def test(): email = '*****@*****.**' c = Chat(email) loginfo('me:', email) while True: time.sleep(10)
def recvmail(self, item): name = item['name'] try: ucf = config.cf.users[name] except: traceback.print_exc(file=logfile.logobj.log) loginfo('get user config error!') return loginfo('recv mail:', ucf) mailinfos = [] try: pop = pop3.POP3Client(ucf) pop.init() pop.login() pop.infos() allcount = len(pop.uidls) rcount = 0 while True: rcount += 1 try: minfo = pop.mail() if minfo is None: break except: traceback.print_exc(file=logfile.logobj.log) continue self.recvmail_one_result(name, minfo, rcount, allcount) pop.close() except Exception, e: error = str(e) traceback.print_exc(file=logfile.logobj.log)
def __init__(self, mailuser): self.username = mailuser['email'] self.password = mailuser['pop3_pass'] host = mailuser['pop3_server'] self.hashdir_count = 10 self.uidl_pos = 0 pos = string.find(host, ':') if pos > 0: self.server = host[:pos].strip() self.port = host[pos+1:].strip() else: self.server = host.strip() self.port = 110 self.pop3 = poplib.POP3(self.server) self.pop3.set_debuglevel(0) # mailcount, mailsize self.info = [0, 0] self.uidls = [] self.mailuser = mailuser self.home = config.cf.datadir+os.sep+mailuser['name'] loginfo('home:', self.home) for n in config.cf.mailbox_map_cn2en.values(): npath = self.home + os.sep + n if not os.path.isdir(npath): os.mkdir(npath) self.recvpath = self.home + os.sep + 'recv'
def display_mailbox(self, name): loginfo('display name:', name) try: newobj = self.mailboxs[name] except Exception, e: logerr('mailbox error:', e) return False
def sender(self): while self.isrunning: #loginfo('sender get.') try: x = sendq.get(timeout=5) except: continue loginfo('send:', x) if x['cmd'] == 'onlinestatus': #x['cmd'] = 'onlinestatus' loginfo('check clients:', self.clients) if self.clients.has_key(x['to']): x['msg'] = 'online' else: x['msg'] = 'offline' receq[x['to']].put(x) elif x['cmd'] == 'msg': if not self.clients.has_key(x['to']): x['error'] = 'not found user' receq[x['to']].put(x) continue addr = self.clients[x['to']] msg = simplejson.dumps(x) self.localudp.sendto(msg, addr)
def OnActivate(self, event): item = event.GetItem() data = self.GetPyData(item) if data is None: return email = data[1] loginfo('email:', email)
def OnLeftDClick(self, evt): loginfo('left double click') if self.lastitem: s = self.tree.GetItemData(self.lastitem).GetData() if not s: return filepath = s['filepath'] frame = viewer.MailViewFrame(self, self.parent.rundir, s['user'], filepath) frame.Show()
def OnPopupContactAdd(self, evt): if self.lastitem: s = self.tree.GetItemData(self.lastitem).GetData() if not s: return loginfo('Source:', s) mfrom = s['mailfrom'] item = config.cf.linkman.add(mfrom, mfrom) ctree = self.parent.contact ctree.add(item)
def OnSelChanged(self, evt): self.item = evt.GetItem() if self.item: data = self.GetPyData(self.item) #loginfo(data) tpath = data['path'] loginfo('OnSelChanged path:', tpath) self.parent.display_mailbox(tpath)
def OnMailDel(self, event): loginfo('delete mail') if self.last_mailbox == '/': return panel = self.mailboxs[self.last_mailbox] if not panel: return panel.change_last_box('trash')
def OnEnter(self, event): loginfo('enter ...') text = self.input.GetValue() loginfo('input:', text) self.input.SetValue('') x = {'from':self.fromaddr, 'to':self.toaddr, 'cmd':'msg', 'msg':text, 'time':int(time.time())} ts = '%d-%02d-%02d %02d:%02d:%02d' % time.localtime()[:6] s = '%s %s\n%s\n' % (self.fromaddr, ts, text) self.output.AppendText(s) chat.receq[self.toaddr].put(x)
def add_mailbox_panel(self, k, obj=None): loginfo('add panel:', k) if not obj: if k.count('/') == 1: obj = userbox.UserBoxInfo(self, k) else: obj = treelist.MailListPanel(self, k) obj.Hide() self.mailboxs[k] = obj self.mgr.AddPane(obj, wx.aui.AuiPaneInfo().Name(k).CenterPane().Hide()) return obj
def init_data(self): mailboxkeys = self.mailboxs.keys() loginfo('mailboxkeys:', mailboxkeys) for k in mailboxkeys: loginfo('init data:', k) if not self.mailboxs[k]: self.add_mailbox_panel(k) k = u'/' obj = viewhtml.ViewHtml(self) obj.set_url('http://code.google.com/p/cutemail') self.add_mailbox_panel(k, obj)
def infos(self): self.info = self.pop3.stat() s = self.pop3.uidl() info1 = s[1] for x in info1: x = string.strip(x) a = string.split(x) #loginfo('uidl:', a) if a[1] not in self.mailuser['uidls']: self.uidls.append(a) loginfo('uidl count:', len(self.uidls))
def add_tree_node(self, parent, name, user, tpath): item = self.AppendItem(parent, name) loginfo('add mail panel:', tpath) panel = self.parent.add_mailbox_panel(tpath) data = {'path':tpath, 'user':user, 'boxname':name, 'item':item, 'panel':panel} #loginfo('tree node data:', data) self.SetPyData(item, data) self.SetItemImage(item, self.ridx, wx.TreeItemIcon_Normal) self.SetItemImage(item, self.openidx, wx.TreeItemIcon_Expanded) return item
def __init__(self, parent, rundir, chatx, frommail, tomail, title): wx.Frame.__init__(self, parent, -1, title=u'聊天: '+title, size=(500, 400)) self.rundir = rundir self.fromaddr = frommail self.toaddr = tomail self.chat = chatx chat.receq[self.toaddr] = Queue.Queue() self.make_menu() self.init() loginfo('ChatWindow init ok.')
def load_db_data(self): users = config.cf.users for u in users: #mlist = self.mailboxs['/%s/' % (u) + u'收件箱'] dbpath = os.path.join(config.cf.datadir, u, 'mailinfo.db') loginfo('load db from path:', dbpath) conn = dbope.DBOpe(dbpath) try: ret = conn.query("select id,filename,subject,fromuser,mailfrom,mailto,size,ctime,datetime(date,'unixepoch') as date,attach,mailbox,status from mailinfo order by date") finally: conn.close() for row in ret: self.load_db_info(u, row)
def load_db_one(self, user, mid): dbpath = os.path.join(config.cf.datadir, user, 'mailinfo.db') loginfo('load db from path:', dbpath) conn = dbope.DBOpe(dbpath) try: ret = conn.query("select id,filename,subject,fromuser,mailfrom,mailto,size,ctime,datetime(date,'unixepoch') as date,attach,mailbox,status from mailinfo where id=" + str(mid)) finally: conn.close() if not ret: return None #for row in ret: row = ret[0] return self.load_db_info(user, row)
def get_attach(msg, dirname, filename): if msg.is_multipart(): ilen = len(msg.get_payload()) for i in range(0, ilen): subpart = msg.get_payload(i) get_attach(subpart, dirname, filename) else: if msg.get_param("name"): aname = decode_string(msg.get_param('name')) if type(filename) == types.ListType: if aname in filename: f = open(dirname + os.sep + aname, "wb") cnt = msg.get_payload(decode=True) f.write(cnt) f.close() else: loginfo('aname:', type(aname), aname) loginfo('filename:', type(filename), filename) if aname == filename: tmpfile = os.path.join(dirname, filename) loginfo('tmpfile:', tmpfile) f = open(tmpfile, "wb") cnt = msg.get_payload(decode=True) loginfo('write:', len(cnt)) f.write(cnt) f.close()
def OnFileOpen(self, event): dlg = wx.FileDialog( self, message=u"选择邮件", defaultDir=os.getcwd(), defaultFile="", wildcard=u"邮件文件 (*.eml)|*.eml", style=wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR ) if dlg.ShowModal() == wx.ID_OK: paths = dlg.GetPaths() for path in paths: loginfo('open mail:', path) dlg.Destroy()
def sendmail(self, item): tos = item['to'] usercf = config.cf.users[item['name']] loginfo('smtp server:', usercf['smtp_server']) x = sendmail.SendMail(usercf['smtp_server'], item['from'], item['to']) f = open(item['path'], 'r') s = f.read() f.close() try: x.authsend(s, usercf['smtp_pass']) except Exception, why: traceback.print_exc(file=logfile.logobj.log) mesg = u'信件发送失败! ' + str(why) retval = False
def mailbox_remove(mailbox, names): parent = mailbox_find_parent(mailbox, names) loginfo("parent:", parent) box = names[-1] found = False childs = parent[1] for i in range(0, len(childs)): x = childs[i] if x[0] == box: found = True break if not found: raise ValueError, "not found mailbox" del childs[i]