diff options
author | Matěj Cepl <mcepl@cepl.eu> | 2023-05-25 20:29:03 +0200 |
---|---|---|
committer | Matěj Cepl <mcepl@cepl.eu> | 2023-05-25 23:34:44 +0200 |
commit | 12cd578201bffe69c3f4d88081d8698d0c79d23f (patch) | |
tree | 971e52bd2d81f6962ccf0da9c2711c97b195997a /src/news2mail.py | |
parent | 4e2bdb32cb61490e600b51b67a1dcfd7b1c683e1 (diff) | |
download | pygn-12cd578201bffe69c3f4d88081d8698d0c79d23f.tar.gz |
Partially revert d5fc1faf927a ... reintroduce main() interface.0.11.0
Fixes: https://todo.sr.ht/~mcepl/pygn/8
Diffstat (limited to 'src/news2mail.py')
-rw-r--r-- | src/news2mail.py | 118 |
1 files changed, 114 insertions, 4 deletions
diff --git a/src/news2mail.py b/src/news2mail.py index 33d2590..f99b0d7 100644 --- a/src/news2mail.py +++ b/src/news2mail.py @@ -22,8 +22,7 @@ normal (what pygs does) operations flow is: Date:, normal headers ending with X-* and Resent-* headers. """ -from __future__ import absolute_import -from __future__ import print_function +import argparse from collections import OrderedDict import email import email.policy @@ -31,7 +30,7 @@ import smtplib from socket import gethostbyaddr, gethostname import sys import time -from mail2news import VERSION, DESC +import mail2news # logging.basicConfig(level=logging.DEBUG) @@ -60,7 +59,8 @@ class news2mail(object): """add new header like X-Gateway: Received: """ - msg['X-Gateway'] = 'pyg {0} {1}'.format(VERSION, DESC) + msg['X-Gateway'] = 'pyg {0} {1}'.format(mail2news.__version__, + mail2news.__description__) # to make Received: header t = time.ctime(time.time()) @@ -172,3 +172,113 @@ class news2mail(object): s.quit() +def parse_cmdline(a_in): + """ + 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' % + (mail2news.__version__, mail2news.__description__)) + + 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('-i', '--input', default='') + 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(a_in) + +# 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(args_in=None): + """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 + """ + out = '' + + # it returns only test, other parms are set directly in the actual + # parameter + if args_in is None: + args_in = sys.argv[1:] + args = parse_cmdline(args_in) + + n2m = news2mail(args) + 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: + out += str('"%s" is not in whitelist!' % (n2m.message['From'][:-1])) + '\n' + 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: + out += n2m.message.as_string() + '\n' + + 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() + + if args.input == '': + print(out) + else: + return out |