Mail2News Mini-Howto

Robert Hart, iweft@ipax.com.au

v1.0, 4 November 1996

川島 浩, kei@sm.sony.co.jp


このドキュメントでは、メイリングリストをローカルなニュースグループに 橋渡しするために必要な mail2news.pl とニュースサーバのセットアップ の方法を紹介します。

注意: この文書はかなり以前に書かれたものなので、 いまどきの Linux 環境にはあてはまらない箇所があります。 (JF Project)

1. 著作権など

2. イントロダクション

3. システムの概要

4. mail2news のセットアップ

5. メイルエイリアスの設定

6. ニュースグループとニュースサーバ (innd) のセットアップ

7. メイリングリストに mail2news エイリアスを登録する。

8. うまく動作しない場合...

9. mail2news.pl スクリプト

10. 日本語訳について


1. 著作権など

このドキュメントの著作権は著者が保持しています。オリジナルの形式が 完全に 保持されている限りにおいて、電子的な手段や CD によって配布する ことを許可します。 個人的な使用のためにこのドキュメントを印刷することも許可します。

このドキュメントの一部分または全部を、上記以外の方法で、 著作権保持者の許可なく再配布することを一切禁止します。

このドキュメントは InterWeft IT Consultants (Melbourne, Australia) によって直接サポートされています。

このドキュメントの最新版は InterWeft IT Consultants <http://203.29.72.65/> の、InterWeft WWW サイトにあります。

(訳注:もちろん日本語への翻訳許可は原著者からいただいています。)

訳者より : 著者の Robert Hart さんに確認をとったところ、オリジナル の (原文のままの) 著作権表示も含めて欲しい、とのことでしたので、 以下にこの章の原文もそのまま掲載します。

  1.  Copyright and such

  The copyright of this document is retained by the author. Permission
  is granted to distribute the document by electronic means and on CDs
  provided that it is kept entirely in its original format. Permission
  is also granted to print a copy of this document for personal use.

  The republishing of this document in part or in whole without the
  permission of the copyright holder by any means other than as noted
  above is prohibited.

  This document is directly supported by InterWeft IT Consultants
  (Melbourne, Australia).

  The latest version of this document is available at the InterWeft WWW
  site at InterWeft IT Consultants <http://203.29.72.65/>.

2. イントロダクション

インターネットの接続に使うことのできるバンド幅は限られています。 ほとんどのインターネットサイトでは、その限られたバンド幅を有効に 使う方法を常に模索しています。

2人以上のユーザが同じメイリングリストを購読していたら、それは すなわち重複した (無駄な) トラフィックを生じていることになります。 このような重複がたくさんあったり、そのメイリングリストの トラフィックが高い場合には、消費されるバンド幅も大きなものとなります。

メイリングリストの管理者がそれを許しているのなら、ローカルな メイリングリストユーザ名で (MLを) 購読し、それをローカルニュース サーバに流す (原文:gate) ことによって、そのメイリングリストの 内容をサイトのユーザ全員で読むことができます。 また、「innd」のセキュリティー機能を使えば、特定のユーザのみに アクセスを制限することもできます。

非常に高トラフィックのメイリングリストがある場合には、 このようなサイト購読によってバンド幅の消費を抑えることができます。

メイリングリストの内容をニュースリーダーで読むことには他にもメリット があります。ほとんどのメイルフロントエンドではサポートされていない 「スレッド」を使うことができるからです。(訳注: ご存知のとおり、 スレッドとは、元の発言と、それに対するフォローを構造化してアクセス できるような仕組みです。)また、個人的な緊急のメイルのために メイルボックスの容量を空けておくこともできます。

このミニハウツーでは、こういうことをうまくやるための「mail2news.pl」 というスクリプトを紹介します。

2.1 mail2news.pl を見つける

著者は、CPAN (Comprehensive Perl Archive Network) では mail2news.pl を見つけることができませんでしたが、これは単に見落としただけかも しれません。まあ、とにかく sunsite.unc.edu と ftp.redhat.com の どこかにはありました。

この Perl スクリプトはそれほど長くないので、このハウツーの最後にも 添付しておきます。

3. システムの概要

おそらく、このシステムがどのように動作するのかを理解する一番簡単な 方法は、メイリングリストから送られたメッセージがどのようにニュース グループに反映されたり、ローカルニュースグループにポストされたメッセージ がどのようにしてメイリングリストに送られるか、などを追跡したり、 それらがどのように扱われるのかを見てみることでしょう。

3.1 メイリングリストからのメイル

メイリングリストからのメイルは、その購読者全員のメイルアドレスに対して 送られます。 ですから、特別なメイルエイリアスをメイリングリストに登録しておけば、 そのメイリングリストとのやりとりは、すべてこのアドレスに対しておこな われることになります。

メイリングリストからのメイルがローカルなマシンに到着すると、それは メイルエイリアスパイプ(訳注 : sendmail.cf の中で、 | を使って実現 しますよね。)を使って、mail2news.pl に渡されます。 また、そのメイルエイリアスはローカルなニュースグループの宛先を指定する ことにも使われます。

mail2news.pl スクリプトはこのメッセージを処理し、ニュースのヘッダ部分 を利用して、rnews または inews を通じてこのメッセージをローカルニュース グループにポストします。

3.2 ローカルニュースグループにポストされたメッセージ

ローカルニュースグループをモデレートなニュースグループとして設定します。 こうすることで、innd の メイル機能を使うことができるからです。

モデレートなニュースグループにポストされたメッセージは直接にニュース グループに送られる代わりに、ニュースグループのモデレータ(管理者)に メイルで送られます。

ローカルニュースグループのモデレータとしてメイリングリストのアドレスを 設定することによって、ローカルニュースグループにポストされた メッセージは、innd によって自動的にメイリングリストに対して送出 されます。このようにして送出されたメッセージは メイリングリスト サーバから返ってきた受信時にローカルニュースグループにうまくポスト されます。(重複することなしに)

mail2news.pl によって「approved」行が付け加えられますので、innd はうまくこれを処理することができます。(訳注: 要するにモデレート なニュースグループなのだけれど、「approved」行があるのでそれは そのまま(今度はモデレートされることなしに)ニュースグループにポスト される、ということですね。)

4. mail2news のセットアップ

まず、mail2news.pl を適当なところに置きます。私の場合には /usr/local/scripts に置いていますが、あなたの好きなところに置いて ください。

以下のようにこのスクリプトを編集してください:

5. メイルエイリアスの設定

/etc/aliases を編集して、ニュースにパイプしたいメイリングリストの エントリーを作成します。それぞれのエントリーは以下のような形式です:

<subscribed email address to list>: \
        "| /usr/local/scripts/mail2news.pl <local news group name>"

例えばメイリングリストからのメイルアドレス(購読メイルアドレス)が site_list で、届いたメイルがポストされるべきローカルニュースグループ名を local.site.group とすると、エイリアスは以下のようになります:

# The site subscription address for blah-blah@some.mailing.list
site_list: "| /usr/local/scripts/mail2news.pl local.site.group"

ローカルなニュースグループに流す(原文 gated)必要のあるメイリング リストそれぞれについてこのようなエントリーを作成した後に、ローカル ニュースサーバ上で newaliases コマンドを実行します。

6. ニュースグループとニュースサーバ (innd) のセットアップ

ctlinnd を使って、ローカルなニュースサーバ上にニュースグループを 作成します。ローカルなニュースグループですから、他のサイトに このニュースグループを配信してはいけません。これはニュースの配信 制御ファイルでフィルタリングできますので、そのときに指定しやすい ニュースグループ名をつけておいたほうがいいでしょう。

(訳注 : たとえば local. で始まるニュースグループ名にしておけば、 このグループ以下のニュースの配信を禁止することが簡単にできます よね。)

また、innd の設定で、これらのニュースグループをモデレート属性に しておきます(ctlinnd を使って)。 そうそう、innd は、ファイルのユーザ ID や、パーミッションに厳しい ことも忘れないでください。ですから、この操作を行なうときには news ユーザになって操作した方がいいでしょう。モデレート属性を 設定するには、次のように、ctlinnd の newgroup コマンドで m を 指定します。

ctlinnd newgroup <newgroup name> m <newsadmin>

m は このグループはモデレートであることを指定しています。

次に、ローカルなニュースグループが他のサイトに出ていかないように、 ニュース配信ファイル (newsfeeds) を編集します。 (ローカルニュースグループを他のサイトに配信する、なにか特別な理由がある 場合をのぞいて)

たとえば、ローカルなメイリングリストが local.site.group だったと すると、上流のニュースサイト(おそらく下流に対しても同様でしょうが) についてのニュース配信ファイル(newsfeeds)に、 !local* などと記述するわけです。

次に、ローカルニュースグループにポストされたメッセージが innd を 通じて自動的にメイリングリストに送られるようにするために、 /etc/news/moderators を編集します。

以下のように、そのニュースグループのモデレータとしてメイリングリストの メイルアドレスを指定する行を追加します。

some.site.list:list@mail.list.site

7. メイリングリストに mail2news エイリアスを登録する。

さて、メイリングリストにエイリアスを登録する番です。

そのメイリングリストの購読方法を確認して下さい。いくつかの メイリングリストでは、購読申込が送られたメイルアドレスとは異なった アドレスでも購読を受け付けてくれるところがあります。 (そのアドレスで本当に購読の意志があるかどうかが確認されます。)

また、このような購読形態を許さないメイリングリストもあります。 そのような場合には、購読申し込みを「でっちあげる」必要があるかも しれません。 これにはいろいろな方法がありますが、一番簡単なのは Netscape のメイル セットアップで目的の受け取りアドレスを (一時的に) 設定する、という 方法です。

購読申し込みが受け付けられると、メイリングリストサーバから送られて きた、「ウエルカム」メッセージのようなものがニュースグループに現れる はずです。こうなればすべてうまく行っています。この新しいメイリング リストに、ニュースメッセージをポストしてテストしてみましょう。

(訳注:テストとはいえ、無意味なポストは迷惑なのでやめましょうね。)

ポストしたメッセージはすぐにはニュースに反映されないはずです。(もし 反映されてしまっているようだと、なにか間違っています。) メッセージはメイルで外に送り出され、メイリングリストサーバを折り返して ローカルマシンに到着し、ローカルなニュースグループにポストされる、 という手順を踏むからです。

これもうまくいけば、ローカルニュースを通じてうまくメイリングリスト とのやりとりができていることになります。

8. うまく動作しない場合...

なにかうまく動作しない場合には、メッセージの通るべき経路を追跡して どこで失敗しているのかをよく調べる必要があります。 これには、メイルやニュースのログメッセージを見てみるのがいいでしょう。

  Robert Hart
  Melbourne, Victoria, Australia October 1996

9. mail2news.pl スクリプト

#!/usr/bin/perl

($program = $0) =~ s%.*/%%;
#( $version  ) = $] =~ /(\d+\.\d+).*\nPatch level/;
#die "$program: requires at least version 3 of perl\n"
#        if $version < 3;

# $inews = "/usr/bin/inews";
# $iopts = "-h -o \"mail2news gateway\"";
$inews = "/usr/bin/rnews";
$iopts = "";
$postinghost = "your.news.server";

if ($#ARGV < 0) {
    # $newsgroup = "test";
    # we'll expect the newsgroup line in the body
} elsif ($#ARGV == 0) {
    $newsgroup = $ARGV[0];
} else {
    die "usage: $program [newsgroup]\n";
}

# in case inews dumps core or something crazy
$SIG{'PIPE'} = "plumber";
sub plumber { die "$program: \"$inews\" died prematurely!\n"; }

open (INEWS, "| $inews $iopts") ||
    die "$program: can't run $inews\n";

# header munging loop
while (<STDIN>) {
   last if /^$/;

   # transform real from: line back to icky style
   s/^From:\s+(.*) <(.*)>/From: $2 ($1)/;

   s/Message-Id/Message-ID/;

   # transform from_ line to path header; also works locally
   s/^From\s+(\S+)@(\S+).*/Path: $2!$1/
     || s/^From\s+(\S+)[^@]*$/Path: $1\n/;

   print INEWS
#       if /^(Date|From|Subject|Path|Newsgroups|Organization|Message-ID):/i;
   if /^(Date|From|Subject|Path|Newsgroups|Message-ID):/i;
   $saw_subject |= ( $+ eq 'Subject' );

   $saw_msgid |= ( $+ eq 'Message-ID' );

#   $saw_newsgroup |= ( $+ eq 'Newsgroups' );
}

warn "$program: didn't expect newsgroup in both headers and ARGV\n"
    if $newsgroup && $saw_newsgroup;

die "$program: didn't get newsgroup from either headers or ARGV\n"
    unless $newsgroup || $saw_newsgroup;

$approved = $newsgroup;
$approved =~ s/\./'-'/eg;

($sec,$min,$hour,$mday,$mon,$year)=localtime(time);
$madeupid = "\<$year$mon$mday.$hour$min$sec.$$\@kepler.hedland.edu.au\>";

printf INEWS "Newsgroups: %s\n", $newsgroup if $newsgroup;
printf INEWS "Approved: %s\@kepler.hedland.edu.au\n", $approved;
print  INEWS "Subject: Untitled\n" unless $saw_subject;
printf INEWS "Message-ID: %s\n", $madeupid unless $saw_msgid;
printf INEWS "NNTP-Posting-Host: %s\n", $postinghost;
print  INEWS "Organisation: (mail2news gateway)\n";
print  INEWS "\n";

print INEWS while <STDIN>;   # gobble rest of message

close INEWS;
exit $?;

10. 日本語訳について

日本語訳 : 川島 浩 (kei@sm.sony.co.jp)
校正     : 伊藤 希 さん (nozomi@biol.tsukuba.ac.jp)

これは、Linux MINI-HOWTO Mail2News の翻訳です。 意訳も多くありますが、ご容赦ください。 また、内容の誤り、誤訳、もっとわかりやすい訳案などありましたら、 ぜひ訳者までフィードバックをお願い致します。