diff options
-rw-r--r-- | mail2news.py | 10 | ||||
-rw-r--r-- | news2mail.py | 519 | ||||
-rwxr-xr-x | pygm2n | 3 | ||||
-rwxr-xr-x | pygn2m | 292 |
4 files changed, 378 insertions, 446 deletions
diff --git a/mail2news.py b/mail2news.py index 3011a4e..e7cbcf9 100644 --- a/mail2news.py +++ b/mail2news.py @@ -14,11 +14,9 @@ Gets news email and sends it via SMTP. class mail2news is hopefully conform to rfc850. """ - import sys from os import getpid from socket import gethostbyaddr, gethostname -import string from re import findall import nntplib import pyginfo @@ -79,14 +77,14 @@ class mail2news: # if it is a multi-line header like Received: if line[0] not in [' ', '\t']: try: - head, value = string.split(line, ' ', 1) - except string.index_error: + head, value = line.split(' ', 1) + except ValueError: value = '' self.smtpheads[head] = value else: self.smtpheads[head] = '%s%s' % \ (self.smtpheads[head], line) - except (string.index_error), message: + except (ValueError), message: print('line: %s' % line) print('(probably missing couple "Header: value" in %s)' % line) @@ -95,7 +93,7 @@ class mail2news: elif len(line) > 0 and body: self.body.append(line) - except (string.index_error), message: + except (ValueError), message: print message sys.exit(1) diff --git a/news2mail.py b/news2mail.py index 73808b3..bfd6fd1 100644 --- a/news2mail.py +++ b/news2mail.py @@ -3,7 +3,7 @@ Author: Cosimo Alfarano Date: June 11 2000 -news2mail.py - Copyright 2000 by Cosimo Alfarano <Alfarano@Students.CS.UniBo.It> +news2mail.py - (C) 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. @@ -20,280 +20,271 @@ normal (what pygs does) operations flow is: 3) merges NNTP and SMTP heads into a unique heads 4) adds, renames and removes some heads 5) sorts remaining headers starting at top with Received: From: To: Subject: - Date:, normal headers ending with X-* and Resent-* headers. + Date:, normal headers ending with X-* and Resent-* headers. """ - import sys import smtplib -import string -from re import compile -#import getopt import time -#import rfc822 from socket import gethostbyaddr, gethostname import tempfile import pyginfo + class news2mail: - """news to mail gateway class""" - - TMPFILE = tempfile.mktemp() - wlfile = None - logfile = None - - sender = '' - rcpt = '' - envelope = '' - - smtpserver = 'localhost' - - hostname = gethostbyaddr(gethostname())[0] - - heads_dict, smtpheads, nntpheads = {}, {}, {} - article, headers, body = [], [], [] - - debug = 1 - - def readfile(self): - - for line in sys.stdin.readlines(): - self.article.append(line) - - if (len(self.article) == 1 and self.article[0][0] == '/'): - file = self.article[0][:-1] - del self.article[0] - for line in open(file,'r').readlines(): - self.article.append(line) - - - def parsearticle(self): - """get news article from file or stdin and separate heads from body - - REMEBER: headers value has '\n' as last char. - Use string[:-1] to ignore newline. - """ - - try: - body = 0 # are we in body or in headers? - -# voidline = compile('^$') # I need '\n', ^$ matches anything -# spaceending = compile('\s*\n$') - - for line in self.article: - if not body and len(line) == 1: - body = 1 # starts article body section - - if not body: - try: - head, value = string.split(line, ' ', 1) - self.nntpheads[head] = value - except (string.index_error), message: - print 'string error: %s' % message - print '(probably missing couple "Header: value" in %s)' % line - sys.exit(1) - - elif len(line) > 0 and body: - self.body.append(line) - - return self.nntpheads, self.body - -# except (re.error, string.index_error), message: - except (string.index_error), message: - print message - sys.exit(1) - - - def puthead(self, dict, list, key): - """private, x-form dict entries in list entries""" - - if dict.has_key(key): - list.append(key + ' ' + dict.get(key)) - else: - return 0 - return 1 - - def sortheads(self): - """make list sorting heads, Received: From: To: Subject: first, others, X-*, Resent-* last""" - - set = ('Received:','From:','To:','Subject:','Date:') # put at top - - for k in set: - self.puthead(self.heads_dict,self.headers,k) - - for k in self.heads_dict.keys(): - if k[:2] != 'X-' and k[:7] != 'Resent-' and k not in set: - self.puthead(self.heads_dict,self.headers,k) - - for k in self.heads_dict.keys(): - if k[:2] == 'X-': - self.puthead(self.heads_dict,self.headers,k) - - for k in self.heads_dict.keys(): - if k[:7] == 'Resent-': - self.puthead(self.heads_dict,self.headers,k) - - return self.headers - - - def mergeheads(self): - """make a unique headers dictionary from NNTP and SMTP - single headers dictionaries.""" - - self.heads_dict = {} - - - try: - for header in self.nntpheads.keys(): # fill it w/ nntp old heads - self.heads_dict[header] = self.nntpheads[header] - - for header in self.smtpheads.keys(): # and replace them w/ smtp new heads - self.heads_dict[header] = self.smtpheads[header] - - except KeyError, message: - print message - - return self.heads_dict - - def addheads(self): - """add new header like X-Gateway: Received: - """ - - info = pyginfo.pygsinfo() - - try: - self.heads_dict['X-Gateway:'] = info.PROGNAME + ' ' + \ - info.__doc__ + '\n' - - ##self.heads_dict['X-Gateway:'] = '%s %s\n' % (info.PROGNAME, info.__doc__) - - # to make Received: header - t = time.ctime(time.time()) - - if time.daylight: - tzone = time.tzname[1] - else: - tzone = time.tzname[0] - - # An exemple from debian-italian: - # Received: from murphy.debian.org (murphy.debian.org [216.234.231.6]) - # by smv04.iname.net (8.9.3/8.9.1SMV2) with SMTP id JAA26407 - # for <kame.primo@innocent.com> sent by - # <debian-italian-request@lists.debian.org - - tmp = 'from GATEWAY by ' + self.hostname + \ - ' with ' + info.PROGNAME + \ - '\n\tfor <' + self.rcpt + '> ; ' + \ - t + ' (' + tzone +')\n' - - self.heads_dict['Received:'] = tmp - except KeyError, message: - print message - - return self.heads_dict - - def renameheads(self): - """rename headers such as Newsgroups: to X-Newsgroups: - - headers renamed are useless or not rfc 822 copliant - """ - try: - if self.heads_dict.has_key('Newsgroups:'): - self.heads_dict['X-Newsgroups:'] = self.heads_dict['Newsgroups:'] - del self.heads_dict['Newsgroups:'] - - if self.heads_dict.has_key('NNTP-Posting-Host:'): - self.heads_dict['X-NNTP-Posting-Host:'] = self.heads_dict['NNTP-Posting-Host:'] - del self.heads_dict['NNTP-Posting-Host:'] - except KeyError, message: - print message - - return self.heads_dict - - - def removeheads(self): - """remove headers like Xref: Path: Lines: - """ - - try: - # removing some others useless headers .... - - if self.heads_dict.has_key('Approved:'): - del self.heads_dict['Approved:'] - - if self.heads_dict.has_key('From'): # neither 'From ' nor 'From:' - del self.heads_dict['From'] - - if self.heads_dict.has_key('Xref:'): - del self.heads_dict['Xref:'] - - if self.heads_dict.has_key('Path:'): - del self.heads_dict['Path:'] - - if self.heads_dict.has_key('Lines:'): - del self.heads_dict['Lines:'] - - # it is usually set by INN, if ng is moderated... - if self.heads_dict.has_key('Sender:'): - del self.heads_dict['Sender:'] - - - if self.heads_dict.has_key('Message-id:'): - self.heads_dict['Message-Id:'] = self.heads_dict['Message-id'] - del(self.heads_dict['Message-id']) - - if self.heads_dict.has_key('Message-ID:'): - self.heads_dict['Message-Id:'] = self.heads_dict['Message-ID'] - del(self.heads_dict['Message-ID']) - - # If message-id is not present, I generate it - if not self.heads_dict.has_key('Message-Id:'): - # It should put a real user@domain - msgid = 'pyg@puppapera.org' - - except KeyError, message: - print message - - return self.heads_dict - - def sendarticle(self): - """Talk to SMTP server and try to send email.""" - try: - msglist = [] - - s = smtplib.SMTP(self.smtpserver) - - # put real locahost domain name. - s.helo(self.hostname) - if s.helo_resp is None and s.ehlo_resp is None: - print 'No helo resp' - sys.exit(1) - - resp = s.mail(self.envelope) - if resp[0] != 250: - print 'SMTP error during MAIL cmd: %s %s' % (resp[0], resp[1]) - print 'envelope %s gave problem?' % self.envelope - sys.exit(1) - resp = s.rcpt(self.rcpt) - if resp[0] != 250: - print 'SMTP error during MAIL cmd: %s %s' % (resp[0], resp[1]) - sys.exit(1) - - - msglist.append(string.join(self.headers,'')) - - msglist.append(string.join(self.body,'')) - msg = string.join(msglist,'') - - s.data(msg) - s.quit() - - return 1 - - except (smtplib.SMTPException), messaggio: - print messaggio - sys.exit(1) + """news to mail gateway class""" + + TMPFILE = tempfile.mktemp() + wlfile = None + logfile = None + + sender = '' + rcpt = '' + envelope = '' + + smtpserver = 'localhost' + + hostname = gethostbyaddr(gethostname())[0] + + heads_dict, smtpheads, nntpheads = {}, {}, {} + article, headers, body = [], [], [] + + debug = 1 + + def readfile(self): + + for line in sys.stdin.readlines(): + self.article.append(line) + + if (len(self.article) == 1 and self.article[0][0] == '/'): + file = self.article[0][:-1] + del self.article[0] + for line in open(file, 'r').readlines(): + self.article.append(line) + + def parsearticle(self): + """get news article from file or stdin and separate heads from body + + REMEBER: headers value has '\n' as last char. + Use string[:-1] to ignore newline. + """ + + try: + body = 0 # are we in body or in headers? + +# voidline = compile('^$') # I need '\n', ^$ matches anything +# spaceending = compile('\s*\n$') + + for line in self.article: + if not body and len(line) == 1: + body = 1 # starts article body section + + if not body: + try: + head, value = line.split(' ', 1) + self.nntpheads[head] = value + except (ValueError), message: + print('string error: %s' % message) + print('(probably missing couple "Header: value" in %s)' + % line) + sys.exit(1) + + elif len(line) > 0 and body: + self.body.append(line) + + return self.nntpheads, self.body + +# except (re.error, ValueError), message: + except (ValueError), message: + print message + sys.exit(1) + + def puthead(self, dict, list, key): + """private, x-form dict entries in list entries""" + + if key in dict: + list.append(key + ' ' + dict.get(key)) + else: + return 0 + return 1 + + def sortheads(self): + """make list sorting heads, Received: From: To: Subject: first, + others, X-*, Resent-* last""" + + set = ('Received:', 'From:', 'To:', 'Subject:', 'Date:') # put at top + + for k in set: + self.puthead(self.heads_dict, self.headers, k) + + for k in self.heads_dict.keys(): + if k[:2] != 'X-' and k[:7] != 'Resent-' and k not in set: + self.puthead(self.heads_dict, self.headers, k) + + for k in self.heads_dict.keys(): + if k[:2] == 'X-': + self.puthead(self.heads_dict, self.headers, k) + + for k in self.heads_dict.keys(): + if k[:7] == 'Resent-': + self.puthead(self.heads_dict, self.headers, k) + + return self.headers + + def mergeheads(self): + """make a unique headers dictionary from NNTP and SMTP + single headers dictionaries.""" + + self.heads_dict = {} + + try: + for header in self.nntpheads.keys(): # fill it w/ nntp old heads + self.heads_dict[header] = self.nntpheads[header] + + # and replace them w/ smtp new heads + for header in self.smtpheads.keys(): + self.heads_dict[header] = self.smtpheads[header] + + except KeyError, message: + print message + + return self.heads_dict + + def addheads(self): + """add new header like X-Gateway: Received: + """ + + info = pyginfo.pygsinfo() + + try: + self.heads_dict['X-Gateway:'] = info.PROGNAME + ' ' + \ + info.__doc__ + '\n' + + ##self.heads_dict['X-Gateway:'] = '%s %s\n' % + ## (info.PROGNAME, info.__doc__) + + # to make Received: header + t = time.ctime(time.time()) + + if time.daylight: + tzone = time.tzname[1] + else: + tzone = time.tzname[0] + + # An exemple from debian-italian: + # Received: from murphy.debian.org (murphy.debian.org [216.234.231.6]) + # by smv04.iname.net (8.9.3/8.9.1SMV2) with SMTP id JAA26407 + # for <kame.primo@innocent.com> sent by + # <debian-italian-request@lists.debian.org + + tmp = 'from GATEWAY by ' + self.hostname + \ + ' with ' + info.PROGNAME + \ + '\n\tfor <' + self.rcpt + '> ; ' + \ + t + ' (' + tzone + ')\n' + + self.heads_dict['Received:'] = tmp + except KeyError, message: + print message + + return self.heads_dict + + def renameheads(self): + """rename headers such as Newsgroups: to X-Newsgroups: + + headers renamed are useless or not rfc 822 copliant + """ + try: + if 'Newsgroups:' in self.heads_dict: + self.heads_dict['X-Newsgroups:'] = \ + self.heads_dict['Newsgroups:'] + del self.heads_dict['Newsgroups:'] + + if 'NNTP-Posting-Host:' in self.heads_dict: + self.heads_dict['X-NNTP-Posting-Host:'] = \ + self.heads_dict['NNTP-Posting-Host:'] + del self.heads_dict['NNTP-Posting-Host:'] + except KeyError, message: + print message + + return self.heads_dict + + def removeheads(self): + """remove headers like Xref: Path: Lines: + """ + + try: + # removing some others useless headers .... + + if 'Approved:' in self.heads_dict: + del self.heads_dict['Approved:'] + + if 'From' in self.heads_dict: # neither 'From ' nor 'From:' + del self.heads_dict['From'] + + if 'Xref:' in self.heads_dict: + del self.heads_dict['Xref:'] + + if 'Path:' in self.heads_dict: + del self.heads_dict['Path:'] + + if 'Lines:' in self.heads_dict: + del self.heads_dict['Lines:'] + + # it is usually set by INN, if ng is moderated... + if 'Sender:' in self.heads_dict: + del self.heads_dict['Sender:'] + + if 'Message-id:' in self.heads_dict: + self.heads_dict['Message-Id:'] = self.heads_dict['Message-id'] + del(self.heads_dict['Message-id']) + + if 'Message-ID:' in self.heads_dict: + self.heads_dict['Message-Id:'] = self.heads_dict['Message-ID'] + del(self.heads_dict['Message-ID']) + + # If message-id is not present, I generate it + if 'Message-Id:' not in self.heads_dict: + # It should put a real user@domain + msgid = 'pyg@puppapera.org' # FIXME unused variable + + except KeyError, message: + print message + + return self.heads_dict + + def sendarticle(self): + """Talk to SMTP server and try to send email.""" + try: + msglist = [] + + s = smtplib.SMTP(self.smtpserver) + + # put real locahost domain name. + s.helo(self.hostname) + if s.helo_resp is None and s.ehlo_resp is None: + print 'No helo resp' + sys.exit(1) + + resp = s.mail(self.envelope) + if resp[0] != 250: + print 'SMTP error during MAIL cmd: %s %s' % (resp[0], resp[1]) + print 'envelope %s gave problem?' % self.envelope + sys.exit(1) + resp = s.rcpt(self.rcpt) + if resp[0] != 250: + print 'SMTP error during MAIL cmd: %s %s' % (resp[0], resp[1]) + sys.exit(1) + + msglist.append(''.join(self.headers)) + msglist.append(''.join(self.body)) + msg = ''.join(msglist) + s.data(msg) + s.quit() + return 1 + except (smtplib.SMTPException), messaggio: + print messaggio + sys.exit(1) @@ -1,4 +1,5 @@ #!/usr/bin/env python +# -*- coding: utf-8 -*- """News to mail gateway script. Copyright 2000 Cosimo Alfarano Author: Cosimo Alfarano @@ -63,8 +64,6 @@ def parse_cmdline(): if not args.newsgroup: raise argparse.ArgumentError('Error: Missing Newsgroups\n') - logging.debug('args = %s', args) - return args @@ -1,5 +1,5 @@ #!/usr/bin/env python - +# -*- coding: utf-8 -*- """News to mail gateway script. Copyright 2000 Cosimo Alfarano Author: Cosimo Alfarano @@ -13,202 +13,146 @@ Thanks to md for this useful formula. Beer is beer. Gets news article from stdin and sends it via SMTP. """ - -import sys, os -import getopt -from string import split +from __future__ import print_function +import sys +import os +import argparse sys.path.append('/usr/lib/pyg') import pyginfo import whitelist import news2mail -#import mail2news - - -def parse_cmdline(gw): - """Parses cmdline with getopt. - set a dictionary with smtp new header in gw parameter (gw.smtpheads) - return (test,verbose) boolean tuple - """ - - opt, arg = None, None - test, verbose = 0, 0 - retnull = (None, None) - - try: - opt, arg = getopt.getopt(sys.argv[1:],"H:t:s:e:w:l:hdvVT") - except (getopt.error), message: - print '%s: %s\n' % (sys.argv[0], message) - sys.exit(1) - - if len(sys.argv) == 1 or opt == []: - gw.smtpheads = None - return retnull - - for i in range(len(opt)): - if opt[i][0] == '-h': - gw.smtpheads = None - return retnull - elif opt[i][0] == '-v': - gw.smtpheads = None - return retnull - elif opt[i][0] == '-H': - gw.smtpserver = opt[i][1] - elif opt[i][0] == '-s': - gw.smtpheads['Resent-Sender:'] = opt[i][1] + '\n' - gw.sender = opt[i][1] - elif opt[i][0] == '-t' or opt[i][0] == '-r': - gw.smtpheads['To:'] = opt[i][1] + '\n' - gw.rcpt = opt[i][1] - elif opt[i][0] == '-e': - gw.smtpheads['Resent-From:'] = opt[i][1] + '\n' #envelope - gw.envelope = opt[i][1] - elif opt[i][0] == '-w': - gw.wlfile = opt[i][1] - elif opt[i][0] == '-l': - gw.logfile = opt[i][1] - elif opt[i][0] == '-d': - gw.debug = 1 - elif opt[i][0] == '-T': - test = 1 - elif opt[i][0] == '-V': - verbose = 1 - -# By rfc822 [Resent-]Sender: should be ever set, unless == From: + + +def parse_cmdline(): + """ + set a dictionary with smtp new header in gw parameter (gw.smtpheads) + return (test,verbose) boolean tuple + """ + i = pyginfo.pygsinfo() + parser = argparse.ArgumentParser( + description='%s version %s - Copyright 2000 Cosimo Alfarano\n%s' % + (i.PROGNAME, i.VERSION, i.__doc__)) + + 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') + + # TODO eventually we should refactor these to be Boolean + # and use store_true + parser.add_argument('-T', '--test', + help='test mode (not send article via SMTP)', + action='store_true') + parser.add_argument('-d', '--debug', + 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 gw.rcpt == '' or gw.sender == '': - print 'missing command line option' - gw.smtpheads = None - return retnull + if opts.rcpt == '' or opts.sender == '': + raise argparse.ArgumentError('missing command line option') - if gw.envelope == '' and gw.sender != '': - gw.smtpheads['Resent-From:'] = gw.sender + '\n' - gw.envelope = gw.sender - elif gw.envelope == -1: - gw.smtpheads = None - return retnull + if opts.envelope == '' and opts.sender != '': + opts.envelope = opts.sender - sys.argv[1:] = arg + return opts - return (test, verbose) +"""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 +""" -def usage(): - i = pyginfo.pygsinfo() +try: - print '%s version %s - Copyright 2000 Cosimo Alfarano' % (i.PROGNAME, i.VERSION) - print i.__doc__ - print - print 'usage: %s [-h] [-d] [-T] [-V] [-H smtphost] [-l logfile] [-w whitelist] -t recipient@... -s sender@... [-e envelope@...]' % split(sys.argv[0],'/')[-1] - print '-t -s recipient, sender are necessary' - print '-e envelope [default: same of sender]' - print '-T for test mode (not send article via SMTP)' - print '-V for verbose output' - print '-d for debug' - print '-h or -v for this info' - + """phase 1: + check and set pyg's internal variables + """ + n2m = news2mail.news2mail() + owner = None + # it returns only test, other parms are set directly in the actual + # parameter + args = parse_cmdline() + # check if n2m has some file prefercences set on commandline + if n2m.wlfile is None: + wl = os.environ['HOME'] + '/pyg.whitelist' + else: + wl = n2m.wlfile + if n2m.logfile is None: + log = os.environ['HOME'] + '/pyg.log' + else: + log = n2m.logfile +# print 'using %s %s\n' % (wl,log) + wl = whitelist.whitelist(wl, log) -"""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 -""" + # reads stdin and parses article separating head from body + n2m.readfile() + n2m.parsearticle() + """phase 2: + check whitelist for user's permission + """ -try: + # make a first check of From: address + owner = wl.checkfrom(n2m.nntpheads['From:']) + if owner is None: + if sys.stdin.isatty() == 1 or args.test: + print ('"%s" is not in whitelist!' % (n2m.nntpheads['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) + + """phase 3: + format rfc 822 headers from input article + """ + + n2m.mergeheads() # make unique dict from NNTP and SMTP dicts + + n2m.addheads() # add some important heads + n2m.renameheads() # rename useless heads + n2m.removeheads() # remove other heads + + n2m.sortheads() # sort remaining heads :) + + # prints formatted email message only (without send) if user wants + if args.verbose: + for line in n2m.headers: + print(line[:-1]) + + if args.owner is None: + sys.exit(1) + + """phase 4: + open smtp connection and send e-mail + """ - """phase 1: - check and set pyg's internal variables - """ - - n2m = news2mail.news2mail() - owner = None - - # it returns only test, other parms are set directly in the actual parameter - (test, verbose) = parse_cmdline(n2m) - if (test, verbose) == (None, None): - usage() - sys.exit(0) - - - # check if n2m has some file prefercences set on commandline - if(n2m.wlfile == None): - wl = os.environ['HOME'] + '/pyg.whitelist' - else: - wl = n2m.wlfile - - if(n2m.logfile == None): - log = os.environ['HOME'] + '/pyg.log' - else: - log = n2m.logfile - -# print 'using %s %s\n' % (wl,log) - - wl = whitelist.whitelist(wl,log) - - # reads stdin and parses article separating head from body - n2m.readfile() - n2m.parsearticle() - - - """phase 2: - check whitelist for user's permission - """ - - # make a first check of From: address - owner = wl.checkfrom(n2m.nntpheads['From:']) - if(owner == None): - if(sys.stdin.isatty()==1 or test): - print ('"%s" is not in whitelist!' % (n2m.nntpheads['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 verbose): - sys.exit(1) - - """phase 3: - format rfc 822 headers from input article - """ - - n2m.mergeheads() # make unique dict from NNTP and SMTP dicts - - n2m.addheads() # add some important heads - n2m.renameheads() # rename useless heads - n2m.removeheads() # remove other heads - - n2m.sortheads() # sort remaining heads :) - - # prints formatted email message only (without send) if user wants - if(verbose): - for line in n2m.headers: - print line[:-1] - - if(owner == None): - sys.exit(1) - - - """phase 4: - open smtp connection and send e-mail - """ - - if len(n2m.headers) > 0: - wl.logmsg(n2m.heads_dict,wl.ACCEPT,owner) - if(not test): - n2m.sendarticle() - else: - print 'Error: No Headers!!!' + if len(n2m.headers) > 0: + wl.logmsg(n2m.heads_dict, wl.ACCEPT, owner) + if not args.test: + n2m.sendarticle() + else: + print('Error: No Headers!!!') except KeyboardInterrupt: - print 'Keyboard Interrupt' - sys.exit(1) + print('Keyboard Interrupt') + sys.exit(1) |