src.mailbox_cli.main()   B
last analyzed

Complexity

Conditions 8

Size

Total Lines 41
Code Lines 35

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 35
nop 0
dl 0
loc 41
rs 7.1733
c 0
b 0
f 0
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
4
"""
5
Module to download and to detach/strip/remove attachments
6
from e-mails on IMAP servers.
7
"""
8
9
from __future__ import print_function
10
11
import argparse
12
import logging
13
import os
14
import time
15
16
17
from src.mailbox_imap import MailboxCleanerIMAP
18
19
20
__author__ = "Alexander Willner"
21
__copyright__ = "Copyright 2020, Alexander Willner"
22
__credits__ = ["github.com/guido4000",
23
               "github.com/halteproblem", "github.com/jamesridgway"]
24
__license__ = "MIT"
25
__version__ = "1.0.4"
26
__maintainer__ = "Alexander Willner"
27
__email__ = "[email protected]"
28
__status__ = "Development"
29
30
RETRIES: int = 10
31
32
33
def handle_arguments() -> argparse.ArgumentParser:
34
    """Provide CLI handler for application."""
35
36
    parser = argparse.ArgumentParser(
37
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
38
    parser.add_argument("-a", "--all",
39
                        help="iterate over all folders",
40
                        action='store_true')
41
    parser.add_argument("-d", "--detach",
42
                        help="remove attachments",
43
                        action='store_true')
44
    parser.add_argument("-k", "--skip-download",
45
                        help="don't download attachments",
46
                        action='store_true')
47
    parser.add_argument("-c", "--reset-cache",
48
                        help="reset cache",
49
                        action='store_true')
50
    parser.add_argument("-r", "--read-only",
51
                        help="read-only mode for the imap server",
52
                        action='store_true')
53
    parser.add_argument("-m", "--min-size",
54
                        help="min attachment size in KB",
55
                        default=2000, type=int)
56
    parser.add_argument("-f", "--folder",
57
                        help="imap folder to process", default="Inbox")
58
    parser.add_argument("-l", "--upload",
59
                        help="local folder with messages to upload")
60
    parser.add_argument("-t", "--target",
61
                        help="download attachments to this local folder",
62
                        default="attachments")
63
    parser.add_argument("-s", "--server", help="imap server", required=True)
64
    parser.add_argument("-u", "--user", help="imap user", required=True)
65
    parser.add_argument("-o", "--port", help="imap port", required=False,
66
                        type=int)
67
    parser.add_argument("-p", "--password", help="imap user", required=True)
68
    parser.add_argument(
69
        "-v",
70
        "--verbose",
71
        action="count",
72
        default=0,
73
        dest="verbosity",
74
        help="be more verbose (-v, -vv)")
75
    parser.add_argument(
76
        "--version",
77
        action="version",
78
        version="%(prog)s (version {version})".format(version=__version__))
79
80
    args = parser.parse_args()
81
82
    logging.basicConfig(
83
        level=logging.WARNING - args.verbosity * 10,
84
        format="%(message)s")
85
86
    return args
87
88
89
def main():
90
    """Setup and run remover."""
91
92
    args = handle_arguments()
93
    args.target = os.path.expanduser(
94
        args.target) if args.target is not None else None
95
    args.upload = os.path.expanduser(
96
        args.upload) if args.upload is not None else None
97
    imap = MailboxCleanerIMAP(args)
98
99
    for _ in range(RETRIES):
100
        while True:
101
            try:
102
                imap.login()
103
                logging.warning('Server\t\t: %s@%s', args.user, args.server)
104
                logging.warning('Read Only\t: %s', args.read_only)
105
                logging.warning('Detach\t\t: %s', args.detach)
106
                logging.warning('Cache Enabled\t: %s', not args.reset_cache)
107
                logging.warning('Download\t: %s', not args.skip_download)
108
                logging.warning('Min Size\t: %s KB', args.min_size)
109
                logging.warning('Target\t\t: %s', args.target)
110
                logging.warning('Upload\t\t: %s', args.upload)
111
                logging.warning('All Folders\t: %s', args.all)
112
                logging.warning('Cache\t\t: %s', imap.cache_file)
113
114
                if args.upload:
115
                    imap.process_directory()
116
                else:
117
                    imap.process_folders()
118
            except (TimeoutError, ConnectionResetError, BrokenPipeError)\
119
                    as error:
120
                print("Retrying after error: ", error)
121
                time.sleep(30)
122
                continue
123
            except KeyboardInterrupt as error:
124
                raise SystemExit('\nCancelling...') from error
125
            finally:
126
                imap.cleanup()
127
                imap.logout()
128
            print("Done.")
129
            return
130
131
132
if __name__ == '__main__':
133
    main()
134