summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbwarsaw1999-11-10 17:52:39 +0000
committerbwarsaw1999-11-10 17:52:39 +0000
commit6ace6bfad37746b60c8180d8afe39657983021ff (patch)
treeaa6a5f651db8e57eaa1c96d156563220dd5cd872
parentbee68db0f6dd45c5e01bf51729e8b7a446ad0872 (diff)
downloadmailman-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.py116
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)