Linux Mail-Queue mini-HOWTO Leif Erlingsson, leif@lege.com, Jan P Tietze, jpti- etze@mail.hh.provi.de v2.02, 03 September 1997, sendmail 8.8.7 伊佐治 哲, isaji@mxu.meshnet.or.jp 2 Feb 1998 Queue Remote Mail + Deliver Local Mailについて。この文書はSendmailでロ ーカルメールの配送をするために必要な設定の変更について書かれていま す。"指示する"までキュー(Queue)にリモートメールを蓄えておきます。 ______________________________________________________________________ 目次 1. イントロダクション 2. ダイアルオンデマンドを使わない解決 2.1 sendmailのスタート 2.2 sendmailの設定 2.2.1 ちょっとした設定のためにsendmail.cfを直接設定する 2.2.2 m4ソースを使ってsendmailを設定する 2.3 メニューサポートの提案 3. ダイアルオンデマンドによる解決 3.1 sendmail.cfの設定 3.1.1 ちょっとした設定をするためにsendmail.cfを直接設定する。 3.1.2 m4ソースを使ってsendmail.cfを設定する 3.2 ダイアル遅延の追加 3.2.1 sendmail.cfの設定 3.2.2 m4を使ったsendmail.cfの設定 4. e-mailの配送 4.1 特定の時間にメールを配送するには? ______________________________________________________________________ 1. イントロダクション このドキュメントは共著で書かれています。ダイアルオンデマンドを使わない 解決法については(古いものは) Leif Erlingsson によって書かれ、新しいダイアルオンデマンドの解決法は Jan P Tietze によって書かれました。 2. ダイアルオンデマンドを使わない解決 Written by Leif Erlingsson . このパートのオリジナルバージョンでは不必要なものもたくさん含まれていま した。これはそれも取り上げたものです...。 2.1. sendmailのスタート Slackwareなど: /etc/rc.d/rc.M: echo "Starting sendmail daemon (/usr/sbin/sendmail -bd -os) [queue only mode]..." /usr/sbin/sendmail -bd -os # NOT "-bd -q 15m", the "standard" flags! [参考 Slackware default) ______________________________________________________________________ /etc/rc.d/rc.M: # Start the sendmail daemon: if [ -x /usr/sbin/sendmail ]; then echo "Starting sendmail daemon (/usr/sbin/sendmail -bd -q 15m)..." /usr/sbin/sendmail -bd -q 15m fi ______________________________________________________________________ man sendmail: -q[time] 指示された間隔でキュー(var/spool/mqueue)に保存したメッセージを処 理します。時間が省略されると一度だけキューを処理しま す。timeは`s'が秒、`m'が分、`h'が時間、`d'が日、`w'が週をあらわ しています。例えば`-q1h30m' や`-q90m'はタイムアウトを1時間30分に 設定します。時間になるとsendmailはバックグランドで実行されます。 このオプションは-bdとともに使ったほうが安全です。 -bd デーモンとして実行します。これはBerkeley IPCを必要としま す。sendmailはSMTP 接続用のsocket 25(/etc/services)にリストされ ていてバックグランドでフォークし実行されます。 ] RedHatなど: /etc/rc.d/init.d/sendmail.init: echo -n "Starting sendmail: [queue only mode]" daemon sendmail -bd -os # NOT daemon sendmail -bd -q1h -osは基本的なものではありません。このオプションは: スーパーセーフ [s] これを付けていればと安全です。例えば、キュー ファイルを直接配送しようとする時でも常に呼び出します。sendmailはある環境 でクライアントをコントロールする前に常にキューファイルを呼び出します。これは 常にセットされています。 これはデフォルトのsendmail.cfで常に設定されています。 [参考:man sendmail oオプション これをセットしていると、メッセージは古いスタイルのヘッダも処理で きるようになります。セットしていないとメッセージは新しいスタイル のヘッダだけ保証されます (例えばアドレス間のスペースの代わりにコ ンマを使うなど)。セットしてあると適当なアルゴリズムがヘッダフォ ーマットを多くのケースで正しく決定するように使われます。 sオプション 全く必要ない環境下でもキューファイルを常に呼び出します。これは配 送中のシステムクラッシュに対しても安全です。 ] 2.2. sendmailの設定 まじめなsendmailユーザーは設定を行うためにm4ソースを使います。 sendmailをアップグレードしたり、ささいなsendmail.cfの変更以外ならなん でもこの方法を行うことをお奨めします。 IPなどを動的ダイアルにしたいけれど、sendmailでの解決はしたくなくリター ンヘッダなどで動作させる場合はm4ソースを使う必要はありません。 2.2.1. ちょっとした設定のためにsendmail.cfを直接設定する この方法はきわめてsendmail.cfバージョンに対して依存しています。以下の 方法はsendmail-8.8.xのみで有効です。 /etc/sendmail.cfの編集: # avoid connecting to "expensive" mailers on initial submission? O HoldExpensive=True 後半 .... ##### @(#)smtp.m4 8.33 (Berkeley) 7/9/96 ##### Msmtp, P=[IPC], F=mDFMuXe, S=11/31, R=21, E=\r\n, L=990, T=DNS/RFC822/SMTP, A=IPC $h Mesmtp, P=[IPC], F=mDFMuXae, S=11/31, R=21, E=\r\n, L=990, T=DNS/RFC822/SMTP, A=IPC $h Msmtp8, P=[IPC], F=mDFMuX8e, S=11/31, R=21, E=\r\n, L=990, T=DNS/RFC822/SMTP, A=IPC $h Mrelay, P=[IPC], F=mDFMuXa8e, S=11/31, R=61, E=\r\n, L=2040, T=DNS/RFC822/SMTP, A=IPC $h 上で大切なフラグ(訳注:F=の箇所)は"e"です。あなたのファイルで他のフラ グがあっても気にしないで下さい。フラグはそのままにして、"e"がない時に 限り上の例のようにフラグ"e"のみを追加して下さい。 "e"は"expensive"とし てメーラーを示しています。 2.2.2. m4ソースを使ってsendmailを設定する 以下簡単にするためにsendmailのバージョンは8.8.7であるとします。もし違 うバージョンを使うなら8.8.7をそのバージョンに置き換えて読んでいってく ださい。また命令はsendmailの古いバージョンでは実行できません。最新 のsendmailを入手して下さい! sendmailソースは http://WWW.Sendmail.ORG かできれば ftp://ftp.sendmail.org でダウンロードして下さい。 私のパッチを入手することもお奨めします。エンベロープセンダーが逆エイリ アスするようにしたパッチと、その他メール環境を経由してコントロールでき るようにするスタッフがあります。 sendmailバージョンが8.8.7なら: Sendmail Patch 宛てにSubjectを Subject:sendmail-8.8.7 としてメールを送って下さい[訳注:本文には特に何も書きません。メールを 送ると折り返しMIMEメールで送られてきます。MIMEで送られてくるものは xaliases-2.0.tar.gz, sendmail-8.8.7-cf-cpio-idcmu.gzです)]。こ のmini-HOWTOのsgmlソースについては http://www.lege.com からも入手できます。 「Queue Remote Mail + Deliver Local Mail」を動作させるために著者のパッ チを使わないで下さい。パッチはその他のことを解決するためのものです。で すが多くのLinuxユーザーがこのパッチが役立つものであると気づくように言 うのはよいと思います。このパッチは仮想ドメインを動作させます。仮想ドメ インは「ローカル」であるべきではありません。xaliasesあるいは言い換えて 逆エイリアス(reverse aliasing)を与えるものです。 sendmailソースを展開すると /usr/src/sendmail-8.8.7/ ディレクトリができます。 /usr/src/sendmail-8.8.7/cfに移動して下さい。 必要ならパッチを当てて次のステップに進んで下さい。LDA(Local Delivery Agent) としてprocmailを使わないならパッチをあてず、作業を行う前に /usr/src/sendmail-8.8.7/cf/ostype/linux.m4 を保存しておいて下さい。パッチは /tmp/sendmail-8.8.7-cf-cpio-idcmu.gz に保存して cd /usr/src/sendmail-8.8.7/cf gzip -dc < /tmp/sendmail-8.8.7-cf-cpio-idcmu.gz | cpio -idcmu とします。 procmailを使わない場合は /usr/src/sendmail-8.8.7/cf/ostype/linux.m4 の保存したコピーを元通りに書き戻して下さい。パッチをあてていなくてもこ れらの行を確認して、 /usr/src/sendmail-8.8.7/cf/cf/yourhostname.smtp.mc に同じものがあてられているのを確認します。 (しかしパッチを当てるな ら/usr/src/sendmail-8.8.7/cf 以下の"elijah"を含むファイル名を調べてみ て下さい): dnl # Defer Delivery to "expensive" mailers until next time the dnl # queue is processed using "O HoldExpensive=True" and make dnl # sure smtp mailers are "expensive". dnl # (See original "sendmail" book Chapter 30: Options, dnl # "Oc - Don't connect to expensive mailers", or dnl # 2nd Edition "sendmail" book Chapter 34.8.29, dnl # "HoldExpensive (c), Queue for expensive mailers".) dnl # / Leif Erlingsson define(`confCON_EXPENSIVE', `True') define(SMTP_MAILER_FLAGS, e) MAILER(local)dnl MAILER(smtp)dnl 2.3. メニューサポートの提案 このドキュメントのバージョン 1.x では /var/X11R6/lib/fvwm/system.fvwmrc に関する(訳注:ヴィンドウマネージャの)メニューサポートの提案も含まれて いました。現在のバージョンではこれはなくしましたが、必要なら取り寄せる こともできます: メールの Subject: に Menu support suggestions と書いて Menu support suggestions 宛てに送って下さい(訳注:本文には何も書きません。メールを送ると折り返 しMIMEメールで送られてきます)。 3. ダイアルオンデマンドによる解決 Written by Jan P Tietze . 多くのLinuxユーザーはダイアルアップ回線を使ってインターネットに接続し ています。またシステム上にダイアルオンデマンド(dial-on-demand)の機能を 実装しています。つまり、ある種類のIPパケットがローカルネットワーク/ロ ーカルホストを出る時はいつでも、ISP(Internet Service Provider)へのリン クが自動的に確立されるということです。パケットが無くなるとリンクはダウ ンします。 これは快適で有効なものですが、もしかしたら快適でもなく(古いモデムでの ダイアルアップが著しく)有効ではないこともあります。これは電子メールを 送ります。電子メールは一般にあなたのシステムによって配送されるかインタ ーネット上のSMTPホストを経由してSMTPによって配送されます。普通インター ネット上の SMTPホストはISPのネットワークにあります。 ダイアルアップ回線ではメッセージを送る時は常にリンクされていなければな りません。これはひとつのメッセージを送るだけならいいのですが、複数の メッセージを書いて送る時は何度も回線に接続しなくてはならず面倒で手間の かかることです。またISPが許可しているログイン時間(訳注:例えば UUCPで 1日に1回接続するなど)を制限している場合は、1日のある時間しかメッセ ージを送信できません。そして後からメールを手動で送らなければなりませ ん。 このドキュメントの``ダイアルオンデマンドを使わない解決'' でこの状況を 解決していますが、外部DNSがリンクアップしている状況では、リンクは電子 メールがキューにある場合でさえも確立されます。理由はsendmailがhost名を 基準化("canonify")しようとするからです。 この問題に対する解決法は2つあります。sendmail.cfを適当に変更して実際 のメール配送のプロセスを定義することです。個人的にはcronを使ってジョブ 管理をさせています。以下必要な変更を説明していきます。 3.1. sendmail.cfの設定 ``sendmailの設定''で書かれた理由もあり、sendmail.cfを直接編集するかわ りにm4ソースを修正することをお奨めします。m4ソースを使えば多くの困難や 設定変更の冗長さから救われます。 はじめに、このドキュメントのはじめで記述した変更を行います。そしてダイ アルオンデマンドの特定のスタッフを調べます。 3.1.1. ちょっとした設定をするためにsendmail.cfを直接設定する。 じかに設定することはあまり実際的ではなく冗長です。しかしこれはあなた次 第です。 sendmail.cfの終りあたりの行で: R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4 とあります。"#"を行頭に置きます: #R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4 3.1.2. m4ソースを使ってsendmail.cfを設定する 以下の行を/usr/src/sendmail-8.8.7/cf/cf/yourhostname.smtp.mcに追加しま す: FEATURE(nocanonify)dnl 最終のsendmail.cfは以下のコマンドを実行して起動します。新しいものをイ ンストールする前に古い/etc/sendmail.cfを保存しておいて下さい: cp /etc/sendmail.cf /etc/sendmail.cf.bak cd /usr/src/sendmail-8.8.7/cf/cf m4 yourhostname.smtp.mc > /etc/sendmail.cf 3.2. ダイアル遅延の追加 場合によっては便利です。特にモデム回線を使っているときはダイアル遅延を インストールしておきましょう。これはsendmailが電子メールを送ろう(これ は回線の接続を意味します)として接続を開始するけれど、sendmailでタイム アウトする時間よりもリンク接続の確立のほうに時間がかかるといった場 合、sendmailは数秒待ってから接続を試みます。 3.2.1. sendmail.cfの設定 sendmail.cfのどこかに以下の行があります #O DialDelay=10s "#"を削除します。行頭に"#"がない場合は問題ありません(以前この行を有効 にしていたというだけです)。 [訳注:Slackwareパッケージなどでは /usr/src/sendmail ディレクトリにREADME.linux, *.cfファイルがあります] sendmail.cfにこの行がない場合は以下の行を追加しておいて下さい(ファイル の "option(オプション)"パートに追加しておくとよいでしょう)。 O DialDelay=10s "10s"の部分を適当な秒数に変更します。 3.2.2. m4を使ったsendmail.cfの設定 /usr/src/sendmail-8.8.7/cf/cf/yourhostname.smtp.mc に以下の行を追加します: define(`confDIAL_DELAY',`10s') ここで"10s"の部分を適当な秒数に変更します。 最終的なsendmail.cfは以下のコマンドを実行して構築できます。新しいもの をインストールする前に古い/etc/sendmail.cfを保存しておいて下さい: cp /etc/sendmail.cf /etc/sendmail.cf.bak cd /usr/src/sendmail-8.8.7/cf/cf m4 yourhostname.smtp.mc > /etc/sendmail.cf 4. e-mailの配送 電子メールの配送は"sendmail -q"コマンドを実行することで行われま す。sendmailが行っていることに興味がある人は "sendmail -q -v"とすれば 配送プロセスの経過を表示してくれます。 [-vオプションを付けてsendmailを実行すると、 Running RAA18307 (sequence 1 of 3) ... Connecting to mail.server.or.jp. via smtp... 220 sv220.tk.mmm.ad.jp ESMTP Sendmail 8.8.4+2.7Wbeta4/3.5Wpl1-97120410; Thu >>> EHLO your.server.name.jp 250-sv220.tk.mmm.ad.jp Hello city1DU22.mmm.ad.jp [000.000.000.000], ple 250-8BITMIME 250-SIZE 250-DSN 250-ONEX 250-ETRN 250-XUSR 250 HELP >>> MAIL From: SIZE=5 250 ... Sender ok >>> RCPT To: 250 ... Recipient ok >>> DATA 354 Enter mail, end with "." on a line by itself >>> . 250 RAA15115 Message accepted for delivery ... Sent (RAA15115 Message accepted for delivery) といったメッセージが出力されます。cronで実行されると出力結果などがメー ルで送信されるので確認などできます。 メールがロックされて"sendmail -q -v"としても送信されないケースがありま す。これは、/etc/rc.d/rc.Mで設定している sendmailに-qオプションを設定 していたり、メーラでbodyを書いている時に"sendmail -q"が実行されロック されるなど原因は様々です。何かよい解決方法があれば教えて下さい。 /var/spool/mqueue以下にメールはキューされています。そのファイルの中で サイズが0byteのものがあるとそのメールはロックされています。送信されな いメールは1週間すると送信者にリターンされます。 /var/spool/mqueue以下 のメールファイルで、頭2文字が qfのものはヘッダファイル、dfのもの はbody、xfはロックされている時にあるファイルです。頭2文字以下の名前 はMessage Idなどで表示されるものです] メール配送のプロセスを自動化することは簡単です。これにはcronを使いま す。 4.1. 特定の時間にメールを配送するには? crontabを編集します: crontab -e 以下のフォームを追加します: 05 18-23,0-7 * * Mon,Tue,Wed,Thu,Fri /usr/sbin/sendmail -q 05 * * * Sat,Sun /usr/sbin/sendmail -q 詳細についてはcrontabのmanページを参照してください ("man 5 crontab"で 参照できます)。フォーマットはもう明らかです。上で書かれたcrontabエント リの例では、(メールがキューにある時のみ)メールを各曜日の各時間5分後(午 後6:05にスタートし午前7:05にストップ)に送信します。また週末には各時 間5分後にメールが配送されます(土曜日の午後12:05にスタートし日曜日の午 後11:05にストップ)。 ダイアルオンデマンドユーザーとして、特定の時間にPOP3プロトコル経由でメ ールを受信したいと思うことがあります。そこで以下のエントリを同じよう にcrontabに追加します。 0 21 * * * popclient -3 -u <あなたのPOP3ユーザー名> -p <あなたのパスワード> -o /var/spool/mail/<受信したメールを受けるシステム上のユーザー名> もちろんこれは一行で書かれます。ファイルに保存しエディタを終了させま す。 crontabはこれでインストールされます(訳注:popclientを使うより もfetchmail などを使ったほうがセキュリティ上よいと思います)。 [訳者:伊佐冶 哲, isaji@mxu.meshnet.or.jp 訳文に関する間違い、不明な点があればご連絡下さい。]