diff options
Diffstat (limited to 'pygn2m')
-rwxr-xr-x | pygn2m | 272 |
1 files changed, 180 insertions, 92 deletions
@@ -1,5 +1,5 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- + """News to mail gateway script. Copyright 2000 Cosimo Alfarano Author: Cosimo Alfarano @@ -13,114 +13,202 @@ Thanks to md for this useful formula. Beer is beer. Gets news article from stdin and sends it via SMTP. """ -from __future__ import print_function - -import argparse -from mail2news import VERSION, DESC -import news2mail -import os -import sys -import whitelist - -def parse_cmdline(): - """ - set a dictionary with smtp new header in gw parameter (gw.smtpheads) - return (test,verbose) boolean tuple - """ - parser = argparse.ArgumentParser( - description='pyg version %s - Copyright 2000 Cosimo Alfarano\n%s' % - (VERSION, DESC)) +import sys, os +import getopt +from string import split - parser.add_argument('-H', '--smtpserver', default='') - parser.add_argument('-s', '--sender', required=True, default='') - parser.add_argument('-e', '--envelope', default='') - parser.add_argument('-t', '--to', dest='rcpt', required=True) - parser.add_argument('-w', '--wlfile') - parser.add_argument('-l', '--logfile') +sys.path.append('/usr/lib/pyg') - parser.add_argument('-T', '--test', - help='test mode (not send article via SMTP)', - action='store_true') - parser.add_argument('-v', '--verbose', help='verbose output', - action='store_true') - - opts = parser.parse_args() - -# By rfc822 [Resent-]Sender: should be ever set, unless == From: +import pyginfo +import whitelist +import news2mail +#import mail2news + + +def parse_cmdline(gw): + """Parses cmdline with getopt. + set a dictionary with smtp new header in gw parameter (gw.smtpheads) + return (test,verbose) boolean tuple + """ + + opt, arg = None, None + test, verbose = 0, 0 + retnull = (None, None) + + try: + opt, arg = getopt.getopt(sys.argv[1:],"H:t:s:e:w:l:hdvVT") + except (getopt.error), message: + print '%s: %s\n' % (sys.argv[0], message) + sys.exit(1) + + if len(sys.argv) == 1 or opt == []: + gw.smtpheads = None + return retnull + + for i in range(len(opt)): + if opt[i][0] == '-h': + gw.smtpheads = None + return retnull + elif opt[i][0] == '-v': + gw.smtpheads = None + return retnull + elif opt[i][0] == '-H': + gw.smtpserver = opt[i][1] + elif opt[i][0] == '-s': + gw.smtpheads['Resent-Sender:'] = opt[i][1] + '\n' + gw.sender = opt[i][1] + elif opt[i][0] == '-t' or opt[i][0] == '-r': + gw.smtpheads['To:'] = opt[i][1] + '\n' + gw.rcpt = opt[i][1] + elif opt[i][0] == '-e': + gw.smtpheads['Resent-From:'] = opt[i][1] + '\n' #envelope + gw.envelope = opt[i][1] + elif opt[i][0] == '-w': + gw.wlfile = opt[i][1] + elif opt[i][0] == '-l': + gw.logfile = opt[i][1] + elif opt[i][0] == '-d': + gw.debug = 1 + elif opt[i][0] == '-T': + test = 1 + elif opt[i][0] == '-V': + verbose = 1 + +# By rfc822 [Resent-]Sender: should be ever set, unless == From: # (not this case). Should be a human, while [Resent-]From: may be a program. - if opts.rcpt == '' or opts.sender == '': - raise argparse.ArgumentError('missing command line option') + if gw.rcpt == '' or gw.sender == '': + print 'missing command line option' + gw.smtpheads = None + return retnull - if opts.envelope == '' and opts.sender != '': - opts.envelope = opts.sender + if gw.envelope == '' and gw.sender != '': + gw.smtpheads['Resent-From:'] = gw.sender + '\n' + gw.envelope = gw.sender + elif gw.envelope == -1: + gw.smtpheads = None + return retnull - return opts + sys.argv[1:] = arg + return (test, verbose) -"""main is structured in 4 phases: - 1) check and set pyg's internal variables - 2) check whitelist for users' permission - 3) format rfc 822 headers from input article - 4) open smtp connection and send e-mail -""" - -"""phase 1: -check and set pyg's internal variables -""" -# it returns only test, other parms are set directly in the actual -# parameter -args = parse_cmdline() +def usage(): + i = pyginfo.pygsinfo() -n2m = news2mail.news2mail(verbose=args.verbose) -owner = None + print '%s version %s - Copyright 2000 Cosimo Alfarano' % (i.PROGNAME, i.VERSION) + print i.__doc__ + print + print 'usage: %s [-h] [-d] [-T] [-V] [-H smtphost] [-l logfile] [-w whitelist] -t recipient@... -s sender@... [-e envelope@...]' % split(sys.argv[0],'/')[-1] + print '-t -s recipient, sender are necessary' + print '-e envelope [default: same of sender]' + print '-T for test mode (not send article via SMTP)' + print '-V for verbose output' + print '-d for debug' + print '-h or -v for this info' + -# check if n2m has some file prefercences set on commandline -if args.wlfile is None: - wl = os.path.expanduser(os.path.join(os.path.dirname(__file__), 'pyg.whitelist')) -else: - wl = args.wlfile -if args.logfile is None: - log = os.path.expanduser(os.path.join(os.path.dirname(__file__), 'pyg.log')) -else: - log = args.logfile -wl = whitelist.whitelist(wl, log) - -"""phase 2: -check whitelist for user's permission -""" -# make a first check of From: address -owner = wl.checkfrom(n2m.message['From']) -if owner is None: - if sys.stdin.isatty() == 1 or args.test: - print ('"%s" is not in whitelist!' % (n2m.message['From'][:-1])) - else: - wl.logmsg(n2m.nntpheads, wl.DENY) - # if verbose, I want to print out headers, so I can't - # exit now. - if not args.verbose: - sys.exit(1) -# Reformat the message -n2m.process_message() -# prints formatted email message only (without send) if user wants -if args.verbose: - print(n2m.message.as_string()) - -if owner is None: - sys.exit(1) - -"""phase 4: -open smtp connection and send e-mail +"""main is structured in 4 phases: + 1) check and set pyg's internal variables + 2) check whitelist for users' permission + 3) format rfc 822 headers from input article + 4) open smtp connection and send e-mail """ -wl.logmsg(n2m.heads_dict, wl.ACCEPT, owner) -if not args.test: - n2m.sendarticle() + +try: + + """phase 1: + check and set pyg's internal variables + """ + + n2m = news2mail.news2mail() + owner = None + + # it returns only test, other parms are set directly in the actual parameter + (test, verbose) = parse_cmdline(n2m) + if (test, verbose) == (None, None): + usage() + sys.exit(0) + + + # check if n2m has some file prefercences set on commandline + if(n2m.wlfile == None): + wl = os.environ['HOME'] + '/pyg.whitelist' + else: + wl = n2m.wlfile + + if(n2m.logfile == None): + log = os.environ['HOME'] + '/pyg.log' + else: + log = n2m.logfile + +# print 'using %s %s\n' % (wl,log) + + wl = whitelist.whitelist(wl,log) + + # reads stdin and parses article separating head from body + n2m.readfile() + n2m.parsearticle() + + + """phase 2: + check whitelist for user's permission + """ + + # make a first check of From: address + owner = wl.checkfrom(n2m.nntpheads['From:']) + if(owner == None): + if(sys.stdin.isatty()==1 or test): + print ('"%s" is not in whitelist!' % (n2m.nntpheads['From:'][:-1])) + else: + wl.logmsg(n2m.nntpheads,wl.DENY) + + # if verbose, I want to print out headers, so I can't + # exit now. + if(not verbose): + sys.exit(1) + + """phase 3: + format rfc 822 headers from input article + """ + + n2m.mergeheads() # make unique dict from NNTP and SMTP dicts + + n2m.addheads() # add some important heads + n2m.renameheads() # rename useless heads + n2m.removeheads() # remove other heads + + n2m.sortheads() # sort remaining heads :) + + # prints formatted email message only (without send) if user wants + if(verbose): + for line in n2m.headers: + print line[:-1] + + if(owner == None): + sys.exit(1) + + + """phase 4: + open smtp connection and send e-mail + """ + + if len(n2m.headers) > 0: + wl.logmsg(n2m.heads_dict,wl.ACCEPT,owner) + if(not test): + n2m.sendarticle() + else: + print 'Error: No Headers!!!' + +except KeyboardInterrupt: + print 'Keyboard Interrupt' + sys.exit(1) |