  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.  著作権など

  このドキュメントの著作権は著者が保持しています。オリジナルの形式が完全
  に 保持されている限りにおいて、電子的な手段や 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 に置いていますが、あなたの好きなところに置いてくだ
  さい。

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

  o  スクリプトの先頭部分。perl のバイナリがどこにあるのかを指定します。

       #!/usr/bin/perl
       # point at the correct location of perl

  o  私の場合には次の3行で問題が生じました。コメントアウトしてしまって問
     題ありません。

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

  o  次の行には、あなたのニュースポストプログラムを指定してください。 (
     私の場合には rnews です。)また、ニュースホストも指定します。

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

  o  スクリプトファイルには実行可能パーミッションを設定しておきます。 (
     モード 755)

  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 の翻訳です。意訳も多くありますが、
  ご容赦ください。また、内容の誤り、誤訳、もっとわかりやすい訳案などあり
  ましたら、ぜひ訳者までフィードバックをお願い致します。

