def parseOptions(argv): o = Options() o.to = [e for e in argv if not e.startswith('-')] o.sender = getlogin() # Just be very stupid # Skip -bm -- it is the default # Add a non-standard option for querying the version of this tool. if '--version' in argv: print('mailmail version:', version) raise SystemExit() # -bp lists queue information. Screw that. if '-bp' in argv: raise _unsupportedOption # -bs makes sendmail use stdin/stdout as its transport. Screw that. if '-bs' in argv: raise _unsupportedOption # -F sets who the mail is from, but is overridable by the From header if '-F' in argv: o.sender = argv[argv.index('-F') + 1] o.to.remove(o.sender) # -i and -oi makes us ignore lone "." if ('-i' in argv) or ('-oi' in argv): raise _unsupportedOption # -odb is background delivery if '-odb' in argv: o.background = True else: o.background = False # -odf is foreground delivery if '-odf' in argv: o.background = False else: o.background = True # -oem and -em cause errors to be mailed back to the sender. # It is also the default. # -oep and -ep cause errors to be printed to stderr if ('-oep' in argv) or ('-ep' in argv): o.printErrors = True else: o.printErrors = False # -om causes a copy of the message to be sent to the sender if the sender # appears in an alias expansion. We do not support aliases. if '-om' in argv: raise _unsupportedOption # -t causes us to pick the recipients of the message from # the To, Cc, and Bcc headers, and to remove the Bcc header # if present. if '-t' in argv: o.recipientsFromHeaders = True o.excludeAddresses = o.to o.to = [] else: o.recipientsFromHeaders = False o.exludeAddresses = [] requiredHeaders = { 'from': [], 'to': [], 'cc': [], 'bcc': [], 'date': [], } buffer = NativeStringIO() while 1: write = 1 line = sys.stdin.readline() if not line.strip(): break hdrs = line.split(': ', 1) hdr = hdrs[0].lower() if o.recipientsFromHeaders and hdr in ('to', 'cc', 'bcc'): o.to.extend([email.utils.parseaddr(hdrs[1])[1]]) if hdr == 'bcc': write = 0 elif hdr == 'from': o.sender = email.utils.parseaddr(hdrs[1])[1] if hdr in requiredHeaders: requiredHeaders[hdr].append(hdrs[1]) if write: buffer.write(line) if not requiredHeaders['from']: buffer.write('From: {}\r\n'.format(o.sender)) if not requiredHeaders['to']: if not o.to: raise SystemExit("No recipients specified.") buffer.write('To: {}\r\n'.format(', '.join(o.to))) if not requiredHeaders['date']: buffer.write('Date: {}\r\n'.format(smtp.rfc822date())) buffer.write(line) if o.recipientsFromHeaders: for a in o.excludeAddresses: try: o.to.remove(a) except: pass buffer.seek(0, 0) o.body = NativeStringIO(buffer.getvalue() + sys.stdin.read()) return o
class PythonLoggingObserverTestCase(unittest.SynchronousTestCase): """ Test the bridge with python logging module. """ def setUp(self): self.out = StringIO() rootLogger = logging.getLogger("") self.originalLevel = rootLogger.getEffectiveLevel() rootLogger.setLevel(logging.DEBUG) self.hdlr = logging.StreamHandler(self.out) fmt = logging.Formatter(logging.BASIC_FORMAT) self.hdlr.setFormatter(fmt) rootLogger.addHandler(self.hdlr) self.lp = log.LogPublisher() self.obs = log.PythonLoggingObserver() self.lp.addObserver(self.obs.emit) def tearDown(self): rootLogger = logging.getLogger("") rootLogger.removeHandler(self.hdlr) rootLogger.setLevel(self.originalLevel) logging.shutdown() def test_singleString(self): """ Test simple output, and default log level. """ self.lp.msg("Hello, world.") self.assertIn("Hello, world.", self.out.getvalue()) self.assertIn("INFO", self.out.getvalue()) def test_errorString(self): """ Test error output. """ self.lp.msg(failure=failure.Failure(ValueError("That is bad.")), isError=True) self.assertIn("ERROR", self.out.getvalue()) def test_formatString(self): """ Test logging with a format. """ self.lp.msg(format="%(bar)s oo %(foo)s", bar="Hello", foo="world") self.assertIn("Hello oo world", self.out.getvalue()) def test_customLevel(self): """ Test the logLevel keyword for customizing level used. """ self.lp.msg("Spam egg.", logLevel=logging.DEBUG) self.assertIn("Spam egg.", self.out.getvalue()) self.assertIn("DEBUG", self.out.getvalue()) self.out.seek(0, 0) self.out.truncate() self.lp.msg("Foo bar.", logLevel=logging.WARNING) self.assertIn("Foo bar.", self.out.getvalue()) self.assertIn("WARNING", self.out.getvalue()) def test_strangeEventDict(self): """ Verify that an event dictionary which is not an error and has an empty message isn't recorded. """ self.lp.msg(message='', isError=False) self.assertEqual(self.out.getvalue(), '')
class PythonLoggingObserverTestCase(unittest.SynchronousTestCase): """ Test the bridge with python logging module. """ def setUp(self): self.out = StringIO() rootLogger = logging.getLogger("") self.originalLevel = rootLogger.getEffectiveLevel() rootLogger.setLevel(logging.DEBUG) self.hdlr = logging.StreamHandler(self.out) fmt = logging.Formatter(logging.BASIC_FORMAT) self.hdlr.setFormatter(fmt) rootLogger.addHandler(self.hdlr) self.lp = log.LogPublisher() self.obs = log.PythonLoggingObserver() self.lp.addObserver(self.obs.emit) def tearDown(self): rootLogger = logging.getLogger("") rootLogger.removeHandler(self.hdlr) rootLogger.setLevel(self.originalLevel) logging.shutdown() def test_singleString(self): """ Test simple output, and default log level. """ self.lp.msg("Hello, world.") self.assertIn("Hello, world.", self.out.getvalue()) self.assertIn("INFO", self.out.getvalue()) def test_errorString(self): """ Test error output. """ self.lp.msg(failure=failure.Failure(ValueError("That is bad.")), isError=True) self.assertIn("ERROR", self.out.getvalue()) def test_formatString(self): """ Test logging with a format. """ self.lp.msg(format="%(bar)s oo %(foo)s", bar="Hello", foo="world") self.assertIn("Hello oo world", self.out.getvalue()) def test_customLevel(self): """ Test the logLevel keyword for customizing level used. """ self.lp.msg("Spam egg.", logLevel=logging.DEBUG) self.assertIn("Spam egg.", self.out.getvalue()) self.assertIn("DEBUG", self.out.getvalue()) self.out.seek(0, 0) self.out.truncate() self.lp.msg("Foo bar.", logLevel=logging.WARNING) self.assertIn("Foo bar.", self.out.getvalue()) self.assertIn("WARNING", self.out.getvalue()) def test_strangeEventDict(self): """ Verify that an event dictionary which is not an error and has an empty message isn't recorded. """ self.lp.msg(message='', isError=False) self.assertEqual(self.out.getvalue(), '')