When the new policies are used (and only when the new policies are explicitly used) headers turn into objects that have attributes based on their parsed values, and can be set using objects that encapsulate the values, as well as set directly from unicode strings. The folding algorithm then takes care of encoding unicode where needed, and folding according to the highest level syntactic objects. With this patch only date and time headers are parsed as anything other than unstructured, but that is all the helper methods in the existing API handle. I do plan to add more parsers, and complete the set specified in the RFC before the package becomes stable.
98 lines
3.1 KiB
Python
98 lines
3.1 KiB
Python
# Copyright (C) 2001-2006 Python Software Foundation
|
|
# Author: Barry Warsaw
|
|
# Contact: email-sig@python.org
|
|
|
|
"""email package exception classes."""
|
|
|
|
|
|
class MessageError(Exception):
|
|
"""Base class for errors in the email package."""
|
|
|
|
|
|
class MessageParseError(MessageError):
|
|
"""Base class for message parsing errors."""
|
|
|
|
|
|
class HeaderParseError(MessageParseError):
|
|
"""Error while parsing headers."""
|
|
|
|
|
|
class BoundaryError(MessageParseError):
|
|
"""Couldn't find terminating boundary."""
|
|
|
|
|
|
class MultipartConversionError(MessageError, TypeError):
|
|
"""Conversion to a multipart is prohibited."""
|
|
|
|
|
|
class CharsetError(MessageError):
|
|
"""An illegal charset was given."""
|
|
|
|
|
|
# These are parsing defects which the parser was able to work around.
|
|
class MessageDefect(ValueError):
|
|
"""Base class for a message defect."""
|
|
|
|
def __init__(self, line=None):
|
|
self.line = line
|
|
|
|
class NoBoundaryInMultipartDefect(MessageDefect):
|
|
"""A message claimed to be a multipart but had no boundary parameter."""
|
|
|
|
class StartBoundaryNotFoundDefect(MessageDefect):
|
|
"""The claimed start boundary was never found."""
|
|
|
|
class FirstHeaderLineIsContinuationDefect(MessageDefect):
|
|
"""A message had a continuation line as its first header line."""
|
|
|
|
class MisplacedEnvelopeHeaderDefect(MessageDefect):
|
|
"""A 'Unix-from' header was found in the middle of a header block."""
|
|
|
|
class MalformedHeaderDefect(MessageDefect):
|
|
"""Found a header that was missing a colon, or was otherwise malformed."""
|
|
|
|
class MultipartInvariantViolationDefect(MessageDefect):
|
|
"""A message claimed to be a multipart but no subparts were found."""
|
|
|
|
class InvalidMultipartContentTransferEncodingDefect(MessageDefect):
|
|
"""An invalid content transfer encoding was set on the multipart itself."""
|
|
|
|
class UndecodableBytesDefect(MessageDefect):
|
|
"""Header contained bytes that could not be decoded"""
|
|
|
|
class InvalidBase64PaddingDefect(MessageDefect):
|
|
"""base64 encoded sequence had an incorrect length"""
|
|
|
|
class InvalidBase64CharactersDefect(MessageDefect):
|
|
"""base64 encoded sequence had characters not in base64 alphabet"""
|
|
|
|
# These errors are specific to header parsing.
|
|
|
|
class HeaderDefect(MessageDefect):
|
|
"""Base class for a header defect."""
|
|
|
|
class InvalidHeaderDefect(HeaderDefect):
|
|
"""Header is not valid, message gives details."""
|
|
|
|
class HeaderMissingRequiredValue(HeaderDefect):
|
|
"""A header that must have a value had none"""
|
|
|
|
class NonPrintableDefect(HeaderDefect):
|
|
"""ASCII characters outside the ascii-printable range found"""
|
|
|
|
def __init__(self, non_printables):
|
|
super().__init__(non_printables)
|
|
self.non_printables = non_printables
|
|
|
|
def __str__(self):
|
|
return ("the following ASCII non-printables found in header: "
|
|
"{}".format(self.non_printables))
|
|
|
|
class ObsoleteHeaderDefect(HeaderDefect):
|
|
"""Header uses syntax declared obsolete by RFC 5322"""
|
|
|
|
class NonASCIILocalPartDefect(HeaderDefect):
|
|
"""local_part contains non-ASCII characters"""
|
|
# This defect only occurs during unicode parsing, not when
|
|
# parsing messages decoded from binary.
|