From d6b4d3860c4b36d35b9a8a96dcdf49093a139650 Mon Sep 17 00:00:00 2001 From: Matěj Cepl Date: Tue, 1 Oct 2019 14:44:02 +0200 Subject: A ways better. Tentatively fixes #7 --- news2mail.py | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) (limited to 'news2mail.py') diff --git a/news2mail.py b/news2mail.py index eecd701..a21e1ed 100644 --- a/news2mail.py +++ b/news2mail.py @@ -23,23 +23,27 @@ normal (what pygs does) operations flow is: Date:, normal headers ending with X-* and Resent-* headers. """ -from collections import OrderedDict +import argparse +import os +import os.path +import collections import email from mail2news import VERSION, DESC import smtplib -from socket import gethostbyaddr, gethostname +import socket import sys import time +import whitelist # logging.basicConfig(level=logging.DEBUG) class news2mail(object): """news to mail gateway class""" - def __init__(self, verbose=False): + def __init__(self, options): self.wlfile = None self.logfile = None - self.verbose = verbose + self.verbose = options.verbose self.sender = '' self.rcpt = '' @@ -47,11 +51,16 @@ class news2mail(object): self.smtpserver = 'localhost' - self.hostname = gethostbyaddr(gethostname())[0] + self.hostname = socket.gethostbyaddr(socket.gethostname())[0] self.heads_dict = {} self.article, self.headers, self.body = [], [], [] - self.message = self.__addheads(email.message_from_file(sys.stdin)) + + if options.input == '': + self.message = self.__addheads(email.message_from_file(sys.stdin)) + else: + with open(options.input, 'r') as inp_stream: + self.message = self.__addheads(email.message_from_file(inp_stream)) def __addheads(self, msg): """add new header like X-Gateway: Received: @@ -132,7 +141,7 @@ class news2mail(object): # put at top header_set = ('Received', 'From', 'To', 'Subject', 'Date') - heads_dict = OrderedDict(self.message) + heads_dict = collections.OrderedDict(self.message) for hdr in self.message.keys(): del self.message[hdr] @@ -169,7 +178,7 @@ class news2mail(object): s.quit() -def parse_cmdline(): +def parse_cmdline(args): """ set a dictionary with smtp new header in gw parameter (gw.smtpheads) return (test,verbose) boolean tuple @@ -183,6 +192,7 @@ def parse_cmdline(): 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', @@ -191,7 +201,7 @@ def parse_cmdline(): parser.add_argument('-v', '--verbose', help='verbose output', action='store_true') - opts = parser.parse_args() + opts = parser.parse_args(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. @@ -204,7 +214,7 @@ def parse_cmdline(): return opts -def main(): +def main(args=sys.argv[1:]): """main is structured in 4 phases: 1) check and set pyg's internal variables 2) check whitelist for users' permission @@ -215,12 +225,13 @@ def main(): """phase 1: check and set pyg's internal variables """ + out = '' # it returns only test, other parms are set directly in the actual # parameter - args = parse_cmdline() + args = parse_cmdline(args) - n2m = news2mail.news2mail(verbose=args.verbose) + n2m = news2mail(args) owner = None # check if n2m has some file prefercences set on commandline @@ -244,7 +255,7 @@ def main(): 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])) + out += str('"%s" is not in whitelist!' % (n2m.message['From'][:-1])) + '\n' else: wl.logmsg(n2m.nntpheads, wl.DENY) @@ -258,7 +269,7 @@ def main(): # prints formatted email message only (without send) if user wants if args.verbose: - print(n2m.message.as_string()) + out += n2m.message.as_string() + '\n' if owner is None: sys.exit(1) @@ -270,3 +281,8 @@ def main(): wl.logmsg(n2m.heads_dict, wl.ACCEPT, owner) if not args.test: n2m.sendarticle() + + if args.input == '': + print(out) + else: + return out -- cgit