|
15 | 15 | # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, |
16 | 16 | # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
17 | 17 | # |
| 18 | +# vim: ts=4 sw=4 expandtab |
| 19 | +# |
18 | 20 |
|
19 | 21 | """An e-mail gateway for Roundup. |
20 | 22 |
|
@@ -72,7 +74,7 @@ class node. Any parts of other types are each stored in separate files |
72 | 74 | an exception, the original message is bounced back to the sender with the |
73 | 75 | explanatory message given in the exception. |
74 | 76 |
|
75 | | -$Id: mailgw.py,v 1.146 2004-03-26 00:44:11 richard Exp $ |
| 77 | +$Id: mailgw.py,v 1.147 2004-04-13 04:11:06 richard Exp $ |
76 | 78 | """ |
77 | 79 | __docformat__ = 'restructuredtext' |
78 | 80 |
|
@@ -366,6 +368,79 @@ def do_mailbox(self, filename): |
366 | 368 | fcntl.flock(f.fileno(), FCNTL.LOCK_UN) |
367 | 369 | return 0 |
368 | 370 |
|
| 371 | + def do_imap(self, server, user='', password='', mailbox='', ssl=False): |
| 372 | + ''' Do an IMAP connection |
| 373 | + ''' |
| 374 | + import getpass, imaplib, socket |
| 375 | + try: |
| 376 | + if not user: |
| 377 | + user = raw_input('User: ') |
| 378 | + if not password: |
| 379 | + password = getpass.getpass() |
| 380 | + except (KeyboardInterrupt, EOFError): |
| 381 | + # Ctrl C or D maybe also Ctrl Z under Windows. |
| 382 | + print "\nAborted by user." |
| 383 | + return 1 |
| 384 | + # open a connection to the server and retrieve all messages |
| 385 | + try: |
| 386 | + if ssl: |
| 387 | + print 'Trying server "%s" with ssl' % server |
| 388 | + server = imaplib.IMAP4_SSL(server) |
| 389 | + else: |
| 390 | + print 'Trying server %s without ssl' % server |
| 391 | + server = imaplib.IMAP4(server) |
| 392 | + except imaplib.IMAP4.error, e: |
| 393 | + print 'IMAP server error:', e |
| 394 | + return 1 |
| 395 | + except socket.error, e: |
| 396 | + print 'SOCKET error:', e |
| 397 | + return 1 |
| 398 | + except socket.sslerror, e: |
| 399 | + print 'SOCKET ssl error:', e |
| 400 | + return 1 |
| 401 | + |
| 402 | + try: |
| 403 | + server.login(user, password) |
| 404 | + except imaplib.IMAP4.error, e: |
| 405 | + print 'Login failure:', e |
| 406 | + return 1 |
| 407 | + |
| 408 | + try: |
| 409 | + if not mailbox: |
| 410 | + #print 'Using INBOX' |
| 411 | + (typ, data) = server.select() |
| 412 | + else: |
| 413 | + #print 'Using mailbox' , mailbox |
| 414 | + (typ, data) = server.select(mailbox=mailbox) |
| 415 | + if typ != 'OK': |
| 416 | + print 'Failed to get mailbox "%s": %s' % (mailbox, data) |
| 417 | + return 1 |
| 418 | + try: |
| 419 | + numMessages = int(data[0]) |
| 420 | + #print 'Found %s messages' % numMessages |
| 421 | + except ValueError: |
| 422 | + print 'Invalid return value from mailbox' |
| 423 | + return 1 |
| 424 | + for i in range(1, numMessages+1): |
| 425 | + #print 'Processing message ', i |
| 426 | + (typ, data) = server.fetch(str(i), '(RFC822)') |
| 427 | + #This marks the message as deleted. |
| 428 | + server.store(str(i), '+FLAGS', r'(\Deleted)') |
| 429 | + #This is the raw text of the message |
| 430 | + s = cStringIO.StringIO(data[0][1]) |
| 431 | + s.seek(0) |
| 432 | + self.handle_Message(Message(s)) |
| 433 | + server.close() |
| 434 | + finally: |
| 435 | + try: |
| 436 | + server.expunge() |
| 437 | + except: |
| 438 | + pass |
| 439 | + server.logout() |
| 440 | + |
| 441 | + return 0 |
| 442 | + |
| 443 | + |
369 | 444 | def do_apop(self, server, user='', password=''): |
370 | 445 | ''' Do authentication POP |
371 | 446 | ''' |
|
0 commit comments