791e38056b908ca1d8f804957190b564f90b887a
[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 This program relies on the following assumptions:
7 - IMAP hierarchy separator is / (unixhierarysep=yes)
8 - INBOX maps to user/[username]
9 - internal encoding of . etc. as of cyrus 2.2
10 '''
11
12 import argparse
13 from mail_iterator import MailIterator
14 from file_iterator import FileIterator
15
16 def main():
17     """Main function."""
18
19     # prepare configuration
20     args = configure_args()
21     print("The module restore_mail_inject.py started with user %s, folder %s and source %s." %
22           (args.user, args.folder, args.srcdir))
23
24     # connect
25     try:
26         session = MailIterator(args.user)
27         #session = MailIterator("/var/imap/socket/imap", "cyrus", "geheim")
28         storage = FileIterator()
29     except UserWarning as ex:
30         print(ex)
31         return
32
33     # retrieve mailbox list from the mailbox list file
34     mailbox_list = storage.load_mailbox_list(args.mboxlistfile)
35
36     # delete olf IMAP folders if no append requested
37     if not args.append:
38         session.delete_mailboxes(args.folder)
39         if args.folder == "INBOX":
40             session.clear_inbox_acls(args.user)
41
42     # inject emails
43     path_generator = storage.load_mails(args.srcdir, args.folder)
44     for message, mailbox, date_modified in path_generator:
45         
46         # mailboxes marked for creating and acl update
47         # add acls after all subfolders or their acls will be derived from parent folder
48         #print(storage.created_mailboxes, storage.acl_mailboxes)
49         for new_mailbox in storage.created_mailboxes:
50             session.create_mailbox(new_mailbox)
51         for acl_mailbox in storage.acl_mailboxes:
52             session.add_acls(acl_mailbox, mailbox_list, args.ouser, args.user)
53         storage.created_mailboxes = []
54         storage.acl_mailboxes = []
55         
56         session.inject_message(message, mailbox, date_modified)
57     
58     # last iteration mailboxes in case root mailbox has no e-mails for injection
59     for new_mailbox in storage.created_mailboxes:
60         session.create_mailbox(new_mailbox)
61     for acl_mailbox in storage.acl_mailboxes:
62         session.add_acls(acl_mailbox, mailbox_list, args.ouser, args.user)
63     
64     print("Finished injecting mails. Exiting.")
65     return
66
67 def configure_args():
68     """Configure arguments and return them."""
69     # parse arguments
70     parser = argparse.ArgumentParser(description="Tool to inject mails via IMAP.")
71     parser.add_argument('-u', '--username', dest='user', action='store',
72                         required=True, help='user to store mails to')
73     parser.add_argument('-f', '--foldername', dest='folder', action='store',
74                         default="INBOX", help='folder to store mails to - if not specified we overwrite INBOX')
75     parser.add_argument('-s', '--sourcedir', dest='srcdir', action='store',
76                         required=True, help='folder to read mail from')
77     parser.add_argument('-m', '--mboxlistfile', dest='mboxlistfile', action='store',
78                         default="", help='mboxlist file (flat file format) to read the ACLs from')
79     parser.add_argument('-o', '--ouser', dest='ouser', action='store',
80                         default="", help='name of the original user (=username if not specified)')
81     parser.add_argument('-a', '--append', dest='append', action='store_true',
82                         default=False, help="append mails, don't delete anything")
83     args = parser.parse_args()
84
85     if (args.folder != "INBOX"):
86         args.folder = "INBOX/" + args.folder
87     if (args.ouser == ""):
88         args.ouser = args.user
89
90     return args
91
92
93 if __name__ == "__main__":
94     main()