Mercurial > p > roundup > code
diff roundup/scripts/roundup_mailgw.py @ 592:326388b8604a
Moved scripts from top-level dir to roundup.scripts subpackage
| author | Jürgen Hermann <jhermann@users.sourceforge.net> |
|---|---|
| date | Tue, 29 Jan 2002 19:53:08 +0000 |
| parents | |
| children | 2256f81293c1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/roundup/scripts/roundup_mailgw.py Tue Jan 29 19:53:08 2002 +0000 @@ -0,0 +1,274 @@ +#! /usr/bin/python +# +# Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/) +# This module is free software, and you may redistribute it and/or modify +# under the same terms as Python, so long as this copyright message and +# disclaimer are retained in their original form. +# +# IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR +# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING +# OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" +# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, +# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +# +# $Id: roundup_mailgw.py,v 1.1 2002-01-29 19:53:08 jhermann Exp $ + +# python version check +from roundup import version_check + +import sys, os, re, cStringIO + +from roundup.mailgw import Message +from roundup.i18n import _ + +def do_pipe(handler): + '''Read a message from standard input and pass it to the mail handler. + ''' + handler.main(sys.stdin) + return 0 + +def do_mailbox(handler, filename): + '''Read a series of messages from the specified unix mailbox file and + pass each to the mail handler. + ''' + # open the spool file and lock it + import fcntl, FCNTL + f = open(filename, 'r+') + fcntl.flock(f.fileno(), FCNTL.LOCK_EX) + + # handle and clear the mailbox + try: + from mailbox import UnixMailbox + mailbox = UnixMailbox(f, factory=Message) + # grab one message + message = mailbox.next() + while message: + # call the instance mail handler + handler.handle_Message(message) + message = mailbox.next() + # nuke the file contents + os.ftruncate(f.fileno(), 0) + except: + import traceback + traceback.print_exc() + return 1 + fcntl.flock(f.fileno(), FCNTL.LOCK_UN) + return 0 + +def do_pop(handler, server, user='', password=''): + '''Read a series of messages from the specified POP server. + ''' + import getpass, poplib, socket + try: + if not user: + user = raw_input(_('User: ')) + if not password: + password = getpass.getpass() + except (KeyboardInterrupt, EOFError): + # Ctrl C or D maybe also Ctrl Z under Windows. + print "\nAborted by user." + return 1 + + # open a connection to the server and retrieve all messages + try: + server = poplib.POP3(server) + except socket.error, message: + print "POP server error:", message + return 1 + server.user(user) + server.pass_(password) + numMessages = len(server.list()[1]) + for i in range(1, numMessages+1): + # retr: returns + # [ pop response e.g. '+OK 459 octets', + # [ array of message lines ], + # number of octets ] + lines = server.retr(i)[1] + s = cStringIO.StringIO('\n'.join(lines)) + s.seek(0) + handler.handle_Message(Message(s)) + # delete the message + server.dele(i) + + # quit the server to commit changes. + server.quit() + return 0 + +def usage(args, message=None): + if message is not None: + print message + print _('Usage: %(program)s <instance home> [source spec]')%{'program': args[0]} + print _(''' +The roundup mail gateway may be called in one of two ways: + . with an instance home as the only argument, + . with both an instance home and a mail spool file, or + . with both an instance home and a pop server account. + +PIPE: + In the first case, the mail gateway reads a single message from the + standard input and submits the message to the roundup.mailgw module. + +UNIX mailbox: + In the second case, the gateway reads all messages from the mail spool + file and submits each in turn to the roundup.mailgw module. The file is + emptied once all messages have been successfully handled. The file is + specified as: + mailbox /path/to/mailbox + +POP: + In the third case, the gateway reads all messages from the POP server + specified and submits each in turn to the roundup.mailgw module. The + server is specified as: + pop username:password@server + The username and password may be omitted: + pop username@server + pop server + are both valid. The username and/or password will be prompted for if + not supplied on the command-line. +''') + return 1 + +def main(args): + '''Handle the arguments to the program and initialise environment. + ''' + # figure the instance home + if len(args) > 1: + instance_home = args[1] + else: + instance_home = os.environ.get('ROUNDUP_INSTANCE', '') + if not instance_home: + return usage(args) + + # get the instance + import roundup.instance + instance = roundup.instance.open(instance_home) + + # get a mail handler + db = instance.open('admin') + handler = instance.MailGW(instance, db) + + # if there's no more arguments, read a single message from stdin + if len(args) == 2: + return do_pipe(handler) + + # otherwise, figure what sort of mail source to handle + if len(args) < 4: + return usage(args, _('Error: not enough source specification information')) + source, specification = args[2:] + if source == 'mailbox': + return do_mailbox(handler, specification) + elif source == 'pop': + m = re.match(r'((?P<user>[^:]+)(:(?P<pass>.+))?@)?(?P<server>.+)', + specification) + if m: + return do_pop(handler, m.group('server'), m.group('user'), + m.group('pass')) + return usage(args, _('Error: pop specification not valid')) + + return usage(args, _('Error: The source must be either "mailbox" or "pop"')) + +# call main +if __name__ == '__main__': + sys.exit(main(sys.argv)) + +# +# $Log: not supported by cvs2svn $ +# Revision 1.21 2002/01/11 07:02:29 grubert +# put an exception around: do_pop user and password entry to catch ctrl-c/d. +# +# Revision 1.20 2002/01/07 10:43:48 richard +# #500329 ] exception on server not reachable-patch +# +# Revision 1.19 2002/01/05 02:19:03 richard +# i18n'ification +# +# Revision 1.18 2001/12/13 00:20:01 richard +# . Centralised the python version check code, bumped version to 2.1.1 (really +# needs to be 2.1.2, but that isn't released yet :) +# +# Revision 1.17 2001/12/02 05:06:16 richard +# . We now use weakrefs in the Classes to keep the database reference, so +# the close() method on the database is no longer needed. +# I bumped the minimum python requirement up to 2.1 accordingly. +# . #487480 ] roundup-server +# . #487476 ] INSTALL.txt +# +# I also cleaned up the change message / post-edit stuff in the cgi client. +# There's now a clearly marked "TODO: append the change note" where I believe +# the change note should be added there. The "changes" list will obviously +# have to be modified to be a dict of the changes, or somesuch. +# +# More testing needed. +# +# Revision 1.16 2001/11/30 18:23:55 jhermann +# Cleaned up strange import (less pollution, too) +# +# Revision 1.15 2001/11/30 13:16:37 rochecompaan +# Fixed bug. Mail gateway was not using the extended Message class +# resulting in failed submissions when mails were processed from a Unix +# mailbox +# +# Revision 1.14 2001/11/13 21:44:44 richard +# . re-open the database as the author in mail handling +# +# Revision 1.13 2001/11/09 01:05:55 richard +# Fixed bug #479511 ] mailgw to pop once engelbert gruber tested the POP +# gateway. +# +# Revision 1.12 2001/11/08 05:16:55 richard +# Rolled roundup-popgw into roundup-mailgw. Cleaned mailgw up significantly, +# tested unix mailbox some more. POP still untested. +# +# Revision 1.11 2001/11/07 05:32:58 richard +# More roundup-mailgw usage help. +# +# Revision 1.10 2001/11/07 05:30:11 richard +# Nicer usage message. +# +# Revision 1.9 2001/11/07 05:29:26 richard +# Modified roundup-mailgw so it can read e-mails from a local mail spool +# file. Truncates the spool file after parsing. +# Fixed a couple of small bugs introduced in roundup.mailgw when I started +# the popgw. +# +# Revision 1.8 2001/11/01 22:04:37 richard +# Started work on supporting a pop3-fetching server +# Fixed bugs: +# . bug #477104 ] HTML tag error in roundup-server +# . bug #477107 ] HTTP header problem +# +# Revision 1.7 2001/08/07 00:24:42 richard +# stupid typo +# +# Revision 1.6 2001/08/07 00:15:51 richard +# Added the copyright/license notice to (nearly) all files at request of +# Bizar Software. +# +# Revision 1.5 2001/08/05 07:44:25 richard +# Instances are now opened by a special function that generates a unique +# module name for the instances on import time. +# +# Revision 1.4 2001/08/03 01:28:33 richard +# Used the much nicer load_package, pointed out by Steve Majewski. +# +# Revision 1.3 2001/08/03 00:59:34 richard +# Instance import now imports the instance using imp.load_module so that +# we can have instance homes of "roundup" or other existing python package +# names. +# +# Revision 1.2 2001/07/29 07:01:39 richard +# Added vim command to all source so that we don't get no steenkin' tabs :) +# +# Revision 1.1 2001/07/23 03:46:48 richard +# moving the bin files to facilitate out-of-the-boxness +# +# Revision 1.1 2001/07/22 11:15:45 richard +# More Grande Splite stuff +# +# +# vim: set filetype=python ts=4 sw=4 et si
