Exemple #1
0
    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
Exemple #2
0
    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()
Exemple #3
0
    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()
Exemple #4
0
 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)
Exemple #5
0
    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()
Exemple #6
0
 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)
Exemple #7
0
    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)
Exemple #8
0
 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!')
Exemple #9
0
def test():
    email = '*****@*****.**'
    c = Chat(email)
    loginfo('me:', email)

    while True:
        time.sleep(10)
Exemple #10
0
    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)
Exemple #11
0
    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'
Exemple #12
0
 def display_mailbox(self, name):
     loginfo('display name:', name)
     try:
         newobj = self.mailboxs[name]
     except Exception, e:
         logerr('mailbox error:', e)
         return False
Exemple #13
0
    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)
Exemple #14
0
    def OnActivate(self, event):
        item = event.GetItem()
        data = self.GetPyData(item)
        if data is None:
            return

        email = data[1]
        loginfo('email:', email) 
Exemple #15
0
 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()
Exemple #16
0
 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)
Exemple #17
0
 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)
Exemple #18
0
 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')
Exemple #19
0
 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)
Exemple #20
0
 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
Exemple #21
0
 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)
Exemple #22
0
 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))
Exemple #23
0
    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
Exemple #24
0
    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.')
Exemple #25
0
 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) 
Exemple #26
0
 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)
Exemple #27
0
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()
Exemple #28
0
 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()
Exemple #29
0
 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
Exemple #30
0
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]