		MTA tips

------------------------------------------------------------
I	Sendmail

1	sendmail 特有のはなし
1.1	owner-ml: xxx@yyy.co.jp は消していいですか?

II	Postfix

2	Postfix
2.1	postfix の一時停止

3	POP before SMTP with Postfix
3.1	install postfix
3.2	install DRAC (Dynamic Relay Authorization Control)
3.3	qpopperの改造

Appendix A	C Wrapper
Appendix A.1	C wrapper (:include: が使えない場合)
Appendix A.2	C wrapper program fml on 4.3BSD

Appendix B	:include: ファイル (fml.plの呼び方、引数の渡し方)
Appendix B.1	:include: ファイル (fml.plの呼び方、引数の渡し方)
------------------------------------------------------------


I	Sendmail
1	sendmail 特有のはなし

1.1	owner-ml: xxx@yyy.co.jp は消していいですか?

消さない方がいいです。sendmail の場合に、エンベロープの送信者情報の書き
換えが"owner-"を設定したことで起こります。

II	Postfix
2	Postfix

	http://www.postfix.org/

2.1	postfix の一時停止

To suspend smtp delivery:

    postconf -e defer_transports=smtp; postfix reload

To enable smtp delivery:

    postconf -e defer_transports=; postfix reload; postfix flush

これは便利で、一時的に配送を止めることができます。
正確には SMTP というサービスを defer モードに変更する
という意味です。
本来はダイアルアップ接続などで queue を flush するまでは
キューに入れるだけ良い場合を想定した機能です。 

3	POP before SMTP with Postfix

postfix での pop before smtp について

3.1	install postfix

3.2	install DRAC (Dynamic Relay Authorization Control)

	http://mail.cc.umanitoba.ca/drac/index.html

[drac のつくりかた]
・INSTALLを読んで、OSにあわせてMakefileを直す。
  注意: -DREQ_HASH を忘れずに

   INSTALL = install
   EBIN = /usr/local/sbin
   MAN = /usr/local/man/man
   DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C -DREQ_HASH
   CC = cc
   RANLIB = ranlib
   CFLAGS = $(DEFS) -g -I/usr/include
   LDLIBS = 
   TSTLIBS = -L. -ldrac
   RPCGENFLAGS = -C
   MANLIB = 3
   MANADM = 8

3.3	qpopperの改造

・INSTALLの中にある pop_pass.c へのパッチをあてる。
  必要なら手であてる

・qpopper をcompileするときに libdrac.a が必要なので適当な場所におく
  Makefileをそれにあわせて修正。

    *** pop_pass.c-nodrac	Sat Jun 27 10:56:00 1998
    --- pop_pass.c	Wed Jul 22 22:54:04 1998
    ***************
    *** 19,24 ****
    --- 19,28 ----
    
      #include <pwd.h>
      #include "popper.h"
    + #ifdef DRAC_AUTH
    + #include <netinet/in.h>
    + #include <arpa/inet.h>
    + #endif /* DRAC_AUTH */
    
      /* This error message is vague on purpose to help reduce help improve
    ***************
    *** 502,507 ****
    --- 506,519 ----
    
          /*  Initialize the last-message-accessed number */
          p->last_msg = 0;
    + 
    + #ifdef DRAC_AUTH
    +     {
    + 	char *err;
    + 	if (dracauth("localhost", inet_addr(p->ipaddr), &err) != 0)
    + 	  pop_log(p,POP_PRIORITY,err);
    +     }
    + #endif /* DRAC_AUTH */
    
          /*  Authorization completed successfully */
          return (pop_msg (p,POP_SUCCESS,
    
3. modify postfix /etc/postfix/main.cf.

        smtpd_recipient_restrictions =
            permit_mynetworks
            check_client_access hash:/etc/mail/dracd
            check_relay_domains
            reject

4. mkdir /etc/mail. 

dracd users the directory "/etc/mail".

5. run "rpc.dracd" as a daemon.

[解説]

改造の結果 popper はPOPの認証に成功した直後に dracd へRPC(Remote
Procedure Call)でそのデータを渡すようになる。dracdはそれをうけて 
/etc/mail/dracd.db というファイルに

   IPアドレス   何時までこのアドレスからのSMTPが有効か？(unix time)

のハッシュテーブルを作る。デフォールトでは30分間有効。

RPCを使うためdracdは同じホスト上で動いていなくても構わない。つまり pop 
サーバと MTAは同じホストである必要がない。ここが肝なわけだけど、逆に
RPC関係の設定を間違えるとRPCまわりが世界に◯見えというサーバが出来上が
るともいえて気をつけないといけない。

postfixの check_client_access maptype:mapname は

   Search the named access database for the client hostname, parent
   domains, client IP address, or networks obtained by stripping least
   significant octets. Reject the request if the result is REJECT or
   "[45]XX text".  Permit the request if the result is OK or RELAY or
   all-numerical. Otherwise, treat the result as another list of UCE
   restrictions. The access_map_reject_code parameter specifies the
   response code for REJECT results (default: 554).

のようになっているため、ハッシュテーブルの値が数字だけならOKとなる。

Appendix A	C Wrapper

Appendix A.1	C wrapper (:include: が使えない場合)

:include: 構文が使えない OS もしくは古い sendmail の場合は C wrapper 
を使う必要があります。
C wrapper は setuid して使います。setuid された program の引数でfml.pl 
を渡すとかいうことはしてはいけません。
＃そういうことをする外国のソフトがあるようですが…何考えてるんだろ

makefml newml すると見本の fmlwrapper.c を作ってくれているのでそれを 
compile して、fml-wrapper 作をります($DIRでmake)。 fml-ctl-wrapper は 
listname-ctl 用です。
fmlwrapper.c は環境に併せて変更されていますが一応確認はしてみてください。
fmlwrapper.c には実行する内容が hard coding されているので必要なら直接 edit 
して下さい。

Example:

	% cd /var/spool/ml/elena
	% make fml
	cc  -o fml fmlwrapper.c
	chmod 4755 fml
	cc  -DCTLADDR -o fml-ctl fmlwrapper.c
	chmod 4755 fml-ctl

(It is preferable to do "chmod 4555")

作成後 fml, fml-ctl をroot しか書けない場所へインストール。

[解説]

fmlwrapper.c の内容は

	fml.plの場所   config.phのある場所   ライブラリの場所

を exec する C の program というだけのものです。ようするに include ファ
イルの中でやることと同じことを書きます。ちがうのは setuid() をするのが 
sendmail ではなくこの fmlwrapper.c であることだけです。

例： fmlwrapper.c

execl("/usr/local/fml/fml.pl", /* 本体 fml.pl はどこ？ */
      "(fml)", 
      "/var/spool/ml/Elena",   /* config.ph は どこ？ */
      "/usr/local/fml",        /* fml package の library はどこ？ */
      NULL);

fml-ctl-wrapper では
execl("/usr/local/fml/fml.pl", /* 本体 fml.pl はどこ？ */
      "(fml)", 
      "/var/spool/ml/Elena",   /* config.ph は どこ？ */
      "/usr/local/fml",        /* fml package の library はどこ？ */
      "--ctladdr",             /* --ctladdr == コマンドモード */
      NULL);

になります。listname-ctl の方には fml-ctl を設定します。

Appendix A.2	C wrapper program fml on 4.3BSD

:include: 構文が使えない時は、setuid された fml という C の wrapper
program を経由して

	/usr/local/fml/fml.pl $DIR $LIBDIR

を実行するという設定をします。makefml を使えば各メーリングリストごとに
専用の fmlwrapper.c が作成されています。その directory で

	% make fml 

とすると作成されます。fmlwrapper.c の中で fml.pl directory ... という形で呼ぶ
ようになってます。

Appendix B	:include: ファイル (fml.plの呼び方、引数の渡し方)

Appendix B.1	:include: ファイル (fml.plの呼び方、引数の渡し方)
See also: fml-uid 

fml の起動の仕方は

	fml.pl $DIR $LIBDIR

	$DIR	config.ph のある directory いわゆるMLのHOME
	$LIBDIR	library の path (必要なら)

の形です。このコマンドを起動して STDIN からメールを突っ込んで下さい。
つまり(PIPEで)

	| fml.pl $DIR $LIBDIR

ということです。これを sendmail にやらせるためには /etc/aliases 等に次
のように書きます。いろいろな書き方がありますが、それがちゃんと動くか否
かは sendmail の version に依存です。
例: Elena メーリングリストの場合

   [/etc/aliases]

	Elena: :include:/var/spool/ml/Elena/include
	owner-Elena: fukachan
	Elena-request: fukachan
	Elena-admin: fukachan

   [/var/spool/ml/Elena/include]

	"|/usr/local/fml/fml.pl /var/spool/ml/elena "

$DIR が "/var/spool/ml/elena" で $LIBDIR は特に指定しない場合です。こ
の場合 include するファイル の所有者のIDで fml.pl が起動され、sendmail 
は そのプロセス(fml.pl)(のSTDIN)へML宛のメールを渡します。/etc/aliases 
を読んで /var/spool/ml/Elena/include を読み込むんだと知り、そのファイ
ルの中身の "|/usr/local/fml/fml.pl /var/spool/ml/elena " が起動されこ
のプロセスのSTDINにメールは入力されます。

なお単純にこれだけではだめでおまじないが必要なOSもいろいろあります。
OS によるfml.plの呼び方の違い一覧は次の章を見て下さい。
See also: troubleshoot 10 


		INDEX

:include: ファイル                         ...   Appendix B.1 
fml                                        ...   Appendix A.1 Appendix A.2 
fmlwrapper.c                               ...   Appendix A.1 Appendix A.2 
