Initial submission of working tool
[imap-restore-mail] / restore_mail_inject.py
1 '''
2 restore-mail-inject.py - Tool to inject mails via IMAP
3
4 Copyright (c) 2012 Intra2net AG
5 '''
6
7 import argparse
8 from mail_iterator import MailIterator
9 from file_iterator import FileIterator
10
11 def main():
12     """Main function."""
13
14     # prepare configuration
15     args = configure_args()
16     print("The module restore_mail_inject.py started with user %s, folder %s and source %s." %
17           (args.user, args.folder, args.srcdir))
18
19     # connect
20     try:
21         session = MailIterator("gwt-intranator.m.i2n", "mit.punkt", "mit.punkt")
22         #session = MailIterator("/var/imap/socket/imap", "cyrus", "geheim")
23         storage = FileIterator(args.mboxlist)
24     except UserWarning:
25         print("Couldn't connect to IMAP server.")
26         return
27
28     # delete olf IMAP folders if no append requested
29     if(not args.append):
30         session.delete_mailboxes(args.folder)
31         if(args.folder == "INBOX"):
32             session.clear_inbox_acls(args.user)
33
34     # inject emails
35     path_generator = storage.load_mails(args.srcdir, args.folder)
36     for message, mailbox, date_modified in path_generator:
37         for new_mailbox in storage.created_mailboxes:
38             session.create_mailbox(new_mailbox)
39         for acl_mailbox in storage.acl_mailboxes:
40             session.add_acls(acl_mailbox, args)
41         session.inject_message(message, mailbox, date_modified)
42         # add acls after all subfolders or their acls will be derived from parent folder
43
44     print("Finished injecting mails.")
45
46     return
47
48 def configure_args():
49     """Configure arguments and return them."""
50     # parse arguments
51     parser = argparse.ArgumentParser(description="Tool to inject mails via IMAP.")
52     parser.add_argument('-u', '--username', dest='user', action='store',
53                         required=True, help='user to store mails to')
54     parser.add_argument('-f', '--foldername', dest='folder', action='store',
55                         default="INBOX", help='folder to store mails to - if not specified we overwrite INBOX')
56     parser.add_argument('-s', '--sourcedir', dest='srcdir', action='store',
57                         required=True, help='folder to read mail from')
58     parser.add_argument('-m', '--mboxlist', dest='mboxlist', action='store',
59                         default="", help='mboxlist file (flat file format) to read the ACLs from')
60     parser.add_argument('-o', '--ouser', dest='ouser', action='store',
61                         default="", help='name of the original user (=username if not specified)')
62     parser.add_argument('-a', '--append', dest='append', action='store_true',
63                         default=False, help="append mails, don't delete anything")
64     args = parser.parse_args()
65
66     if (args.folder != "INBOX"):
67         args.folder = "INBOX/" + args.folder
68     if (args.ouser == ""):
69         args.ouser = args.user
70
71     return args
72
73
74 if(__name__ == "__main__"):
75     main()