diff options
| author | bwarsaw | 1999-11-10 17:52:39 +0000 |
|---|---|---|
| committer | bwarsaw | 1999-11-10 17:52:39 +0000 |
| commit | 6ace6bfad37746b60c8180d8afe39657983021ff (patch) | |
| tree | aa6a5f651db8e57eaa1c96d156563220dd5cd872 | |
| parent | bee68db0f6dd45c5e01bf51729e8b7a446ad0872 (diff) | |
| download | mailman-6ace6bfad37746b60c8180d8afe39657983021ff.tar.gz mailman-6ace6bfad37746b60c8180d8afe39657983021ff.tar.zst mailman-6ace6bfad37746b60c8180d8afe39657983021ff.zip | |
New pipeline delivery module
"""Inject the message to Usenet."""
| -rw-r--r-- | Mailman/Handlers/ToUsenet.py | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/Mailman/Handlers/ToUsenet.py b/Mailman/Handlers/ToUsenet.py new file mode 100644 index 000000000..e151e455b --- /dev/null +++ b/Mailman/Handlers/ToUsenet.py @@ -0,0 +1,116 @@ +# 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. + +"""Inject the message to Usenet.""" + +import string +import re + + + +def process(mlist, msg): + # short circuits + if not mlist.gateway_to_news or \ + hasattr(msg, 'isdigest', 0) or \ + hasattr(msg, 'fromusenet', 0): + # then + return + # sanity checks + error = [] + if not mlist.linked_newsgroup: + error.append('no newsgroup') + if not mlist.nntp_host: + error.append('no NNTP host') + if error: + msg = 'NNTP gateway improperly configured: ' + \ + string.join(error, ', ') + mlist.LogMsg('error', msg) + return + # Fork in case the nntp connection hangs. + if not os.fork(): + # child + import nntplib + from Mailman import Message + # Now make the news message... + msg = Message.NewsMessage(msg) + # Ok, munge headers, etc. + subj = msg.getheader('subject') + if subj: + subjpref = mlist.subject_prefix + if not re.match('(re:? *)?' + re.escape(subjpref), subj, re.I): + msg['Subject'] = subjpref + subj + else: + msg['Subject'] = subjpref + '(no subject)' + if mlist.reply_goes_to_list: + del msg['reply-to'] + msg.headers.append('Reply-To: %s\n' % mlist.GetListEmail()) + # if we already have a sender header, don't add another one; use + # the header that's already there. + if not msg.getheader('sender'): + msg.headers.append('Sender: %s\n' % mlist.GetAdminEmail()) + msg.headers.append('Errors-To: %s\n' % mlist.GetAdminEmail()) + msg.headers.append('X-BeenThere: %s\n' % mlist.GetListEmail()) + ngheader = msg.getheader('newsgroups') + if ngheader is not None: + # see if the Newsgroups: header already contains our + # linked_newsgroup. If so, don't add it again. If not, + # append our linked_newsgroup to the end of the header list + ngroups = map(string.strip, string.split(ngheader, ',')) + if mlist.linked_newsgroup not in ngroups: + ngroups.append(mlist.linked_newsgroup) + ngheader = string.join(ngroups, ',') + # subtitute our new header for the old one. XXX Message + # class should have a __setitem__() + del msg['newsgroups'] + msg.headers.append('Newsgroups: %s\n' % ngroups) + else: + # Newsgroups: isn't in the message + msg.headers.append('Newsgroups: %s\n' % mlist.linked_newsgroup) + # Note: Need to be sure 2 messages aren't ever sent to the same + # list in the same process, since message ID's need to be unique. + # Could make the ID be mm.listname.postnum instead if that happens + if msg.getheader('Message-ID') is None: + msg.headers.append('Message-ID: <mm.%s.%s@%s>\n' % + (time.time(), os.getpid(), mlist.host_name)) + if msg.getheader('Lines') is None: + msg.headers.append('Lines: %s\n' % + len(string.split(msg.body,"\n"))) + del msg['received'] + # TBD: Gross hack to ensure that we have only one + # content-transfer-encoding header. More than one barfs NNTP. I + # don't know why we sometimes have more than one such header, and it + # probably isn't correct to take the value of just the first one. + # What if there are conflicting headers??? + # + # This relies on the new interface for getaddrlist() returning values + # for all present headers, and the fact that the legal values are + # usually not parseable as addresses. Yes this is another bogosity. + cteheaders = msg.getaddrlist('content-transfer-encoding') + if cteheaders: + ctetuple = cteheaders[0] + ctevalue = ctetuple[1] + del msg['content-transfer-encoding'] + msg['content-transfer-encoding'] = ctevalue + # NNTP is strict about spaces after the colon in headers. + for n in range(len(msg.headers)): + line = msg.headers[n] + i = string.find(line,":") + if i <> -1 and line[i+1] <> ' ': + msg.headers[n] = line[:i+1] + ' ' + line[i+1:] + conn = nntplib.NNTP(mlist.nntp_host) + conn.post(msg) + conn.quit() + os._exit(0) |
