From 962b7adc6c5899d15a1bc61920ca61b9c46a6357 Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Sat, 1 Jan 2022 15:27:59 -0800 Subject: [PATCH 1/2] Add --exclude-folders option to skip specified folders Based on code in #36 by @C-Duv --- imapbackup38.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/imapbackup38.py b/imapbackup38.py index bb594f4..92ef6bf 100644 --- a/imapbackup38.py +++ b/imapbackup38.py @@ -398,9 +398,10 @@ def print_usage(): print (" -d DIR --mbox-dir=DIR Write mbox files to directory. (defaults to cwd)") print (" -a --append-to-mboxes Append new messages to mbox files. (default)") print (" -y --yes-overwrite-mboxes Overwite existing mbox files instead of appending.") - print (" -f FOLDERS --folders=FOLDERS Specifify which folders use. Comma separated list.") + print (" -f FOLDERS --folders=FOLDERS Specify which folders to include. Overrides --exclude-folders. Comma separated list.") + print (" --exclude-folders=FOLDERS Specify which folders to exclude. Overridden by --folders. Comma separated list.") print (" -e --ssl Use SSL. Port defaults to 993.") - print (" -k KEY --key=KEY PEM private key file for SSL. Specify cert, too.") + print (" -k KEY --key=KEY PEM private key file for SSL. Specify cert, too.") print (" -c CERT --cert=CERT PEM certificate chain for SSL. Specify key, too.") print (" Python's SSL module doesn't check the cert chain.") print (" -s HOST --server=HOST Address of server, port optional, eg. mail.com:143") @@ -421,7 +422,7 @@ def process_cline(): short_args = "aynekt:c:s:u:p:f:d:" long_args = ["append-to-mboxes", "yes-overwrite-mboxes", "ssl", "timeout", "keyfile=", "certfile=", "server=", "user=", "pass=", - "folders=", "thunderbird", "nospinner", "mbox-dir="] + "folders=", "exclude-folders=", "thunderbird", "nospinner", "mbox-dir="] opts, extraargs = getopt.getopt(sys.argv[1:], short_args, long_args) except getopt.GetoptError: print_usage() @@ -451,6 +452,8 @@ def process_cline(): config['keyfilename'] = value elif option in ("-f", "--folders"): config['folders'] = value + elif option in ("--exclude-folders"): + config['exclude-folders'] = value elif option in ("-c", "--certfile"): config['certfilename'] = value elif option in ("-s", "--server"): @@ -643,13 +646,17 @@ def main(): config = get_config() server = connect_and_login(config) names = get_names(server,config['thunderbird'],config['nospinner']) + exclude_folders = [] if config.get('folders'): + # Takes precedence over --exclude-folders dirs = list(map(lambda x: x.strip(), config.get('folders').split(','))) if config['thunderbird']: dirs = [i.replace("Inbox", "INBOX", 1) if i.startswith("Inbox") else i for i in dirs] names = list(filter(lambda x: x[0] in dirs, names)) - + elif config.get('exclude-folders'): + # Use --exclude-folders option only when --folders is not set + exclude_folders = list(map(lambda x: x.strip(), config.get('exclude-folders').split(','))) basedir = config.get('basedir') if basedir.startswith('~'): @@ -666,6 +673,11 @@ def main(): for name_pair in names: try: foldername, filename = name_pair + # Skip excluded folders + if foldername in exclude_folders: + print(f'Excluding folder "{foldername}"') + continue + fol_messages = scan_folder( server, foldername, config['nospinner']) fil_messages = scan_file(filename, config['overwrite'], config['nospinner'], basedir) From c7a53d6a3b3c1a0df8f900b568c545e806e3d420 Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Sun, 2 Jan 2022 13:45:25 -0800 Subject: [PATCH 2/2] Don't silently ignore --exclude-folders when --folders is used too --- imapbackup38.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/imapbackup38.py b/imapbackup38.py index 92ef6bf..c792529 100644 --- a/imapbackup38.py +++ b/imapbackup38.py @@ -398,8 +398,9 @@ def print_usage(): print (" -d DIR --mbox-dir=DIR Write mbox files to directory. (defaults to cwd)") print (" -a --append-to-mboxes Append new messages to mbox files. (default)") print (" -y --yes-overwrite-mboxes Overwite existing mbox files instead of appending.") - print (" -f FOLDERS --folders=FOLDERS Specify which folders to include. Overrides --exclude-folders. Comma separated list.") - print (" --exclude-folders=FOLDERS Specify which folders to exclude. Overridden by --folders. Comma separated list.") + print (" -f FOLDERS --folders=FOLDERS Specify which folders to include. Comma separated list.") + print (" --exclude-folders=FOLDERS Specify which folders to exclude. Comma separated list.") + print (" You cannot use both --folders and --exclude-folders.") print (" -e --ssl Use SSL. Port defaults to 993.") print (" -k KEY --key=KEY PEM private key file for SSL. Specify cert, too.") print (" -c CERT --cert=CERT PEM certificate chain for SSL. Specify key, too.") @@ -644,18 +645,19 @@ def main(): """Main entry point""" try: config = get_config() + if config.get('folders') and config.get('exclude-folders'): + print("ERROR: You cannot use both --folders and --exclude-folders at the same time") + sys.exit(2) server = connect_and_login(config) names = get_names(server,config['thunderbird'],config['nospinner']) exclude_folders = [] if config.get('folders'): - # Takes precedence over --exclude-folders dirs = list(map(lambda x: x.strip(), config.get('folders').split(','))) if config['thunderbird']: dirs = [i.replace("Inbox", "INBOX", 1) if i.startswith("Inbox") else i for i in dirs] names = list(filter(lambda x: x[0] in dirs, names)) elif config.get('exclude-folders'): - # Use --exclude-folders option only when --folders is not set exclude_folders = list(map(lambda x: x.strip(), config.get('exclude-folders').split(','))) basedir = config.get('basedir')