annotate scripts/imapServer.py @ 8566:e4191aa7b402 default tip

doc: issue2551415 correct doc for change input->input_payload in 2.5 the rest interface changed a variable name from input to input_payload. An earlier commit changed the rest docs. This commit adds an item for it to the upgrading 2.4.0->2.5.0 section. Also cross reference added to the rest docs with the updated examples.
author John Rouillard <rouilj@ieee.org>
date Thu, 09 Apr 2026 00:19:06 -0400
parents 9c3ec0a5c7fc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
1 #!/usr/bin/env python3
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 """\
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 This script is a wrapper around the mailgw.py script that exists in roundup.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 It runs as service instead of running as a one-time shot.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 It also connects to a secure IMAP server. The main reasons for this script are:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
7 1) The roundup-mailgw script isn't designed to run as a server. It
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
8 expects that you either run it by hand, and enter the password each
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
9 time, or you supply the password on the command line. I prefer to
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
10 run a server that I initialize with the password, and then it just
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
11 runs. I don't want to have to pass it on the command line, so
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
12 running through crontab isn't a possibility. (This wouldn't be a
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
13 problem on a local machine running through a mailspool.)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
14 2) mailgw.py somehow screws up SSL support so IMAP4_SSL doesn't work. So
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
15 hopefully running that work outside of the mailgw will allow it to work.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
16 3) I wanted to be able to check multiple projects at the same time.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
17 roundup-mailgw is only for 1 mailbox and 1 project.
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 *TODO*:
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
21 For the first round, the program spawns a new roundup-mailgw for
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
22 each imap message that it finds and pipes the result in. In the
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
23 future it might be more practical to actually include the roundup
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
24 files and run the appropriate commands using python.
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 *TODO*:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 Look into supporting a logfile instead of using 2>/logfile
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 *TODO*:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 Add an option for changing the uid/gid of the running process.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 """
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
33 import getpass
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 import logging
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
35 import imaplib
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
36 import argparse
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
37 import os
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
38 import re
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
39 import time
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
40 import sys
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
41
5401
4cf48ff01e04 Python 3 preparation: replace raw_input uses.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
42 from roundup.anypy.my_input import my_input
4cf48ff01e04 Python 3 preparation: replace raw_input uses.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
43
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 logging.basicConfig()
4421
67bef70ab9b9 - more logger fixes, sorry for the noise.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3609
diff changeset
45 log = logging.getLogger('roundup.IMAPServer')
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
47 version = '0.1.3'
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 class RoundupMailbox:
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
50 """This contains all the info about each mailbox.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
51 Username, Password, server, security, roundup database
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
52 """
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
53 def __init__(self, dbhome='', username=None, password=None, mailbox=None
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
54 , server=None, protocol='imaps'):
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
55 self.username = username
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
56 self.password = password
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
57 self.mailbox = mailbox
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
58 self.server = server
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
59 self.protocol = protocol
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
60 self.dbhome = dbhome
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
61
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
62 try:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
63 if not self.dbhome:
5401
4cf48ff01e04 Python 3 preparation: replace raw_input uses.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
64 self.dbhome = my_input('Tracker home: ')
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
65 if not os.path.exists(self.dbhome):
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
66 raise ValueError('Invalid home address: ' \
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
67 'directory "%s" does not exist.' % self.dbhome)
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
69 if not self.server:
5401
4cf48ff01e04 Python 3 preparation: replace raw_input uses.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
70 self.server = my_input('Server: ')
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
71 if not self.server:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
72 raise ValueError('No Servername supplied')
5401
4cf48ff01e04 Python 3 preparation: replace raw_input uses.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
73 protocol = my_input('protocol [imaps]? ')
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
74 self.protocol = protocol
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
75
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
76 if not self.username:
5401
4cf48ff01e04 Python 3 preparation: replace raw_input uses.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
77 self.username = my_input('Username: ')
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
78 if not self.username:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
79 raise ValueError('Invalid Username')
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
81 if not self.password:
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5141
diff changeset
82 print('For server %s, user %s' % (self.server, self.username))
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
83 self.password = getpass.getpass()
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
84 # password can be empty because it could be superceeded
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
85 # by a later entry
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
87 #if self.mailbox is None:
5401
4cf48ff01e04 Python 3 preparation: replace raw_input uses.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
88 # self.mailbox = my_input('Mailbox [INBOX]: ')
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
89 # # We allow an empty mailbox because that will
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
90 # # select the INBOX, whatever it is called
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
92 except (KeyboardInterrupt, EOFError):
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
93 raise ValueError('Canceled by User')
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
94
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
95 def __str__(self):
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
96 return 'Mailbox{ server:%(server)s, protocol:%(protocol)s, ' \
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
97 'username:%(username)s, mailbox:%(mailbox)s, ' \
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
98 'dbhome:%(dbhome)s }' % self.__dict__
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
101 # [als] class name is misleading. this is imap client, not imap server
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102 class IMAPServer:
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
103
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
104 """IMAP mail gatherer.
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
106 This class runs as a server process. It is configured with a list of
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
107 mailboxes to connect to, along with the roundup database directories
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
108 that correspond with each email address. It then connects to each
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
109 mailbox at a specified interval, and if there are new messages it
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
110 reads them, and sends the result to the roundup.mailgw.
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
112 *TODO*:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
113 Try to be smart about how you access the mailboxes so that you can
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
114 connect once, and access multiple mailboxes and possibly multiple
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
115 usernames.
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
117 *NOTE*:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
118 This assumes that if you are using the same user on the same
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
119 server, you are using the same password. (the last one supplied is
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
120 used.) Empty passwords are ignored. Only the last protocol
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
121 supplied is used.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
122 """
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
124 def __init__(self, pidfile=None, delay=5, daemon=False):
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
125 #This is sorted by servername, then username, then mailboxes
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
126 self.mailboxes = {}
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
127 self.delay = float(delay)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
128 self.pidfile = pidfile
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
129 self.daemon = daemon
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
131 def setDelay(self, delay):
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
132 self.delay = delay
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
133
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
134 def addMailbox(self, mailbox):
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
135 """ The linkage is as follows:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
136 servers -- users - mailbox:dbhome
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
137 So there can be multiple servers, each with multiple users.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
138 Each username can be associated with multiple mailboxes.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
139 each mailbox is associated with 1 database home
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
140 """
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
141 log.info('Adding mailbox %s', mailbox)
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
142 if mailbox.server not in self.mailboxes:
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
143 self.mailboxes[mailbox.server] = {'protocol':'imaps', 'users':{}}
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
144 server = self.mailboxes[mailbox.server]
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
145 if mailbox.protocol:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
146 server['protocol'] = mailbox.protocol
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
148 if mailbox.username not in server['users']:
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
149 server['users'][mailbox.username] = {'password':'', 'mailboxes':{}}
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
150 user = server['users'][mailbox.username]
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
151 if mailbox.password:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
152 user['password'] = mailbox.password
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
153
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
154 if mailbox.mailbox in user['mailboxes']:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
155 raise ValueError('Mailbox is already defined')
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
157 user['mailboxes'][mailbox.mailbox] = mailbox.dbhome
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
159 def _process(self, message, dbhome):
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
160 """Actually process one of the email messages"""
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
161 child = os.popen('roundup-mailgw %s' % dbhome, 'wb')
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
162 child.write(message)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
163 child.close()
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
164 #print message
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
166 def _getMessages(self, serv, count, dbhome):
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
167 """This assumes that you currently have a mailbox open, and want to
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
168 process all messages that are inside.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
169 """
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
170 for n in range(1, count+1):
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
171 (t, data) = serv.fetch(n, '(RFC822)')
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
172 if t == 'OK':
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
173 self._process(data[0][1], dbhome)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
174 serv.store(n, '+FLAGS', r'(\Deleted)')
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
176 def checkBoxes(self):
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
177 """This actually goes out and does all the checking.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
178 Returns False if there were any errors, otherwise returns true.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
179 """
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
180 noErrors = True
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
181 for server in self.mailboxes:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
182 log.info('Connecting to server: %s', server)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
183 s_vals = self.mailboxes[server]
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
184
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
185 try:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
186 for user in s_vals['users']:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
187 u_vals = s_vals['users'][user]
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
188 # TODO: As near as I can tell, you can only
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
189 # login with 1 username for each connection to a server.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
190 protocol = s_vals['protocol'].lower()
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
191 if protocol == 'imaps':
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
192 serv = imaplib.IMAP4_SSL(server)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
193 elif protocol == 'imap':
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
194 serv = imaplib.IMAP4(server)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
195 else:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
196 raise ValueError('Unknown protocol %s' % protocol)
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
197
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
198 password = u_vals['password']
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
200 try:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
201 log.info('Connecting as user: %s', user)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
202 serv.login(user, password)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
204 for mbox in u_vals['mailboxes']:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
205 dbhome = u_vals['mailboxes'][mbox]
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
206 log.info('Using mailbox: %s, home: %s',
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
207 mbox, dbhome)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
208 #access a specific mailbox
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
209 if mbox:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
210 (t, data) = serv.select(mbox)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
211 else:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
212 # Select the default mailbox (INBOX)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
213 (t, data) = serv.select()
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
214 try:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
215 nMessages = int(data[0])
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
216 except ValueError:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
217 nMessages = 0
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
219 log.info('Found %s messages', nMessages)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
220
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
221 if nMessages:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
222 self._getMessages(serv, nMessages, dbhome)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
223 serv.expunge()
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
225 # We are done with this mailbox
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
226 serv.close()
8528
fed0f839c260 fix: replace except: with except Exception: (by haosenwang1018@github)
John Rouillard <rouilj@ieee.org>
parents: 7053
diff changeset
227 except Exception:
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
228 log.exception('Exception with server %s user %s',
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
229 server, user)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
230 noErrors = False
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
231
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
232 serv.logout()
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
233 serv.shutdown()
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
234 del serv
8528
fed0f839c260 fix: replace except: with except Exception: (by haosenwang1018@github)
John Rouillard <rouilj@ieee.org>
parents: 7053
diff changeset
235 except Exception:
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
236 log.exception('Exception while connecting to %s', server)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
237 noErrors = False
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
238 return noErrors
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
239
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
241 def makeDaemon(self):
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
242 """Turn this process into a daemon.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
243
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
244 - make our parent PID 1
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
245
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
246 Write our new PID to the pidfile.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
247
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
248 From A.M. Kuuchling (possibly originally Greg Ward) with
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
249 modification from Oren Tirosh, and finally a small mod from me.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
250 Originally taken from roundup.scripts.roundup_server.py
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
251 """
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
252 log.info('Running as Daemon')
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
253 # Fork once
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
254 if os.fork() != 0:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
255 os._exit(0)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
256
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
257 # Create new session
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
258 os.setsid()
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
260 # Second fork to force PPID=1
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
261 pid = os.fork()
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
262 if pid:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
263 if self.pidfile:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
264 pidfile = open(self.pidfile, 'w')
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
265 pidfile.write(str(pid))
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
266 pidfile.close()
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
267 os._exit(0)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
268
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
269 def run(self):
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
270 """Run email gathering daemon.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
271
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
272 This spawns itself as a daemon, and then runs continually, just
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
273 sleeping inbetween checks. It is recommended that you run
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
274 checkBoxes once first before you select run. That way you can
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
275 know if there were any failures.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
276 """
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
277 if self.daemon:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
278 self.makeDaemon()
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
279 while True:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
280
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
281 time.sleep(self.delay * 60.0)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
282 log.info('Time: %s', time.strftime('%Y-%m-%d %H:%M:%S'))
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
283 self.checkBoxes()
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
284
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
285 def getItems(s):
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
286 """Parse a string looking for userame@server"""
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
287 myRE = re.compile(
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
288 r'((?P<protocol>[^:]+)://)?'#You can supply a protocol if you like
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
289 r'(' #The username part is optional
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
290 r'(?P<username>[^:]+)' #You can supply the password as
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
291 r'(:(?P<password>.+))?' #username:password@server
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
292 r'@)?'
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
293 r'(?P<server>[^/]+)'
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
294 r'(/(?P<mailbox>.+))?$'
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
295 )
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
296 m = myRE.match(s)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
297 if m:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
298 return m.groupdict()
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
299 else:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
300 return None
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
301
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
302 def main():
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
303 """This is what is called if run at the prompt"""
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
304 parser = argparse.ArgumentParser(
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
305 formatter_class=argparse.RawDescriptionHelpFormatter,
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
306 epilog="""
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
307
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
308 The server takes pairs of home/server.
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
309 So each entry has a home, and then the server configuration. Home is just
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
310 a path to the roundup issue tracker. The server is something of the form:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
311
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
312 imaps://user:password@server/mailbox
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
313
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
314 If you don't supply the protocol, imaps is assumed. Without user or
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
315 password, you will be prompted for them. The server must be supplied.
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
316 Without mailbox the INBOX is used.
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
317
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
318 Examples:
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
319 %(prog)s /home/roundup/trackers/test imaps://test@imap.example.com/test
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
320 %(prog)s /home/roundup/trackers/test imap.example.com \\
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
321 /home/roundup/trackers/test2 imap.example.com/test2
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
322 """ % dict(prog = sys.argv [0])
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
323 )
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
324 parser.add_argument('args', nargs='*')
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
325 parser.add_argument('-d', '--delay', dest='delay', type=float,
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
326 metavar='<sec>', default=5,
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
327 help="Set the delay between checks in minutes. (default 5)"
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
328 )
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
329 parser.add_argument('-p', '--pid-file', dest='pidfile',
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
330 metavar='<file>', default=None,
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
331 help="The pid of the server process will be written to <file>"
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
332 )
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
333 parser.add_argument('-n', '--no-daemon', dest='daemon',
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
334 action='store_false', default=True,
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
335 help="Do not fork into the background after running the first check."
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
336 )
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
337 parser.add_argument('--version', action="store_true",
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
338 help="Print version and exit")
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
339 parser.add_argument('-v', '--verbose', dest='verbose',
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
340 action='store_const', const=logging.INFO,
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
341 help="Be more verbose in letting you know what is going on."
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
342 " Enables informational messages."
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
343 )
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
344 parser.add_argument('-V', '--very-verbose', dest='verbose',
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
345 action='store_const', const=logging.DEBUG,
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
346 help="Be very verbose in letting you know what is going on."
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
347 " Enables debugging messages."
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
348 )
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
349 parser.add_argument('-q', '--quiet', dest='verbose',
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
350 action='store_const', const=logging.ERROR,
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
351 help="Be less verbose. Ignores warnings, only prints errors."
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
352 )
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
353 parser.add_argument('-Q', '--very-quiet', dest='verbose',
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
354 action='store_const', const=logging.CRITICAL,
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
355 help="Be much less verbose. Ignores warnings and errors."
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
356 " Only print CRITICAL messages."
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
357 )
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
358
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
359 args = parser.parse_args()
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
360 if args.version:
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
361 print('%s %s' % (sys.argv [0], version))
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
362 sys.exit(0)
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
363 if not len(args.args) or len(args.args) % 2 == 1:
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
364 parser.error('Invalid number of arguments. '
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
365 'Each site needs a home and a server.')
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
366
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
367 if args.verbose == None:
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
368 args.verbose = logging.WARNING
5141
939dce88cfc2 issue2550776: fix missing intialization
John Rouillard <rouilj@ieee.org>
parents: 4421
diff changeset
369
7053
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
370 log.setLevel(args.verbose)
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
371 myServer = IMAPServer(delay=args.delay, pidfile=args.pidfile,
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
372 daemon=args.daemon)
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
373 for i in range(0,len(args.args),2):
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
374 home = args.args[i]
b5fffd2a64af issue2551195: port scripts to argparse
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5401
diff changeset
375 server = args.args[i+1]
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
376 if not os.path.exists(home):
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
377 parser.error('Home: "%s" does not exist' % home)
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
378
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
379 info = getItems(server)
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
380 if not info:
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
381 parser.error('Invalid server string: "%s"' % server)
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
382
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
383 myServer.addMailbox(
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
384 RoundupMailbox(dbhome=home, mailbox=info['mailbox']
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
385 , username=info['username'], password=info['password']
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
386 , server=info['server'], protocol=info['protocol']
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
387 )
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
388 )
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
389
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
390 if myServer.checkBoxes():
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
391 myServer.run()
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
392
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
393 if __name__ == '__main__':
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
394 main()
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
395
3203
eddcfee2cc19 reformat
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3176
diff changeset
396 # vim: et ft=python si sts=4 sw=4

Roundup Issue Tracker: http://roundup-tracker.org/