diff options
Diffstat (limited to 'src/mail2news.py')
-rw-r--r-- | src/mail2news.py | 98 |
1 files changed, 93 insertions, 5 deletions
diff --git a/src/mail2news.py b/src/mail2news.py index 6e8fe53..dc05c1d 100644 --- a/src/mail2news.py +++ b/src/mail2news.py @@ -14,6 +14,7 @@ Gets news email and sends it via SMTP. class mail2news is hopefully conform to rfc850. """ +import argparse import io from collections import OrderedDict import email @@ -31,7 +32,7 @@ import tempfile # This is the single source of Truth # Yes, it is awkward to have it assymetrically here # and not in news2mail as well. -__version__ = '0.10.3' +__version__ = '0.11.0' __description__ = 'The Python Gateway Script: news2mail mail2news gateway' @@ -55,9 +56,14 @@ class mail2news(object): self.hostname = gethostbyaddr(gethostname())[0] self.heads_dict, self.smtpheads, self.nntpheads = {}, {}, {} - self.message = self.__readfile(options) + if options.input == '': + self.message = self.__readfile(options, sys.stdin) + else: + with open(options.input, 'r') as inp_stream: + self.message = self.__readfile(options, inp_stream) - self.message['X-Gateway'] = 'pyg {0} {1}'.format(VERSION, DESC) + self.message['X-Gateway'] = 'pyg {0} {1}'.format(__version__, + __description__) def __add_header(self, header, value, msg=None): if msg is None: @@ -65,8 +71,8 @@ class mail2news(object): if value: msg[header] = value.strip() - def __readfile(self, opt): - message = email.message_from_file(sys.stdin, policy=email.policy.SMTP) + def __readfile(self, opt, input_stream): + message = email.message_from_file(input_stream, policy=email.policy.SMTP) if (len(message) == 0) \ and message.get_payload().startswith('/'): @@ -193,3 +199,85 @@ class mail2news(object): logging.exception("Failed to convert message!") server.quit() + +def parse_cmdline(args): + parser = argparse.ArgumentParser( + description='%s version %s - Copyright 2000 Cosimo Alfarano\n%s' % + ('pyg', __version__, __description__)) + + 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', '--envelope', default='') + parser.add_argument('-i', '--input', 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(args) + + if not args.newsgroup: + raise argparse.ArgumentError('Error: Missing Newsgroups\n') + + return args + + +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 + """ + out = '' + + try: + """phase 1: + check and set pyg's internal variables + """ + if args_in is None: + args_in = sys.argv[1:] + opt = parse_cmdline(args_in) + + m2n = 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: + out += m2n.message.as_string() + '\n' + + 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: + logging.exception(ex) + except KeyboardInterrupt: + logging.error('Keyboard Interrupt') + sys.exit(0) + + if opt.input == '': + print(out) + else: + return out |