diff options
| author | bwarsaw | 1998-06-19 19:32:48 +0000 |
|---|---|---|
| committer | bwarsaw | 1998-06-19 19:32:48 +0000 |
| commit | 99f721f65906e4f2d1036da3a886426aa0ec5aea (patch) | |
| tree | 93ffed3285a375b2f9766715fe61b03cd3aafd78 /modules/mm_message.py | |
| parent | 664f1baa491de8a96d859f28b73aca877ce23f14 (diff) | |
| download | mailman-99f721f65906e4f2d1036da3a886426aa0ec5aea.tar.gz mailman-99f721f65906e4f2d1036da3a886426aa0ec5aea.tar.zst mailman-99f721f65906e4f2d1036da3a886426aa0ec5aea.zip | |
Diffstat (limited to 'modules/mm_message.py')
| -rw-r--r-- | modules/mm_message.py | 268 |
1 files changed, 0 insertions, 268 deletions
diff --git a/modules/mm_message.py b/modules/mm_message.py deleted file mode 100644 index 82b2cb554..000000000 --- a/modules/mm_message.py +++ /dev/null @@ -1,268 +0,0 @@ -# Copyright (C) 1998 by the Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - -"""Embody incoming and outgoing messages as objects.""" - -__version__ = "$Revision: 670 $" - - -import sys -import rfc822, string, time - - -# Utility functions 2 of these classes use: -def AddBackNewline(str): - return str + '\n' - -def RemoveNewline(str): - return str[:-1] - - -# XXX klm - use the standard lib StringIO module instead of FakeFile. -# If we're trying to create a message object from text, we need to pass -# a file object to rfc822.Message to get it to do its magic. Well, -# to avoid writing text out to a file, and having it read back in, -# here we define a class that will fool rfc822 into thinking it's a -# non-seekable message. -# The only method rfc822.Message ever calls on a non-seekable file is -# readline. It doesn't use the optional arg to readline, either. -# In my subclasses, I use the read() method, and might just use readlines() -# someday. -# -# It might be useful to expand this into a full blown fully functional class. - -class FakeFile: - def __init__(self, text): - self.lines = map(AddBackNewline, string.split(text, '\n')) - self.curline = 0 - self.lastline = len(self.lines) - 1 - def readline(self): - if self.curline > self.lastline: - return '' - self.curline = self.curline + 1 - return self.lines[self.curline - 1] - def read(self): - startline = self.curline - self.curline = self.lastline + 1 - return string.join(self.lines[startline:], '') - def readlines(self): - startline = self.curline - self.curline = self.lastline + 1 - return self.lines[startline:] - def seek(self, pos): - if pos <> 0: - raise ValueError, "FakeFiles can only seek to the beginning." - self.curline = 0 - - - -# We know the message is gonna come in on stdin or from text for our purposes. -class IncomingMessage(rfc822.Message): - def __init__(self, text=None): - if not text: - rfc822.Message.__init__(self, sys.stdin, 0) - self.body = self.fp.read() - else: - rfc822.Message.__init__(self, FakeFile(text), 0) - self.body = self.fp.read() - self.file_count = None - - def readlines(self): - if self.file_count <> None: - x = self.file_count - self.file_count = len(self.file_data) - return self.file_data[x:] - return map(RemoveNewline, self.headers) + [''] + \ - string.split(self.body,'\n') - - def readline(self): - if self.file_count == None: - self.file_count = 0 - self.file_data = map(RemoveNewline, self.headers) + [''] + \ - string.split(self.body,'\n') - if self.file_count >= len(self.file_data): - return '' - self.file_count = self.file_count + 1 - return self.file_data[self.file_count-1] + '\n' - - def GetSender(self): - # Look for a Sender field. - sender = self.getheader('sender') - if sender: - realname, mail_address = self.getaddr('sender') - else: - try: - realname, mail_address = self.getaddr('from') - except: - # The unix from line is all we have left... - if self.unixfrom: - return string.lower(string.split(self.unixfrom)[1]) - - return string.lower(mail_address) - - def GetSenderName(self): - real_name, mail_addr = self.getaddr('from') - if not real_name: - return self.GetSender() - return real_name - - def SetHeader(self, name, value, crush_duplicates=1): - # Well, we crush dups in the dict no matter what... - name = "%s%s" % (name[0], name[1:]) - self.dict[string.lower(name)] = value - if value[-1] <> '\n': - value = value + '\n' - - if not crush_duplicates: - self.headers.append('%s: %s' % (name, value)) - return - for i in range(len(self.headers)): - if (string.lower(self.headers[i][:len(name)+1]) == - string.lower(name) + ':'): - self.headers[i] = '%s: %s' % (name, value) - - # XXX Eventually (1.5.1?) Python rfc822.Message() will have its own - # __delitem__. - def __delitem__(self, name): - """Delete all occurrences of a specific header, if it is present.""" - name = string.lower(name) - if not self.dict.has_key(name): - return - del self.dict[name] - name = name + ':' - n = len(name) - list = [] - hit = 0 - for i in range(len(self.headers)): - line = self.headers[i] - if string.lower(line[:n]) == name: - hit = 1 - elif line[:1] not in string.whitespace: - hit = 0 - if hit: - list.append(i) - list.reverse() - for i in list: - del self.headers[i] - -# This is a simplistic class. It could do multi-line headers etc... -# But it doesn't because I don't need that for this app. -class OutgoingMessage: - def __init__(self, headers=None, body='', sender=None): - self.cached_headers = {} - if headers: - self.SetHeaders(headers) - else: - self.headers = [] - self.body = body - self.sender = sender - - def readlines(self): - if self.file_count <> None: - x = self.file_count - self.file_count = len(self.file_data) - return self.file_data[x:] - return map(RemoveNewline, self.headers) + [''] + \ - string.split(self.body,'\n') - - def readline(self): - if self.file_count == None: - self.file_count = 0 - self.file_data = map(RemoveNewline, self.headers) + [''] + \ - string.split(self.body,'\n') - if self.file_count >= len(self.file_data): - return '' - self.file_count = self.file_count + 1 - return self.file_data[self.file_count-1] + '\n' - - def SetHeaders(self, headers): - self.headers = map(AddBackNewline, string.split(headers, '\n')) - self.CacheHeaders() - - def CacheHeaders(self): - for header in self.headers: - i = string.find(header, ':') - self.cached_headers[string.lower(string.strip(header[:i])) - ] = header[i+2:] - - def SetHeader(self, header, value, crush_duplicates=1): - if value[-1] <> '\n': - value = value + '\n' - if crush_duplicates: - # Run through the list and make sure header isn't already there. - remove_these = [] - for item in self.headers: - f = string.find(item, ':') - if string.lower(item[:f]) == string.lower(header): - remove_these.append(item) - for item in remove_these: - self.headers.remove(item) - del remove_these - self.headers.append('%s%s: %s' % (string.upper(header[0]), - string.lower(header[1:]), - value)) - self.cached_headers[string.lower(header)] = value - - def SetBody(self, body): - self.body = body - - def AppendToBody(self, text): - self.body = self.body + text - - def SetSender(self, sender, set_from=1): - self.sender = sender - if not self.getheader('from') and set_from: - self.SetHeader('from', sender) - - def SetDate(self, date=time.ctime(time.time())): - self.SetHeader('date', date) - - def GetSender(self): - return self.sender - -# Lower case the name to give it the same UI as IncomingMessage -# inherits from rfc822 - def getheader(self, str): - str = string.lower(str) - if not self.cached_headers.has_key(str): - return None - return self.cached_headers[str] - - def __delitem__(self, name): - if not self.getheader(name): - return None - newheaders = [] - name = string.lower(name) - nlen = len(name) - for h in self.headers: - if (len(h) > (nlen+1) - and h[nlen] == ":" - and string.lower(h[:nlen]) == name): - continue - newheaders.append(h) - self.headers = newheaders - self.CacheHeaders() - - - -class NewsMessage(IncomingMessage): - def __init__(self, mail_msg): - self.fp = mail_msg.fp - self.fp.seek(0) - rfc822.Message.__init__(self, self.fp, 0) - self.body = self.fp.read() - self.file_count = None |
