1# Copyright (C) 2001-2006 Python Software Foundation 2# Author: Barry Warsaw 3# Contact: email-sig@python.org 4 5"""email package exception classes.""" 6from __future__ import unicode_literals 7from __future__ import division 8from __future__ import absolute_import 9from future.builtins import super 10 11 12class MessageError(Exception): 13 """Base class for errors in the email package.""" 14 15 16class MessageParseError(MessageError): 17 """Base class for message parsing errors.""" 18 19 20class HeaderParseError(MessageParseError): 21 """Error while parsing headers.""" 22 23 24class BoundaryError(MessageParseError): 25 """Couldn't find terminating boundary.""" 26 27 28class MultipartConversionError(MessageError, TypeError): 29 """Conversion to a multipart is prohibited.""" 30 31 32class CharsetError(MessageError): 33 """An illegal charset was given.""" 34 35 36# These are parsing defects which the parser was able to work around. 37class MessageDefect(ValueError): 38 """Base class for a message defect.""" 39 40 def __init__(self, line=None): 41 if line is not None: 42 super().__init__(line) 43 self.line = line 44 45class NoBoundaryInMultipartDefect(MessageDefect): 46 """A message claimed to be a multipart but had no boundary parameter.""" 47 48class StartBoundaryNotFoundDefect(MessageDefect): 49 """The claimed start boundary was never found.""" 50 51class CloseBoundaryNotFoundDefect(MessageDefect): 52 """A start boundary was found, but not the corresponding close boundary.""" 53 54class FirstHeaderLineIsContinuationDefect(MessageDefect): 55 """A message had a continuation line as its first header line.""" 56 57class MisplacedEnvelopeHeaderDefect(MessageDefect): 58 """A 'Unix-from' header was found in the middle of a header block.""" 59 60class MissingHeaderBodySeparatorDefect(MessageDefect): 61 """Found line with no leading whitespace and no colon before blank line.""" 62# XXX: backward compatibility, just in case (it was never emitted). 63MalformedHeaderDefect = MissingHeaderBodySeparatorDefect 64 65class MultipartInvariantViolationDefect(MessageDefect): 66 """A message claimed to be a multipart but no subparts were found.""" 67 68class InvalidMultipartContentTransferEncodingDefect(MessageDefect): 69 """An invalid content transfer encoding was set on the multipart itself.""" 70 71class UndecodableBytesDefect(MessageDefect): 72 """Header contained bytes that could not be decoded""" 73 74class InvalidBase64PaddingDefect(MessageDefect): 75 """base64 encoded sequence had an incorrect length""" 76 77class InvalidBase64CharactersDefect(MessageDefect): 78 """base64 encoded sequence had characters not in base64 alphabet""" 79 80# These errors are specific to header parsing. 81 82class HeaderDefect(MessageDefect): 83 """Base class for a header defect.""" 84 85 def __init__(self, *args, **kw): 86 super().__init__(*args, **kw) 87 88class InvalidHeaderDefect(HeaderDefect): 89 """Header is not valid, message gives details.""" 90 91class HeaderMissingRequiredValue(HeaderDefect): 92 """A header that must have a value had none""" 93 94class NonPrintableDefect(HeaderDefect): 95 """ASCII characters outside the ascii-printable range found""" 96 97 def __init__(self, non_printables): 98 super().__init__(non_printables) 99 self.non_printables = non_printables 100 101 def __str__(self): 102 return ("the following ASCII non-printables found in header: " 103 "{}".format(self.non_printables)) 104 105class ObsoleteHeaderDefect(HeaderDefect): 106 """Header uses syntax declared obsolete by RFC 5322""" 107 108class NonASCIILocalPartDefect(HeaderDefect): 109 """local_part contains non-ASCII characters""" 110 # This defect only occurs during unicode parsing, not when 111 # parsing messages decoded from binary. 112