From 133e0932c2859c85f54c50d936cc734c375392c0 Mon Sep 17 00:00:00 2001 From: Timo Kankare Date: Tue, 18 Oct 2016 22:56:49 +0300 Subject: [PATCH 1/6] Added set_config method to Account class, so that existing account can be reconfigured. --- Mailnag/common/accounts.py | 37 +++++++++++++++++++++-------------- tests/test_account.py | 40 ++++++++++++++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index 554c3bf..bdb67b0 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -47,25 +47,32 @@ CREDENTIAL_KEY = 'Mailnag password for %s://%s@%s' # Account class # class Account: - def __init__(self, enabled = False, name = '', user = '', \ - password = '', oauth2string = '', server = '', port = '', ssl = True, imap = True, idle = False, folders = [], mailbox_type = None, **kw): - - self.enabled = enabled # bool + def __init__(self, mailbox_type=None, enabled = False, name = '', **kw): + self.set_config( + mailbox_type=mailbox_type, + name=name, + enabled=enabled, + config=kw) + + + def set_config(self, mailbox_type, name, enabled, config): + """Set accounts configuration.""" + self.enabled = enabled if mailbox_type: self.mailbox_type = mailbox_type else: - self.mailbox_type = 'imap' if imap else 'pop3' + self.mailbox_type = 'imap' if config.get('imap', True) else 'pop3' self.name = name - self.user = user - self.password = password - self.oauth2string = oauth2string - self.server = server - self.port = port - self.ssl = ssl # bool - self.imap = imap # bool - self.idle = idle # bool - self.folders = folders - self._rest_of_config = kw + self.user = config.get('user', '') + self.password = config.get('password', '') + self.oauth2string = config.get('oauth2string', '') + self.server = config.get('server', '') + self.port = config.get('port', '') + self.ssl = config.get('ssl', True) + self.imap = config.get('imap', True) + self.idle = config.get('idle', False) + self.folders = config.get('folders', []) + self._rest_of_config = config self._backend = None diff --git a/tests/test_account.py b/tests/test_account.py index cd0c6c9..98c25d6 100644 --- a/tests/test_account.py +++ b/tests/test_account.py @@ -45,12 +45,44 @@ def test_account_should_keep_configuration(): 'user': 'who', 'password': 'secret', 'oauth2string': 'who knows', - 'server': 'example.org', + 'server': 'example.org', 'port': '1234', 'ssl': True, - 'imap': True, - 'idle': True, - 'folders': ['a', 'b'], + 'imap': True, + 'idle': True, + 'folders': ['a', 'b'], + 'mailbox_type': 'mybox', + } + assert expected_config == config + + +def test_account_should_store_configuration(): + new_config = { + 'user': 'who', + 'password': 'secret', + 'oauth2string': 'who knows', + 'server': 'example.org', + 'port': '1234', + 'ssl': True, + 'imap': True, + 'idle': True, + 'folders': ['a', 'b'], + } + account = Account() + account.set_config(mailbox_type='mybox', name='my name', enabled=True, config=new_config) + config = account.get_config() + expected_config = { + 'enabled': True, + 'name': 'my name', + 'user': 'who', + 'password': 'secret', + 'oauth2string': 'who knows', + 'server': 'example.org', + 'port': '1234', + 'ssl': True, + 'imap': True, + 'idle': True, + 'folders': ['a', 'b'], 'mailbox_type': 'mybox', } assert expected_config == config From c46ee7501cdd43603064d89763fa693cf37d7a82 Mon Sep 17 00:00:00 2001 From: Timo Kankare Date: Wed, 19 Oct 2016 17:35:01 +0300 Subject: [PATCH 2/6] A straightforward and tedious implementation to account dialog for configuring mbox and maildir mailbox types. New UI widgets for file and directory pahts added to account_dialog.ui. --- Mailnag/configuration/accountdialog.py | 119 +++++++++++++++++++++++-- data/account_dialog.ui | 68 +++++++++++++- 2 files changed, 177 insertions(+), 10 deletions(-) diff --git a/Mailnag/configuration/accountdialog.py b/Mailnag/configuration/accountdialog.py index cca9332..7657336 100644 --- a/Mailnag/configuration/accountdialog.py +++ b/Mailnag/configuration/accountdialog.py @@ -39,6 +39,9 @@ IDX_WEB_DE = 2 IDX_YAHOO = 3 IDX_IMAP = 4 IDX_POP3 = 5 +IDX_MBOX = 6 +IDX_MAILDIR = 7 + PROVIDER_CONFIGS = [ [ 'Gmail', 'imap.gmail.com', '993'], @@ -68,12 +71,18 @@ class AccountDialog: self._cmb_account_type = builder.get_object("cmb_account_type") self._label_account_name = builder.get_object("label_account_name") self._entry_account_name = builder.get_object("entry_account_name") + self._label_account_user = builder.get_object("label_account_user") self._entry_account_user = builder.get_object("entry_account_user") + self._label_account_password = builder.get_object("label_account_password") self._entry_account_password = builder.get_object("entry_account_password") self._label_account_server = builder.get_object("label_account_server") self._entry_account_server = builder.get_object("entry_account_server") self._label_account_port = builder.get_object("label_account_port") self._entry_account_port = builder.get_object("entry_account_port") + self._label_account_file_path = builder.get_object("label_account_file_path") + self._chooser_account_file_path = builder.get_object("chooser_file_path") + self._label_account_directory_path = builder.get_object("label_account_directory_path") + self._chooser_account_directory_path = builder.get_object("chooser_directory_path") self._expander_folders = builder.get_object("expander_folders") self._overlay = builder.get_object("overlay") self._treeview_folders = builder.get_object("treeview_folders") @@ -118,6 +127,7 @@ class AccountDialog: def _load_account(self, acc): + config = acc.get_config() self._entry_account_name.set_text(acc.name) self._entry_account_user.set_text(acc.user) self._entry_account_password.set_text(acc.password) @@ -126,6 +136,10 @@ class AccountDialog: self._chk_account_push.set_active(acc.idle) self._chk_account_push.set_sensitive(len(acc.folders) < 2) self._chk_account_ssl.set_active(acc.ssl) + if 'path' in config: + self._chooser_account_file_path.set_filename(config.get('path')) + if 'path' in config: + self._chooser_account_directory_path.set_current_folder(config.get('path')) def _configure_account(self, acc): @@ -147,7 +161,21 @@ class AccountDialog: if self._folders_received: acc.folders = self._get_selected_folders() acc.idle = self._chk_account_push.get_active() - + elif acctype == IDX_MBOX: + name = self._entry_account_name.get_text() + config = {} + config['path'] = self._chooser_account_directory_path.get_current_folder() + acc.set_config(mailbox_type='mbox', name=name, enabled=True, config=config) + elif acctype == IDX_MAILDIR: + if self._folders_received: + folders = self._get_selected_folders() + else: + folders = [] + name = self._entry_account_name.get_text() + config = {} + config['path'] = self._chooser_account_directory_path.get_current_folder() + config['folders'] = folders + acc.set_config(mailbox_type='maildir', name=name, enabled=True, config=config) else: # known provider (imap only) acc.name = self._entry_account_user.get_text() acc.user = self._entry_account_user.get_text() @@ -181,9 +209,11 @@ class AccountDialog: self._cmb_account_type.append_text(p[0]) self._cmb_account_type.append_text(_("Other (IMAP)")) self._cmb_account_type.append_text(_("Other (POP3)")) + self._cmb_account_type.append_text(_("MBox")) + self._cmb_account_type.append_text(_("Maildir")) # select account type - if len(self._acc.server) == 0: + if self._acc.mailbox_type == 'imap' and len(self._acc.server) == 0: # default to Gmail when creating new accounts self._cmb_account_type.set_active(IDX_GMAIL) # triggers _on_cmb_account_type_changed() else: @@ -200,7 +230,18 @@ class AccountDialog: if idx >= 0: self._cmb_account_type.set_active(idx) # triggers _on_cmb_account_type_changed() else: - self._cmb_account_type.set_active(IDX_IMAP if self._acc.imap else IDX_POP3) # triggers _on_cmb_account_type_changed() + if self._acc.mailbox_type == 'imap': + idx = IDX_IMAP + elif self._acc.mailbox_type == 'pop3': + idx = IDX_POP3 + elif self._acc.mailbox_type == 'mbox': + idx = IDX_MBOX + elif self._acc.mailbox_type == 'maildir': + idx = IDX_MAILDIR + else: + # This is actually error case, but recovering to IMAP + idx = IDX_IMAP + self._cmb_account_type.set_active(idx) # triggers _on_cmb_account_type_changed() # Don't allow changing the account type if the loaded account has folders. self._cmb_account_type.set_sensitive(len(self._acc.folders) == 0) @@ -224,6 +265,12 @@ class AccountDialog: 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 + elif acctype == IDX_MBOX: + ok = len(self._entry_account_name.get_text()) > 0 and \ + (self._chooser_account_file_path.get_filename() is not None) + elif acctype == IDX_MAILDIR: + ok = len(self._entry_account_name.get_text()) > 0 and \ + (self._chooser_account_directory_path.get_current_folder() is not None) else: # known provider ok = len(self._entry_account_user.get_text()) > 0 and \ len(self._entry_account_password.get_text()) > 0 @@ -326,6 +373,10 @@ class AccountDialog: if acctype == IDX_POP3: self._label_account_name.set_visible(True) self._entry_account_name.set_visible(True) + self._label_account_user.set_visible(True) + self._entry_account_user.set_visible(True) + self._label_account_password.set_visible(True) + self._entry_account_password.set_visible(True) self._label_account_server.set_visible(True) self._entry_account_server.set_visible(True) self._label_account_port.set_visible(True) @@ -333,9 +384,17 @@ class AccountDialog: self._expander_folders.set_visible(False) self._chk_account_push.set_visible(False) self._chk_account_ssl.set_visible(True) + self._label_account_file_path.set_visible(False) + self._chooser_account_file_path.set_visible(False) + self._label_account_directory_path.set_visible(False) + self._chooser_account_directory_path.set_visible(False) elif acctype == IDX_IMAP: self._label_account_name.set_visible(True) self._entry_account_name.set_visible(True) + self._label_account_user.set_visible(True) + self._entry_account_user.set_visible(True) + self._label_account_password.set_visible(True) + self._entry_account_password.set_visible(True) self._label_account_server.set_visible(True) self._entry_account_server.set_visible(True) self._label_account_port.set_visible(True) @@ -343,9 +402,35 @@ class AccountDialog: self._expander_folders.set_visible(True) self._chk_account_push.set_visible(True) self._chk_account_ssl.set_visible(True) - else: # known provider (imap only) - self._label_account_name.set_visible(False) - self._entry_account_name.set_visible(False) + self._label_account_file_path.set_visible(False) + self._chooser_account_file_path.set_visible(False) + self._label_account_directory_path.set_visible(False) + self._chooser_account_directory_path.set_visible(False) + elif acctype == IDX_MBOX: + self._label_account_name.set_visible(True) + self._entry_account_name.set_visible(True) + self._label_account_user.set_visible(False) + self._entry_account_user.set_visible(False) + self._label_account_password.set_visible(False) + self._entry_account_password.set_visible(False) + self._label_account_server.set_visible(False) + self._entry_account_server.set_visible(False) + self._label_account_port.set_visible(False) + self._entry_account_port.set_visible(False) + self._expander_folders.set_visible(False) + self._chk_account_push.set_visible(False) + self._chk_account_ssl.set_visible(False) + self._label_account_file_path.set_visible(True) + self._chooser_account_file_path.set_visible(True) + self._label_account_directory_path.set_visible(False) + self._chooser_account_directory_path.set_visible(False) + elif acctype == IDX_MAILDIR: + self._label_account_name.set_visible(True) + self._entry_account_name.set_visible(True) + self._label_account_user.set_visible(False) + self._entry_account_user.set_visible(False) + self._label_account_password.set_visible(False) + self._entry_account_password.set_visible(False) self._label_account_server.set_visible(False) self._entry_account_server.set_visible(False) self._label_account_port.set_visible(False) @@ -353,6 +438,28 @@ class AccountDialog: self._expander_folders.set_visible(True) self._chk_account_push.set_visible(False) self._chk_account_ssl.set_visible(False) + self._label_account_file_path.set_visible(False) + self._chooser_account_file_path.set_visible(False) + self._label_account_directory_path.set_visible(True) + self._chooser_account_directory_path.set_visible(True) + else: # known provider (imap only) + self._label_account_name.set_visible(False) + self._entry_account_name.set_visible(False) + self._label_account_user.set_visible(True) + self._entry_account_user.set_visible(True) + self._label_account_password.set_visible(True) + self._entry_account_password.set_visible(True) + self._label_account_server.set_visible(False) + self._entry_account_server.set_visible(False) + self._label_account_port.set_visible(False) + self._entry_account_port.set_visible(False) + self._expander_folders.set_visible(True) + self._chk_account_push.set_visible(False) + self._chk_account_ssl.set_visible(False) + self._label_account_file_path.set_visible(False) + self._chooser_account_file_path.set_visible(False) + self._label_account_directory_path.set_visible(False) + self._chooser_account_directory_path.set_visible(False) self._folders_received = False self._selected_folder_count = 0 diff --git a/data/account_dialog.ui b/data/account_dialog.ui index b26c75d..5958696 100644 --- a/data/account_dialog.ui +++ b/data/account_dialog.ui @@ -1,5 +1,5 @@ - + @@ -151,7 +151,7 @@ 0 - 6 + 8 2 @@ -177,7 +177,7 @@ 0 - 7 + 9 2 @@ -281,6 +281,9 @@ + + -1 + @@ -294,10 +297,67 @@ 0 - 8 + 10 2 + + + True + False + File path: + 0 + + + 0 + 6 + + + + + True + False + False + False + True + False + + + + + 1 + 6 + + + + + True + False + Directory: + 0 + + + 0 + 7 + + + + + True + False + select-folder + False + False + True + False + + + + + 1 + 7 + + True From 274c3fb70c17bbec285c2de0c8a16c274b521208 Mon Sep 17 00:00:00 2001 From: Timo Kankare Date: Thu, 20 Oct 2016 22:44:39 +0300 Subject: [PATCH 3/6] Defined mailbox type to be '' (empty string) for new account. --- Mailnag/common/accounts.py | 4 +++- tests/test_account.py | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index bdb67b0..28f2289 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -60,8 +60,10 @@ class Account: self.enabled = enabled if mailbox_type: self.mailbox_type = mailbox_type - else: + elif 'imap' in config: self.mailbox_type = 'imap' if config.get('imap', True) else 'pop3' + else: + self.mailbox_type = '' self.name = name self.user = config.get('user', '') self.password = config.get('password', '') diff --git a/tests/test_account.py b/tests/test_account.py index 98c25d6..9c08e17 100644 --- a/tests/test_account.py +++ b/tests/test_account.py @@ -96,6 +96,13 @@ def test_account_config_should_always_contain_certain_values(): assert 'mailbox_type' in config +def test_type_should_be_empty_by_default(): + account = Account() + config = account.get_config() + assert account.mailbox_type == '' + assert config['mailbox_type'] == '' + + def test_account_should_configurable_with_any_parameters(): account = Account(weird='odd', odd='weird') config = account.get_config() From a2dce4aa172fffada9df45c49fcb9941666f47b2 Mon Sep 17 00:00:00 2001 From: Timo Kankare Date: Thu, 20 Oct 2016 22:47:28 +0300 Subject: [PATCH 4/6] Modified account dialog to use config dictionary instead of account members. Fixed chooser widget usage. --- Mailnag/configuration/accountdialog.py | 146 ++++++++++++++----------- 1 file changed, 82 insertions(+), 64 deletions(-) diff --git a/Mailnag/configuration/accountdialog.py b/Mailnag/configuration/accountdialog.py index 7657336..396e83b 100644 --- a/Mailnag/configuration/accountdialog.py +++ b/Mailnag/configuration/accountdialog.py @@ -129,72 +129,86 @@ class AccountDialog: def _load_account(self, acc): config = acc.get_config() self._entry_account_name.set_text(acc.name) - self._entry_account_user.set_text(acc.user) - self._entry_account_password.set_text(acc.password) - self._entry_account_server.set_text(acc.server) - self._entry_account_port.set_text(acc.port) - self._chk_account_push.set_active(acc.idle) - self._chk_account_push.set_sensitive(len(acc.folders) < 2) - self._chk_account_ssl.set_active(acc.ssl) + if 'user' in config: + self._entry_account_user.set_text(config['user']) + if 'password' in config: + self._entry_account_password.set_text(config['password']) + if 'server' in config: + self._entry_account_server.set_text(config['server']) + if 'port' in config: + self._entry_account_port.set_text(config['port']) + if 'idle' in config: + self._chk_account_push.set_active(config['idle']) + if 'folders' in config: + self._chk_account_push.set_sensitive(len(config['folders']) < 2) + if 'ssl' in config: + self._chk_account_ssl.set_active(config['ssl']) if 'path' in config: self._chooser_account_file_path.set_filename(config.get('path')) if 'path' in config: - self._chooser_account_directory_path.set_current_folder(config.get('path')) + self._chooser_account_directory_path.set_filename(config.get('path')) def _configure_account(self, acc): + config = {} acctype = self._cmb_account_type.get_active() if (acctype == IDX_POP3) or (acctype == IDX_IMAP): - acc.name = self._entry_account_name.get_text() - acc.user = self._entry_account_user.get_text() - acc.password = self._entry_account_password.get_text() - acc.server = self._entry_account_server.get_text() - acc.port = self._entry_account_port.get_text() - acc.ssl = self._chk_account_ssl.get_active() + name = self._entry_account_name.get_text() + config['user'] = self._entry_account_user.get_text() + config['password'] = self._entry_account_password.get_text() + config['server'] = self._entry_account_server.get_text() + config['port'] = self._entry_account_port.get_text() + config['ssl'] = self._chk_account_ssl.get_active() if acctype == IDX_POP3: - acc.imap = False - acc.folders = [] - acc.idle = False + mailbox_type = 'pop3' + config['imap'] = False + config['folders'] = [] + config['idle'] = False elif acctype == IDX_IMAP: - acc.imap = True + mailbox_type = 'imap' + config['imap'] = True if self._folders_received: - acc.folders = self._get_selected_folders() - acc.idle = self._chk_account_push.get_active() + config['folders'] = self._get_selected_folders() + config['idle'] = self._chk_account_push.get_active() elif acctype == IDX_MBOX: + mailbox_type = 'mbox' name = self._entry_account_name.get_text() - config = {} - config['path'] = self._chooser_account_directory_path.get_current_folder() - acc.set_config(mailbox_type='mbox', name=name, enabled=True, config=config) + config['path'] = self._chooser_account_file_path.get_filename() elif acctype == IDX_MAILDIR: - if self._folders_received: - folders = self._get_selected_folders() - else: - folders = [] + mailbox_type = 'maildir' name = self._entry_account_name.get_text() - config = {} - config['path'] = self._chooser_account_directory_path.get_current_folder() - config['folders'] = folders - acc.set_config(mailbox_type='maildir', name=name, enabled=True, config=config) - else: # known provider (imap only) - acc.name = self._entry_account_user.get_text() - acc.user = self._entry_account_user.get_text() - acc.password = self._entry_account_password.get_text() - acc.ssl = True - acc.imap = True + config['path'] = self._chooser_account_directory_path.get_filename() if self._folders_received: - acc.folders = self._get_selected_folders() - acc.idle = (len(acc.folders) < 2) + config['folders'] = self._get_selected_folders() + else: + config['folders'] = [] + else: # known provider (imap only) + mailbox_type = 'imap' + name = self._entry_account_user.get_text() + config['user'] = self._entry_account_user.get_text() + config['password'] = self._entry_account_password.get_text() + config['ssl'] = True + config['imap'] = True + config['folders'] = [] + if self._folders_received: + config['folders'] = self._get_selected_folders() + config['idle'] = (len(config['folders']) < 2) if acctype < len(PROVIDER_CONFIGS): p = PROVIDER_CONFIGS[acctype] - acc.name += (' (%s)' % p[0]) - acc.server = p[1] - acc.port = p[2] + name += (' (%s)' % p[0]) + config['server'] = p[1] + config['port'] = p[2] else: raise Exception('Unknown account type') - - + acc.set_config( + mailbox_type=mailbox_type, + name=name, + enabled=acc.enabled, + config=config) + + def _get_selected_folders(self): folders = [] for row in self._liststore_folders: @@ -211,25 +225,26 @@ class AccountDialog: self._cmb_account_type.append_text(_("Other (POP3)")) self._cmb_account_type.append_text(_("MBox")) self._cmb_account_type.append_text(_("Maildir")) - + + config = self._acc.get_config() + # select account type - if self._acc.mailbox_type == 'imap' and len(self._acc.server) == 0: + if self._acc.mailbox_type == '': # default to Gmail when creating new accounts - self._cmb_account_type.set_active(IDX_GMAIL) # triggers _on_cmb_account_type_changed() + idx = IDX_GMAIL else: - i = 0 idx = -1 - for p in PROVIDER_CONFIGS: - if (('%s (%s)' % (self._acc.user, p[0])) == self._acc.name) and \ - p[1] == self._acc.server and \ - p[2] == self._acc.port: - idx = i - break - i+=1 - - if idx >= 0: - self._cmb_account_type.set_active(idx) # triggers _on_cmb_account_type_changed() - else: + if 'user' in config and 'server' in config and 'port' in config: + user = config['user'] + server = config['server'] + port = config['port'] + for i, p in enumerate(PROVIDER_CONFIGS): + if (('%s (%s)' % (user, p[0])) == self._acc.name) and \ + p[1] == server and p[2] == port: + idx = i + break + + if idx < 0: if self._acc.mailbox_type == 'imap': idx = IDX_IMAP elif self._acc.mailbox_type == 'pop3': @@ -241,10 +256,13 @@ class AccountDialog: else: # This is actually error case, but recovering to IMAP idx = IDX_IMAP - self._cmb_account_type.set_active(idx) # triggers _on_cmb_account_type_changed() - - # Don't allow changing the account type if the loaded account has folders. - self._cmb_account_type.set_sensitive(len(self._acc.folders) == 0) + self._cmb_account_type.set_active(idx) # triggers _on_cmb_account_type_changed() + # Don't allow changing the account type if the loaded account has folders. + if 'folders' in config: + is_type_change_allowed = len(config['folders']) == 0 + else: + is_type_change_allowed = True + self._cmb_account_type.set_sensitive(is_type_change_allowed) def _on_btn_cancel_clicked(self, widget): @@ -270,7 +288,7 @@ class AccountDialog: (self._chooser_account_file_path.get_filename() is not None) elif acctype == IDX_MAILDIR: ok = len(self._entry_account_name.get_text()) > 0 and \ - (self._chooser_account_directory_path.get_current_folder() is not None) + (self._chooser_account_directory_path.get_filename() is not None) else: # known provider ok = len(self._entry_account_user.get_text()) > 0 and \ len(self._entry_account_password.get_text()) > 0 From 3b960339e550417146b639ad5fa959ee77aa1ed3 Mon Sep 17 00:00:00 2001 From: Timo Kankare Date: Fri, 4 Nov 2016 19:15:49 +0200 Subject: [PATCH 5/6] Accidentally added packing property removed. --- data/account_dialog.ui | 3 --- 1 file changed, 3 deletions(-) diff --git a/data/account_dialog.ui b/data/account_dialog.ui index 5958696..e92adb5 100644 --- a/data/account_dialog.ui +++ b/data/account_dialog.ui @@ -281,9 +281,6 @@ - - -1 - From e49d4d992723386fe882554a30682197a1bf15db Mon Sep 17 00:00:00 2001 From: Timo Kankare Date: Fri, 4 Nov 2016 19:28:22 +0200 Subject: [PATCH 6/6] Closing backend in set_config if it is open. --- Mailnag/common/accounts.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Mailnag/common/accounts.py b/Mailnag/common/accounts.py index 28f2289..ce4a11f 100644 --- a/Mailnag/common/accounts.py +++ b/Mailnag/common/accounts.py @@ -48,6 +48,7 @@ CREDENTIAL_KEY = 'Mailnag password for %s://%s@%s' # class Account: def __init__(self, mailbox_type=None, enabled = False, name = '', **kw): + self._backend = None self.set_config( mailbox_type=mailbox_type, name=name, @@ -75,6 +76,8 @@ class Account: self.idle = config.get('idle', False) self.folders = config.get('folders', []) self._rest_of_config = config + if self._backend and self._backend.is_open(): + self._backend.close() self._backend = None