From 13bbe633655947dbfaa6c440a57f4e7bf0909d77 Mon Sep 17 00:00:00 2001 From: Patrick Ulbrich Date: Sun, 15 Jan 2012 14:09:29 +0100 Subject: [PATCH] re-enable watching of multiple folders - except for IDLE accounts --- Mailnag/configuration/accountdialog.py | 22 +++-- Mailnag/daemon/mails.py | 124 +++++++++++++------------ data/account_dialog.ui | 4 +- 3 files changed, 81 insertions(+), 69 deletions(-) diff --git a/Mailnag/configuration/accountdialog.py b/Mailnag/configuration/accountdialog.py index 9a7834d..dac1c01 100644 --- a/Mailnag/configuration/accountdialog.py +++ b/Mailnag/configuration/accountdialog.py @@ -105,14 +105,22 @@ class AccountDialog: pass - def _on_entry_changed(self, widget): - # validate - ok = len(self._entry_account_name.get_text()) > 0 and \ - len(self._entry_account_user.get_text()) > 0 and \ - len(self._entry_account_password.get_text()) > 0 and \ - len(self._entry_account_server.get_text()) > 0 + def _on_entry_changed(self, widget): + if widget is self._entry_account_folder: + # disable IMAP Push checkbox if multiple folders are specifed + if ("," in self._entry_account_folder.get_text()): + self._chk_account_push.set_active(False) + self._chk_account_push.set_sensitive(False) + else: + self._chk_account_push.set_sensitive(True) + else: + # validate + ok = len(self._entry_account_name.get_text()) > 0 and \ + len(self._entry_account_user.get_text()) > 0 and \ + len(self._entry_account_password.get_text()) > 0 and \ + len(self._entry_account_server.get_text()) > 0 - self._button_save.set_sensitive(ok) + self._button_save.set_sensitive(ok) def _on_cmb_account_type_changed(self, widget): diff --git a/Mailnag/daemon/mails.py b/Mailnag/daemon/mails.py index af7a80d..f1bcf13 100644 --- a/Mailnag/daemon/mails.py +++ b/Mailnag/daemon/mails.py @@ -48,75 +48,81 @@ class Mails: if srv == None: continue # continue with next account if server is empty elif acc.imap: # IMAP - folder = acc.folder.strip() - if len(folder) == 0: - folder = "INBOX" + if len(acc.folder.strip()) == 0: + folder_list = ["INBOX"] + else: + folder_list = acc.folder.split(',') + + for folder in folder_list: + folder = folder.strip() + if len(folder) == 0: + continue - srv.select(folder, readonly=True) # select IMAP folder - try: - status, data = srv.search(None, 'UNSEEN') # ALL or UNSEEN - except: - print "The folder:", folder, "does not exist, using INBOX instead" + srv.select(folder, readonly=True) # select IMAP folder try: - srv.select('INBOX', readonly=True) # If search fails select INBOX and try again status, data = srv.search(None, 'UNSEEN') # ALL or UNSEEN except: - print "INBOX Could not be found", sys.exc_info()[0] + print "The folder:", folder, "does not exist, using INBOX instead" + try: + srv.select('INBOX', readonly=True) # If search fails select INBOX and try again + status, data = srv.search(None, 'UNSEEN') # ALL or UNSEEN + except: + print "INBOX Could not be found", sys.exc_info()[0] - if status != 'OK' or None in [d for d in data]: - print "Folder", folder, "in status", status, "| Data:", data, "\n" - continue # Bugfix LP-735071 - for num in data[0].split(): - typ, msg_data = srv.fetch(num, '(BODY.PEEK[HEADER])') # header only (without setting READ flag) - for response_part in msg_data: - if isinstance(response_part, tuple): - try: - msg = email.message_from_string(response_part[1]) - except: - print "Could not get IMAP message." # debug - continue - try: + if status != 'OK' or None in [d for d in data]: + print "Folder", folder, "in status", status, "| Data:", data, "\n" + continue # Bugfix LP-735071 + for num in data[0].split(): + typ, msg_data = srv.fetch(num, '(BODY.PEEK[HEADER])') # header only (without setting READ flag) + for response_part in msg_data: + if isinstance(response_part, tuple): try: - sender = self._format_header('sender', msg['From']) # get sender and format it - except KeyError: - print "KeyError exception for key 'From' in message." # debug - sender = self._format_header('sender', msg['from']) - except: - print "Could not get sender from IMAP message." # debug - sender = "Error in sender" - try: + msg = email.message_from_string(response_part[1]) + except: + print "Could not get IMAP message." # debug + continue try: - datetime, seconds = self._format_header('date', msg['Date']) # get date and format it - except KeyError: - print "KeyError exception for key 'Date' in message." # debug - datetime, seconds = self._format_header('date', msg['date']) - except: - print "Could not get date from IMAP message." # debug - datetime = time.strftime('%Y.%m.%d %X') # take current time as "2010.12.31 13:57:04" - seconds = time.time() # take current time as seconds - try: + try: + sender = self._format_header('sender', msg['From']) # get sender and format it + except KeyError: + print "KeyError exception for key 'From' in message." # debug + sender = self._format_header('sender', msg['from']) + except: + print "Could not get sender from IMAP message." # debug + sender = "Error in sender" try: - subject = self._format_header('subject', msg['Subject']) # get subject and format it - except KeyError: - print "KeyError exception for key 'Subject' in message." # debug - subject = self._format_header('subject', msg['subject']) - except: - print "Could not get subject from IMAP message." # debug - subject = _('No subject') - try: - id = msg['Message-Id'] - except: - print "Could not get id from IMAP message." # debug - id = None + try: + datetime, seconds = self._format_header('date', msg['Date']) # get date and format it + except KeyError: + print "KeyError exception for key 'Date' in message." # debug + datetime, seconds = self._format_header('date', msg['date']) + except: + print "Could not get date from IMAP message." # debug + datetime = time.strftime('%Y.%m.%d %X') # take current time as "2010.12.31 13:57:04" + seconds = time.time() # take current time as seconds + try: + try: + subject = self._format_header('subject', msg['Subject']) # get subject and format it + except KeyError: + print "KeyError exception for key 'Subject' in message." # debug + subject = self._format_header('subject', msg['subject']) + except: + print "Could not get subject from IMAP message." # debug + subject = _('No subject') + try: + id = msg['Message-Id'] + except: + print "Could not get id from IMAP message." # debug + id = None - if id == None or id == '': - id = str(hash(acc.server + acc.user + sender + subject)) # create fallback id + if id == None or id == '': + id = str(hash(acc.server + acc.user + sender + subject)) # create fallback id - if id not in mail_ids: # prevent duplicates caused by Gmail labels - if not (filter_enabled and self._in_filter(sender + subject)): # check filter - mail_list.append(Mail(seconds, subject, \ - sender, datetime, id, acc.get_id())) - mail_ids.append(id) # add id to list + if id not in mail_ids: # prevent duplicates caused by Gmail labels + if not (filter_enabled and self._in_filter(sender + subject)): # check filter + mail_list.append(Mail(seconds, subject, \ + sender, datetime, id, acc.get_id())) + mail_ids.append(id) # add id to list # don't close IMAP idle connections if not acc.idle: diff --git a/data/account_dialog.ui b/data/account_dialog.ui index e34b6de..0cc133c 100644 --- a/data/account_dialog.ui +++ b/data/account_dialog.ui @@ -282,6 +282,7 @@ True True + 1 @@ -362,9 +363,6 @@ 1 - - - True