aboutsummaryrefslogtreecommitdiffstats
path: root/news2mail.py
diff options
context:
space:
mode:
authorMatěj Cepl <mcepl@cepl.eu>2019-09-30 10:37:52 +0200
committerMatěj Cepl <mcepl@cepl.eu>2019-09-30 10:37:52 +0200
commitc60e11ceba4fc9ac017e8b1c6a2f1eab810f2dc7 (patch)
tree10ba0f4b0e1b63844ccb470a07b07331af580268 /news2mail.py
parent0efae60c88d21bcdca66d904cbc842b2e64ecfac (diff)
downloadpygn-c60e11ceba4fc9ac017e8b1c6a2f1eab810f2dc7.tar.gz
Basic restructuring of the code to use setuptools’ entry_points.
Diffstat (limited to 'news2mail.py')
-rw-r--r--news2mail.py107
1 files changed, 105 insertions, 2 deletions
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()