Add --exclude-folders option to skip specified folders

Based on code in #36 by @C-Duv
This commit is contained in:
Sami Samhuri 2022-01-01 15:27:59 -08:00
parent 0cc27cd570
commit 962b7adc6c
No known key found for this signature in database
GPG key ID: 4B4195422742FC16

View file

@ -398,9 +398,10 @@ def print_usage():
print (" -d DIR --mbox-dir=DIR Write mbox files to directory. (defaults to cwd)") 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 (" -a --append-to-mboxes Append new messages to mbox files. (default)")
print (" -y --yes-overwrite-mboxes Overwite existing mbox files instead of appending.") 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 (" -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 (" -c CERT --cert=CERT PEM certificate chain for SSL. Specify key, too.")
print (" Python's SSL module doesn't check the cert chain.") 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") 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:" short_args = "aynekt:c:s:u:p:f:d:"
long_args = ["append-to-mboxes", "yes-overwrite-mboxes", long_args = ["append-to-mboxes", "yes-overwrite-mboxes",
"ssl", "timeout", "keyfile=", "certfile=", "server=", "user=", "pass=", "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) opts, extraargs = getopt.getopt(sys.argv[1:], short_args, long_args)
except getopt.GetoptError: except getopt.GetoptError:
print_usage() print_usage()
@ -451,6 +452,8 @@ def process_cline():
config['keyfilename'] = value config['keyfilename'] = value
elif option in ("-f", "--folders"): elif option in ("-f", "--folders"):
config['folders'] = value config['folders'] = value
elif option in ("--exclude-folders"):
config['exclude-folders'] = value
elif option in ("-c", "--certfile"): elif option in ("-c", "--certfile"):
config['certfilename'] = value config['certfilename'] = value
elif option in ("-s", "--server"): elif option in ("-s", "--server"):
@ -643,13 +646,17 @@ def main():
config = get_config() config = get_config()
server = connect_and_login(config) server = connect_and_login(config)
names = get_names(server,config['thunderbird'],config['nospinner']) names = get_names(server,config['thunderbird'],config['nospinner'])
exclude_folders = []
if config.get('folders'): if config.get('folders'):
# Takes precedence over --exclude-folders
dirs = list(map(lambda x: x.strip(), config.get('folders').split(','))) dirs = list(map(lambda x: x.strip(), config.get('folders').split(',')))
if config['thunderbird']: if config['thunderbird']:
dirs = [i.replace("Inbox", "INBOX", 1) if i.startswith("Inbox") else i dirs = [i.replace("Inbox", "INBOX", 1) if i.startswith("Inbox") else i
for i in dirs] for i in dirs]
names = list(filter(lambda x: x[0] in dirs, names)) 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') basedir = config.get('basedir')
if basedir.startswith('~'): if basedir.startswith('~'):
@ -666,6 +673,11 @@ def main():
for name_pair in names: for name_pair in names:
try: try:
foldername, filename = name_pair foldername, filename = name_pair
# Skip excluded folders
if foldername in exclude_folders:
print(f'Excluding folder "{foldername}"')
continue
fol_messages = scan_folder( fol_messages = scan_folder(
server, foldername, config['nospinner']) server, foldername, config['nospinner'])
fil_messages = scan_file(filename, config['overwrite'], config['nospinner'], basedir) fil_messages = scan_file(filename, config['overwrite'], config['nospinner'], basedir)