first commit
This commit is contained in:
commit
25001f3211
34
README.md
Normal file
34
README.md
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
kopano-cleanup
|
||||||
|
==============
|
||||||
|
|
||||||
|
The following scripts allow you to automatically delete or archive all items older than x days in a users **Junk E-mail** and **Deleted Items** folder.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
```python
|
||||||
|
-f NAME, --folder=NAME Specify folder
|
||||||
|
--user=USER Run script for user
|
||||||
|
--wastebasket Run cleanup script for the wastebasket
|
||||||
|
folder
|
||||||
|
--archive=ARCHIVE instead of removing items archive them
|
||||||
|
into this folder
|
||||||
|
--junk Run cleanup script for the junk folder
|
||||||
|
--force Force items without date to be removed
|
||||||
|
--days=DAYS Delete older then x days
|
||||||
|
--verbose Verbose mode
|
||||||
|
--dry-run Run script in dry mode
|
||||||
|
--progressbar Show progressbar
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
delete
|
||||||
|
```python
|
||||||
|
python cleanup.py --user username --junk --wastebasket --days days
|
||||||
|
```
|
||||||
|
|
||||||
|
archive
|
||||||
|
```python
|
||||||
|
python cleanup.py --user username --junk --wastebasket --days days --archive foldername
|
||||||
|
|
||||||
|
```
|
||||||
|
|
126
kopano-cleanup.py
Executable file
126
kopano-cleanup.py
Executable file
@ -0,0 +1,126 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
from datetime import timedelta
|
||||||
|
import sys
|
||||||
|
import kopano
|
||||||
|
from MAPI.Util import *
|
||||||
|
|
||||||
|
if sys.hexversion >= 0x03000000:
|
||||||
|
def _encode(s):
|
||||||
|
return s
|
||||||
|
else: # pragma: no cover
|
||||||
|
def _encode(s):
|
||||||
|
return s.encode(sys.stdout.encoding or 'utf8')
|
||||||
|
|
||||||
|
def opt_args():
|
||||||
|
parser = kopano.parser('skpcfmUP')
|
||||||
|
parser.add_option("--user", dest="user", action="store", help="Run script for user")
|
||||||
|
parser.add_option("--wastebasket", dest="wastebasket", action="store_true",
|
||||||
|
help="Run cleanup script for the wastebasket folder")
|
||||||
|
parser.add_option("--archive", dest="archive", action="store", help="instead of removing items archive them into this folder")
|
||||||
|
parser.add_option("--junk", dest="junk", action="store_true", help="Run cleanup script for the junk folder")
|
||||||
|
parser.add_option("--force", dest="force", action="store_true", help="Force items without date to be removed")
|
||||||
|
parser.add_option("--days", dest="days", action="store", help="Delete older then x days")
|
||||||
|
parser.add_option("--verbose", dest="verbose", action="store_true", help="Verbose mode")
|
||||||
|
parser.add_option("--dry-run", dest="dryrun", action="store_true", help="Run script in dry mode")
|
||||||
|
parser.add_option("--progressbar", dest="progressbar", action="store_true", help="Show progressbar ")
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
def progressbar(folder, daysbeforedeleted):
|
||||||
|
try:
|
||||||
|
from progressbar import Bar, AdaptiveETA, Percentage, ProgressBar
|
||||||
|
except ImportError:
|
||||||
|
print('''Please download the progressbar library from https://github.com/niltonvolpato/python-progressbar or
|
||||||
|
run without the --progressbar parameter''')
|
||||||
|
sys.exit(1)
|
||||||
|
widgets = [Percentage(),
|
||||||
|
' ', Bar(),
|
||||||
|
' ', AdaptiveETA()]
|
||||||
|
progressmax = 0
|
||||||
|
for item in folder.items():
|
||||||
|
if item.received <= daysbeforedeleted:
|
||||||
|
progressmax += 1
|
||||||
|
pbar = ProgressBar(widgets=widgets, maxval=progressmax)
|
||||||
|
pbar.start()
|
||||||
|
|
||||||
|
return pbar
|
||||||
|
|
||||||
|
|
||||||
|
def deleteitems(options, user, folder):
|
||||||
|
itemcount = 0
|
||||||
|
daysbeforedeleted = datetime.datetime.now() - timedelta(days=int(options.days))
|
||||||
|
pbar = None
|
||||||
|
if options.progressbar:
|
||||||
|
pbar = progressbar(folder, daysbeforedeleted)
|
||||||
|
|
||||||
|
if options.archive:
|
||||||
|
archive_folder = user.store.folder(options.archive, create=True)
|
||||||
|
|
||||||
|
for item in folder.items():
|
||||||
|
date = None
|
||||||
|
if not item.prop(PR_LAST_MODIFICATION_TIME).value and options.force:
|
||||||
|
date = daysbeforedeleted
|
||||||
|
elif item.prop(PR_LAST_MODIFICATION_TIME).value:
|
||||||
|
date = item.prop(PR_LAST_MODIFICATION_TIME).value
|
||||||
|
if date:
|
||||||
|
if date <= daysbeforedeleted:
|
||||||
|
if options.verbose:
|
||||||
|
if options.archive:
|
||||||
|
print('Archiving \'{}\''.format(_encode(item.subject)))
|
||||||
|
else:
|
||||||
|
print('Deleting \'{}\''.format(_encode(item.subject)))
|
||||||
|
|
||||||
|
if not options.dryrun:
|
||||||
|
if options.archive:
|
||||||
|
folder.move(item, archive_folder)
|
||||||
|
else:
|
||||||
|
folder.delete(item)
|
||||||
|
if pbar:
|
||||||
|
pbar.update(itemcount + 1)
|
||||||
|
itemcount += 1
|
||||||
|
|
||||||
|
if options.progressbar:
|
||||||
|
pbar.finish()
|
||||||
|
if options.archive:
|
||||||
|
print('Archived {} item(s) for user \'{}\' in folder \'{}\' to folder \'{}\''.format(itemcount, _encode(user.name),
|
||||||
|
_encode(folder.name),
|
||||||
|
_encode(archive_folder.name)))
|
||||||
|
else:
|
||||||
|
print('Deleted {} item(s) for user \'{}\' in folder \'{}\''.format(itemcount, _encode(user.name), _encode(folder.name)))
|
||||||
|
|
||||||
|
return itemcount
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
options, args = opt_args()
|
||||||
|
if not options.user or not options.days:
|
||||||
|
print('Please use:\n {} --user <username> --days <days> ',format(sys.argv[0]))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
user = kopano.server(options).user(options.user)
|
||||||
|
print('Running script for \'{}\''.format(_encode(user.name)))
|
||||||
|
|
||||||
|
if options.wastebasket:
|
||||||
|
folder = user.store.wastebasket
|
||||||
|
deleteitems(options, user, folder)
|
||||||
|
|
||||||
|
if options.junk:
|
||||||
|
folder = user.store.junk
|
||||||
|
deleteitems(options, user, folder)
|
||||||
|
|
||||||
|
'''
|
||||||
|
Loop over all the folders that are passed with the -f parameter
|
||||||
|
'''
|
||||||
|
if options.folders:
|
||||||
|
for folder in user.store.folders(options.folders):
|
||||||
|
deleteitems(options, user, folder)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in New Issue
Block a user