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 OnActivate(self, evt): #loginfo('event:', evt) loginfo('OnActivate: %s' % self.tree.GetItemText(evt.GetItem())) self.lastitem = evt.GetItem() row = self.tree.GetItemData(evt.GetItem()).GetData() #loginfo('active row:', row) if not row: logerr('not found row.') return if not row.has_key('id'): loginfo('is category.') return #mid, name, mbox = s mid = row['id'] name = row['user'] mbox = row['box'] info = mailparse.decode_mail(row['filepath']) htmldata = info['html'] plaindata = info['plain'] #if htmldata: # self.parent.listcnt.set_text(htmldata) #elif plaindata: # self.parent.listcnt.set_text(plaindata.replace('\r\n', '<br>').replace('\n', '<br>')) self.parent.listcnt.set_text_auto(htmldata, plaindata) attachctl = self.parent.attachctl attachctl.clear() #row['attach'] = simplejson.loads(row['attach']) for item in row['attach']: filename = os.path.join(config.cf.datadir, name, row['mailbox'], row['filename'].strip(os.sep)) homename = os.path.join(config.cf.datadir, name) attachdata = {'file':filename, 'home':homename, 'attach':item[0]} loginfo('attachdata:', attachdata) attachctl.add_file(item[0], attachdata) if row['status'] == 'noread': #row['status'] = 'read' item = evt.GetItem() itemdata = self.tree.GetItemData(item).GetData() #loginfo('noread itemdata:', itemdata) self.draw_category_text(item, 'read') self.tree.SetItemBold(item, False) sql = "update mailinfo set status='read' where id=" + str(itemdata['id']) loginfo('read:', sql) db = dbope.openuser(config.cf, name) db.execute(sql) db.close() self.SetFocus()
def get_item_content(self, item=None): if not item: item = self.lastitem if not item: raise ValueError, 'item must not None' data = self.tree.GetItemData(item).GetData() if not data: raise ValueError, "not found item data" info = mailparse.decode_mail(data['filepath']) data['html'] = info['html'] data['plain'] = info['plain'] return data
def make_viewer(self, mailfile): ret = mailparse.decode_mail(mailfile) #panel = wx.Panel(self) sizer = wx.BoxSizer(wx.VERTICAL) self.viewer = viewhtml.ViewHtml(self) self.viewer.set_text_auto(ret['html'], ret['plain']) sizer.Add(self.viewer, flag=wx.ALL|wx.EXPAND, border=0, proportion=1) if ret['attach']: self.attachctl = viewhtml.AttachListCtrl(self, self.rundir, wx.Size(-1,100)) sizer.Add(self.attachctl, flag=wx.ALL|wx.EXPAND, border=0, proportion=0) homepath = os.path.join(config.cf.datadir, self.user) for item in ret['attach']: self.attachctl.add_file(item[0], {'home':homepath, 'file':mailfile, 'attach':item[0]}) self.SetSizer(sizer)
def mail_import(user, boxnode, filename): hashdir_count = 10 info = mailparse.decode_mail(filename) attachs = [] for x in info["attach"]: attachs.append("::".join(x)) attachstr = "||".join(attachs) att = 0 if len(info["attach"]) > 0: att = 1 if boxnode["boxname"].find("/") == -1: mailbox = config.cf.mailbox_map_cn2en[boxnode["boxname"]] else: return info["mailbox"] = mailbox info["ctime"] = "datetime()" info["user"] = user fname = uuid.uuid1().urn[9:] hashdir = "%02d" % (hash(fname) % hashdir_count) timepath = "%d%02d" % time.localtime()[:2] newdir = os.path.join(config.cf.datadir, user, mailbox, timepath, hashdir) if not os.path.isdir(newdir): os.makedirs(newdir) newfilename = os.sep + os.path.join(timepath, hashdir, "%d." % (int(time.time())) + fname + ".eml") dstfile = os.path.join(newdir, "%d." % (int(time.time())) + fname + ".eml") info["filename"] = newfilename subject = info["subject"].replace("'", "''") attach = attachstr.replace("'", "''") sql = ( "insert into mailinfo(filename,subject,mailfrom,mailto,size,ctime,date,attach,mailbox,status) values " "('%s','%s','%s','%s',%d,%s,'%s','%s','%s','noread')" % ( newfilename, subject, info["from"], ",".join(info["to"]), info["size"], info["ctime"], info["date"], attach, info["mailbox"], ) ) conn = dbope.openuser(config.cf, user) conn.execute(sql) conn.close() shutil.copyfile(filename, dstfile) info["box"] = "/%s/%s" % (user, info["mailbox"]) info["status"] = "noread" info["filepath"] = os.path.join(config.cf.datadir, user, info["mailbox"], info["filename"].lstrip(os.sep)) item = [ info["from"], att, info["subject"], 1, info["date"], str(info["size"] / 1024 + 1) + " K", wx.TreeItemData(info), ] panel = boxnode["panel"] panel.add_mail(item)