diff options
author | Matěj Cepl <mcepl@cepl.eu> | 2019-09-30 10:37:52 +0200 |
---|---|---|
committer | Matěj Cepl <mcepl@cepl.eu> | 2019-09-30 10:37:52 +0200 |
commit | c60e11ceba4fc9ac017e8b1c6a2f1eab810f2dc7 (patch) | |
tree | 10ba0f4b0e1b63844ccb470a07b07331af580268 | |
parent | 0efae60c88d21bcdca66d904cbc842b2e64ecfac (diff) | |
download | pygn-c60e11ceba4fc9ac017e8b1c6a2f1eab810f2dc7.tar.gz |
Basic restructuring of the code to use setuptools’ entry_points.
-rw-r--r-- | mail2news.py | 84 | ||||
-rw-r--r-- | news2mail.py | 107 | ||||
-rwxr-xr-x | pygm2n | 99 | ||||
-rwxr-xr-x | pygn2m | 126 | ||||
-rw-r--r-- | setup.py | 6 |
5 files changed, 190 insertions, 232 deletions
diff --git a/mail2news.py b/mail2news.py index d6d8658..386305b 100644 --- a/mail2news.py +++ b/mail2news.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 """Mail to news gateway script. Copyright 2000 Cosimo Alfarano Author: Cosimo Alfarano @@ -98,7 +99,7 @@ class mail2news(object): # In rfc822 References: is considered, but many MUA doen't put it. if ('References' not in self.message) and \ ('In-Reply-To' in self.message): - print self.message['In-Reply-To'] + print(self.message['In-Reply-To']) # some MUA uses msgid without '<' '>' # ref = findall('([^\s<>\']+@[^\s<>;:\']+)', \ @@ -110,8 +111,8 @@ class mail2news(object): if(ref and len(ref)): self.message['References'] = '%s\n' % ref[0] - except KeyError, message: - print message + except KeyError as message: + print(message) def removeheads(self, heads=None): """remove headers like Xref: Path: Lines: @@ -137,8 +138,8 @@ class mail2news(object): msgid = '<pyg.%d@tuchailepuppapera.org>\n' % (os.getpid()) self.message['Message-Id'] = msgid - except KeyError, message: - print message + except KeyError as message: + print(message) def sortheads(self): """make list sorted by heads: From: To: Subject: first, @@ -183,3 +184,76 @@ class mail2news(object): server.post(StringIO(self.message.as_string())) server.quit() + +def parse_cmdline(): + parser = argparse.ArgumentParser( + description='%s version %s - Copyright 2000 Cosimo Alfarano\n%s' % + ('pyg', mail2news.VERSION, mail2news.DESC)) + + parser.add_argument('-s', '--newsserver', default='') + parser.add_argument('-a', '--approver', default='', + help="address of moderator/approver") + parser.add_argument('-n', '--newsgroup', default='', + help='newsgroup[s] (specified as comma separated ' + + 'without spaces list)', required=True) + parser.add_argument('-u', '--user', default='', + help='NNTP server user (for authentication)') + parser.add_argument('-p', '--password', default='', + help='NNTP server password (for authentication)') + parser.add_argument('-P', '--port', default='') + parser.add_argument('-e', '--envellope', default='') + parser.add_argument('-l', '--logfile') + + parser.add_argument('-T', '--test', action='store_true', + help='test mode (not send article via NNTP)') + parser.add_argument('-v', '--verbose', action='store_true', + help='verbose output ' + + '(usefull with -T option for debugging)') + + args = parser.parse_args() + + if not args.newsgroup: + raise argparse.ArgumentError('Error: Missing Newsgroups\n') + + return args + + +def main(): + """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 + """ + + try: + """phase 1: + check and set pyg's internal variables + """ + opt = parse_cmdline() + + m2n = mail2news.mail2news(opt) + owner = None + + """phase 3: + format rfc 822 headers from input article + """ + m2n.renameheads() # rename useless heads + m2n.removeheads() # remove other heads + + m2n.sortheads() # sort remaining heads :) + + if opt.verbose: + print(m2n.message.as_string()) + + logging.debug('m2n.payload = len %d', len(m2n.message.get_payload())) + if len(m2n.message.get_payload()) > 0: + # wl.logmsg(m2n.heads_dict,wl.ACCEPT,owner) + if not opt.test: + try: + resp = m2n.sendemail() + except nntplib.NNTPError as ex: + print(ex) + except KeyboardInterrupt: + print('Keyboard Interrupt') + sys.exit(0) diff --git a/news2mail.py b/news2mail.py index 78d0ae4..eecd701 100644 --- a/news2mail.py +++ b/news2mail.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 """News to mail gateway script. Copyright 2000 Cosimo Alfarano Author: Cosimo Alfarano @@ -121,8 +122,8 @@ class news2mail(object): refs = self.message['References'].split() self.message['In-Reply-To'] = refs[-1] - except KeyError, message: - print message + except KeyError as message: + print(message) def __sortheads(self): """make list sorting heads, Received: From: To: Subject: first, @@ -167,3 +168,105 @@ class news2mail(object): s.sendmail(self.envelope, self.rcpt, self.message.as_string()) s.quit() + +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)) + + 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') + + 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: +# (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 opts.envelope == '' and opts.sender != '': + opts.envelope = opts.sender + + return opts + +def main(): + """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() + + n2m = news2mail.news2mail(verbose=args.verbose) + owner = None + + # 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 + """ + + wl.logmsg(n2m.heads_dict, wl.ACCEPT, owner) + if not args.test: + n2m.sendarticle() @@ -1,99 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -"""News to mail gateway script. Copyright 2000 Cosimo Alfarano - -Author: Cosimo Alfarano -Date: June 11 2000 - -pygs - Copyright 2000 by Cosimo Alfarano <Alfarano@Students.CS.UniBo.It> -You can use this software under the terms of the GPL. If we meet some day, -and you think this stuff is worth it, you can buy me a beer in return. - -Thanks to md for this useful formula. Beer is beer. - -Gets news article and sends it via SMTP. -""" -from __future__ import print_function - -import argparse -import logging -import mail2news -import nntplib -import sys - -# logging.basicConfig(level=logging.DEBUG) - -def parse_cmdline(): - parser = argparse.ArgumentParser( - description='%s version %s - Copyright 2000 Cosimo Alfarano\n%s' % - ('pyg', mail2news.VERSION, mail2news.DESC)) - - parser.add_argument('-s', '--newsserver', default='') - parser.add_argument('-a', '--approver', default='', - help="address of moderator/approver") - parser.add_argument('-n', '--newsgroup', default='', - help='newsgroup[s] (specified as comma separated ' + - 'without spaces list)', required=True) - parser.add_argument('-u', '--user', default='', - help='NNTP server user (for authentication)') - parser.add_argument('-p', '--password', default='', - help='NNTP server password (for authentication)') - parser.add_argument('-P', '--port', default='') - parser.add_argument('-e', '--envellope', default='') - parser.add_argument('-l', '--logfile') - - parser.add_argument('-T', '--test', action='store_true', - help='test mode (not send article via NNTP)') - parser.add_argument('-v', '--verbose', action='store_true', - help='verbose output ' + - '(usefull with -T option for debugging)') - - args = parser.parse_args() - - if not args.newsgroup: - raise argparse.ArgumentError('Error: Missing Newsgroups\n') - - return args - - -"""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 -""" - - -try: - - """phase 1: - check and set pyg's internal variables - """ - opt = parse_cmdline() - - m2n = mail2news.mail2news(opt) - owner = None - - """phase 3: - format rfc 822 headers from input article - """ - m2n.renameheads() # rename useless heads - m2n.removeheads() # remove other heads - - m2n.sortheads() # sort remaining heads :) - - if opt.verbose: - print(m2n.message.as_string()) - - logging.debug('m2n.payload = len %d', len(m2n.message.get_payload())) - if len(m2n.message.get_payload()) > 0: -# wl.logmsg(m2n.heads_dict,wl.ACCEPT,owner) - if not opt.test: - try: - resp = m2n.sendemail() - except nntplib.NNTPError as ex: - print(ex) - -except KeyboardInterrupt: - print('Keyboard Interrupt') - sys.exit(0) @@ -1,126 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -"""News to mail gateway script. Copyright 2000 Cosimo Alfarano - -Author: Cosimo Alfarano -Date: June 11 2000 - -pygs - Copyright 2000 by Cosimo Alfarano <Alfarano@Students.CS.UniBo.It> -You can use this software under the terms of the GPL. If we meet some day, -and you think this stuff is worth it, you can buy me a beer in return. - -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)) - - 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') - - 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: -# (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 opts.envelope == '' and opts.sender != '': - opts.envelope = opts.sender - - return opts - - -"""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() - -n2m = news2mail.news2mail(verbose=args.verbose) -owner = None - -# 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 -""" - -wl.logmsg(n2m.heads_dict, wl.ACCEPT, owner) -if not args.test: - n2m.sendarticle() @@ -22,6 +22,12 @@ setup(name='pygn', 'whitelist', 'wlp', 'wlp_parser'], test_suite="test", scripts=['pygm2n', 'pygn2m'], + entry_points={ + "console_scripts": [ + "pygm2n = mail2news:main", + "pygn2m = news2mail:main" + ] + }, requires=['rply'], license="GPLv3", keywords=["nntp", "email", "gateway"], |