Converted to unit sockets and cyrus server log in
[imap-restore-mail] / restore_mail_inject.py
CommitLineData
67e2ec02
PD
1'''
2restore-mail-inject.py - Tool to inject mails via IMAP
3
4Copyright (c) 2012 Intra2net AG
e42bd6a5
PD
5
6This 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
67e2ec02
PD
10'''
11
12import argparse
13from mail_iterator import MailIterator
14from file_iterator import FileIterator
15
16def 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:
7aad8dab 26 session = MailIterator(args.user)
67e2ec02 27 #session = MailIterator("/var/imap/socket/imap", "cyrus", "geheim")
e42bd6a5 28 storage = FileIterator()
7aad8dab
PD
29 except UserWarning as ex:
30 print(ex)
67e2ec02
PD
31 return
32
e42bd6a5
PD
33 # retrieve mailbox list from the mailbox list file
34 mailbox_list = storage.load_mailbox_list(args.mboxlistfile)
35
67e2ec02 36 # delete olf IMAP folders if no append requested
e42bd6a5 37 if not args.append:
67e2ec02 38 session.delete_mailboxes(args.folder)
e42bd6a5 39 if args.folder == "INBOX":
67e2ec02
PD
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:
e42bd6a5
PD
45
46 # mailboxes marked for creating and acl update
47 # add acls after all subfolders or their acls will be derived from parent folder
b0169e56 48 #print(storage.created_mailboxes, storage.acl_mailboxes)
67e2ec02
PD
49 for new_mailbox in storage.created_mailboxes:
50 session.create_mailbox(new_mailbox)
51 for acl_mailbox in storage.acl_mailboxes:
e42bd6a5
PD
52 session.add_acls(acl_mailbox, mailbox_list, args.ouser, args.user)
53 storage.created_mailboxes = []
54 storage.acl_mailboxes = []
55
67e2ec02 56 session.inject_message(message, mailbox, date_modified)
e42bd6a5
PD
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.")
67e2ec02
PD
65 return
66
67def 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')
e42bd6a5 77 parser.add_argument('-m', '--mboxlistfile', dest='mboxlistfile', action='store',
67e2ec02
PD
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
e42bd6a5 93if __name__ == "__main__":
67e2ec02 94 main()