Viewing file: parser.py (5.19 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
# Copyright (C) 2001-2007 Python Software Foundation # Author: Barry Warsaw, Thomas Wouters, Anthony Baxter # Contact: email-sig@python.org
"""A parser of RFC 2822 and MIME email messages.""" from __future__ import unicode_literals from __future__ import division from __future__ import absolute_import
__all__ = ['Parser', 'HeaderParser', 'BytesParser', 'BytesHeaderParser']
import warnings from io import StringIO, TextIOWrapper
from future.backports.email.feedparser import FeedParser, BytesFeedParser from future.backports.email.message import Message from future.backports.email._policybase import compat32
class Parser(object): def __init__(self, _class=Message, **_3to2kwargs): """Parser of RFC 2822 and MIME email messages.
Creates an in-memory object tree representing the email message, which can then be manipulated and turned over to a Generator to return the textual representation of the message.
The string must be formatted as a block of RFC 2822 headers and header continuation lines, optionally preceeded by a `Unix-from' header. The header block is terminated either by the end of the string or by a blank line.
_class is the class to instantiate for new message objects when they must be created. This class must have a constructor that can take zero arguments. Default is Message.Message.
The policy keyword specifies a policy object that controls a number of aspects of the parser's operation. The default policy maintains backward compatibility.
""" if 'policy' in _3to2kwargs: policy = _3to2kwargs['policy']; del _3to2kwargs['policy'] else: policy = compat32 self._class = _class self.policy = policy
def parse(self, fp, headersonly=False): """Create a message structure from the data in a file.
Reads all the data from the file and returns the root of the message structure. Optional headersonly is a flag specifying whether to stop parsing after reading the headers or not. The default is False, meaning it parses the entire contents of the file. """ feedparser = FeedParser(self._class, policy=self.policy) if headersonly: feedparser._set_headersonly() while True: data = fp.read(8192) if not data: break feedparser.feed(data) return feedparser.close()
def parsestr(self, text, headersonly=False): """Create a message structure from a string.
Returns the root of the message structure. Optional headersonly is a flag specifying whether to stop parsing after reading the headers or not. The default is False, meaning it parses the entire contents of the file. """ return self.parse(StringIO(text), headersonly=headersonly)
class HeaderParser(Parser): def parse(self, fp, headersonly=True): return Parser.parse(self, fp, True)
def parsestr(self, text, headersonly=True): return Parser.parsestr(self, text, True)
class BytesParser(object):
def __init__(self, *args, **kw): """Parser of binary RFC 2822 and MIME email messages.
Creates an in-memory object tree representing the email message, which can then be manipulated and turned over to a Generator to return the textual representation of the message.
The input must be formatted as a block of RFC 2822 headers and header continuation lines, optionally preceeded by a `Unix-from' header. The header block is terminated either by the end of the input or by a blank line.
_class is the class to instantiate for new message objects when they must be created. This class must have a constructor that can take zero arguments. Default is Message.Message. """ self.parser = Parser(*args, **kw)
def parse(self, fp, headersonly=False): """Create a message structure from the data in a binary file.
Reads all the data from the file and returns the root of the message structure. Optional headersonly is a flag specifying whether to stop parsing after reading the headers or not. The default is False, meaning it parses the entire contents of the file. """ fp = TextIOWrapper(fp, encoding='ascii', errors='surrogateescape') with fp: return self.parser.parse(fp, headersonly)
def parsebytes(self, text, headersonly=False): """Create a message structure from a byte string.
Returns the root of the message structure. Optional headersonly is a flag specifying whether to stop parsing after reading the headers or not. The default is False, meaning it parses the entire contents of the file. """ text = text.decode('ASCII', errors='surrogateescape') return self.parser.parsestr(text, headersonly)
class BytesHeaderParser(BytesParser): def parse(self, fp, headersonly=True): return BytesParser.parse(self, fp, headersonly=True)
def parsebytes(self, text, headersonly=True): return BytesParser.parsebytes(self, text, headersonly=True)
|