次のページ 前のページ 目次へ

4. メールを全て受け取った、次は?

外部アカウントを作り、メールアドレスも入手しました。さらにDNSエントリーと あなたのアカウントへのフォワードも済みました。ProcmailとFetchmailもインスト ールしました。さあいきましょう。

  1. ここで.procmailrcファイルを作る必要があります。これにはユーザーへの "配送"情報が含まれています。
  2. "nosuchuserfile"を作る必要があります。メールがちゃんと配達され ない時に送信者に知らせるためのものです。
  3. うまく動作させるため :) にメールチェック用にcrontabを使います。インターネット 上に接続されている時、数分ごとにメールをチェックするための簡単な方法です。

4.1 ".fetchmailrc"ファイルを作る

ここで.fetchmailrcを作ります。これにはユーザー名、パスワード、MDA (Mail Delivery Agent)の情報が含まれています。以下はサンプルファイルです。

(*** < file > *** text ***) .fetchmailrc

server my.mail.server.com
proto pop3
user myaccountthere
pass deepestsecrets
flush
mda /usr/bin/procmail

このファイルはメールを集めるために使われます。fetchmailプログラム "fetchmail -vv"(訳注:fetchmailのコントロールメッセージと メールサーバのエコーを表示します)を使ってテストしてみて下さい。 メールが正しく配送されるかどうかも見てみて下さい。 いくつかエラーがあるかもしれません。というのもprocmailコントロールファイル がまだ作られていないからです。procmailrcファイル を作るまでテストをしなくてもよいのですが、逆にここでテストしておけば原因 がprocmailrcファイルではないことはわかります。またprocmailrcファイルはユーザー がオーナーとなるようにしておきましょう。著者の"mailservice"の場合 は、ユーザー読み込み可にしてグループ/外部に読み込みは許可しないようにして います。(訳注:メールをプロバイダから受信するための)メインパスワードが書かれ ているからです(だからchmod 600 .fetchmailrcとしています)。

4.2 ".procmailrc"ファイルを作る

これはシステム上のユーザーにメールを転送するためのコントロールファイルです。 上記したように2つの方法があります。メールヘッダの"to:"を 使う方法と、"subject"を使う方法です。 ファイルには配送するユーザーが含まれています。"#"はコメント 文で必要ないならいりません。同様にchmodコマンドでパーミッションを600にします (訳注:chmod 600 .procmailrc)。その他のグループついてはこれらの プライベートアドレスは必要ありません :) ...。"nosuchuserfile"は、procmailrc ファイルにないユーザー宛ての場合、送信者に戻すメールに添付されます。これにより 送信者にメールが配送できない旨を知らせます。

"ヘッダ(to:)"による配送

(*** < file > *** text ***) .procmailrc

# (この行はデバッグのためのものです!メールサーバを通った全てのメール
# を読めるようにするために削除しておいて下さい。
# 全てのメールはユーザーに送る前に"passtrough"ファイルにコピーされます。
# このファイルを読んで何が悪いのかわかります)
:0 c
       passtrough

# (ヘッダが"to: freaker@mydom.com"のメールは直接私のところまでフォワード
# されます。他のメールはこのオプションにはかかりません)
:0 
* ^To:.*freaker@mydom.com
! freaker

# root@mydom.com宛てのメールはrootにフォワードされます。postmasterも同様。
:0 
* ^To:.*root@mydom.com
! root

:0 
* ^To:.*postmaster@mydom.com
! postmaster

# barbara@mydom.com宛てのメールはbarbaraにフォワードされ、プライベート
# メールアドレスにフォワードされます。
:0 c
* ^To:.*barbara@mydom.com
! barbara@her.private.one

:0 
* ^To:.*barbara@mydom.com
! barbara

#
# この行では上記のユーザー宛てのメールがない場合、センダーにメールを戻します。
# またリプライ用に"nosuchuser"ファイルをメールの本文に追加します。
# 注意!"nosuchuser"ファイルを作る必要があります。- 以下のようなテキスト
# を作っておいて下さい。
# 「あなたがメールを届けたいユーザーはこのサーバ上にはいません。もう一度
# やり直して下さい。どこにもいないユーザーかもしれません」
:0
  |(/usr/bin/formail -r -k \
     -A"X-loop: mailservice@mydomain.dom "| \
       /usr/bin/gawk '{print }\
       /^/ && !HEADER \
         { system("/bin/cat nosuchuser"); \
         print"--" ;\
         HEADER=1 }' ) |\
         /usr/bin/sendmail -t


exit

訳注1:formail:メールをmailboxフォーマットに変換するフィルタコマンド。 X-loop:の箇所は適当に変更します。またnosuchuserファイルは.procmailrc ファイルと同じディレクトリにおきます。また* ^To:. 行にコメントを付けると ちゃんと振り分けられないことがあります)。

訳注2:このフッタ処理の簡単な解説。

"subject: touser"による配送

(*** < file > *** text ***) .procmailrc

# (この行はデバッグのためのものです!メールサーバを通った全てのメール
# を読めるようにするために削除しておいて下さい。
# 全てのメールはユーザーに送る前に"passtrough"ファイルにコピーされます。
# このファイルを読んで何が悪いのかわかります)
:0 c
        passtrough

# ヘッダが"to: freaker@ibm.net"のメールは直接私に転送されます。
# その他のメールはこのオプションをパスします。
# "dedicated"メールアドレスを"mailservice thingy's"で受信する
# 時はこの行を使う必要はありません :)
:0 
* ^To:.*freaker@ibm.net
! freaker

# subject "root"のメールは全てrootに転送。
:0
* ^Subject:.root
! root

# "subject: barbara"のメールは全てbarbaraに転送。
:0
* ^Subject:.barbara
! barbara

# "subject: paul"のメールは全てpaulの外部メールアドレスへ転送。
:0
* ^Subject:.paul
! paul@his.personal.emailaddress

# "subject: john"のメールは全てサーバ上の彼のアカウントに転送され
# コピーがプライベートメールアドレスに行く。
:0 c
* ^Subject:.john
! john@his.personal.emailaddress

:0 
* ^Subject:.john
! john

# IBMからのメール(updateや情報など)は全てfreakerに。メールサービスを管理する
# 人です。IBMはメールが戻ってくることを望んでいません!! もしあなたの
# メールプロバイダが"newsletters"等を送ってくる場合に必要です。
:0
* ^From:.*newsletter@ibm.net
! freaker

# デーモンからの全メッセージは捨てられました。わたしの場合はファイルに保存され
# ます。(奈落の底に捨てるには/dev/nullを使う)

:0
* ^FROM_DAEMON
throwaway

# この行では上記のユーザー宛てのメールがない場合、センダーにメールを戻します。
# またリプライ用に"nosuchuser"ファイルをメールの本文に追加します。
# 注意!そのようなファイルを作る必要があります。- mine に以下のようなテキスト
# 「subject行にユーザー名が書かれていません。ユーザー宛てにメールを送る時は
# "Subject: user" とヘッダに書いて送って下さい。例えば"subject: freaker"では
# freakerにメールが送られます」。ファイルは長くも短くもできます  :) ... 
# "mailservice@mydomain.dom"はあなたのサーバと他のサーバのあいだをループして
# います。正しいメールアドレスを使って下さい!
# "don't spend 500$ at your ..."といったようなsubjectではエンドレスループ
# を作ってしまいます。

:0
  |(/usr/bin/formail -r -k \
     -A"X-loop: mailservice@mydomain.dom "| \
       /usr/bin/gawk '{print }\
       /^/ && !HEADER \
         { system("/bin/cat nosuchuser"); \
         print"--" ;\
         HEADER=1 }' ) |\
         /usr/bin/sendmail -t

exit

4.3 "nosuchuserfile"

(*** < file > *** text ***) nosuchuser

The user you wanted to contact is not present at this system.

Please use the subject line as recipient - example "subject: freaker" would
send mail to freaker on this system.

 ------------------------------------------------------------------
(日本語例)
連絡を取りたいユーザーはこのシステムにはいません。
受け取り人をsubjectに書いてください。
例えば"subject: freaker"とすればfreakerにメールが届きます。

4.4 crontabファイル

もしcrontabの動かし方を知らないなら :)適当なマニュアルを読んで下さい :) ...。 ここで"checkmail"ファイルを作る必要があります。接続されたときに 設定ファイルと同じように調べるものです。著者はPPP接続をしていますので PPP接続がつながったときの見方について例を挙げています。そして10分毎にcronを 使って送りだしています。これはなんだかいい加減なものに思われるかもしれません が決してそんなことはありません!

checkformail

ここで.checkformailファイル(実行属性にしておきます)が呼ばれ、PPP接続 されている時は探します。接続されればメールを受信することができます。crontabは 以下のcronエントリーを使った時にこのファイルを使います。

(*** < file > *** code ***) .checkformail

#!/bin/sh
#

        cd /home/mailservice

        if [ -f /var/run/ppp0.pid ]; then
        /usr/local/bin/fetchmail -s > /dev/null 2>&1
fi

[訳注:/home/mailserviceに移動して、 /var/run/ppp0.pidがある場合(PPP接続されている場合)fetchmailを 実行します。ロックファイルは/var/lockディレクトリにあり、例えば PPP接続が確立されていると:
        /var/lock/LCK..ttyS0:
        中身    0000019881

        /var/run/ppp0.pid:
        中身    19881
となります。"2>&1" はエラー(出力ストリーム番号2)を 通常の出力(出力ストリーム番号1)に送ることを意味しています。fetchmail の -s オプションはサイレントモードです]

crontab

cronエントリーファイルはcrontabにロードされる必要があり、ここでは 10分ごとに.checkformailを呼び出すようにします。コンソール上には何の 情報も表示しません(/dev/nullにリダイレクトしているからです)。

(*** < file > *** text ***) cronentry

0,10,20,30,40,50 * * * *  /home/mailservice/.checkformail 1> /dev/null 2> /dev/null

4.5 管理者側での設定

"方法A"を使う時は管理者側のサイトで設定しなければいけません。 電子メールはちゃんとしたドメインから出ていきます。とてもシンプルです。 いったんこうしてしまえばこの方法で猛烈に動いてくれるでしょう。またシステム 管理者がもっと他の方法をつかっているなら"方法A"などいらないし、 あなた側で設定する必要もありません!!!!

sendmailの新しいバージョンを使う時は"古いsendmail"トリックは 多分動作しないでしょう。メールルーティングを動作させるために "新しいsendmail"を参照して下さい。

(古いsendmail)sendmail.cfへの行追加

以下の行を/etc/sendmail.cfに追加して下さい。ドメインファイルが読まれ ます。下では"ruleset 98"とコメントが書かれています。というのも いったんエラーが出たら何が悪いのか見つけるのに一苦労するからです(そしてそれを 著者は知っています :) DuH)。

(*** < file > *** add ***) /etc/sendmail.cf

# 操作ドメインのデータベース

Kmaildomains btree /etc/maildomains.db

# これらの行を追加 *IN* Ruleset 98 ! (under Ruleset 98).

R$+ < @ $+  . >              $: $1 < @ $2 > .
R$+ < @ $+ > $*              $: $(maildomains $1@$2 $: $1 < @ $2 > $3 $)
R$+ < @ $+ > $*              $: $(maildomains $2 $: $1 < # $2 > $3 $)
R$+ < @ $* > .               $: $1 < @ $2 . >

(新しいsendmail)sendmail.cfへの行追加

新しいsendmailリリース(sendmail v8.8.7, 8.8.8でテストしました)では、 方法Aは無視して以下の行を追加します...

(*** < file > *** add ***) /etc/sendmail.cf

# Database of handled domains

Fw/etc/sendmail.cw
Kvirtuser btree /etc/maildomains.db

あるいは(上のディレクトリ以外の場所に置いている時は):

Fw/yourhomedir/sendmail.cw
Kvirtuser btree /yourhomedir/maildomains.db

(新しいsendmail)/etc/sendmail.cwあるいは/yourdir/sendmail.cwファイルの編集

sendmail.cwファイルを他の場所に置いてつかっている時は"/etc/sendmail.cw" を"/yourhomedirectory/sendmail.cw"に置き換えて読んでいって下さい。

このファイルは常に存在していて作る必要はありません。もしすでにあれば 古いデータを上書きしないようにして下さい。

はじめに/etc/sendmail.cwファイルを作ります。

(*** < file > *** text ***) /etc/sendmail.cw

mydomain.dom            mailservice

/etc/maildomainsファイルを作る

はじめに/etc/maildomainsファイルを作ります。特定のユーザーに送る。例として、 [もうご存知のように"mailservice"の箇所は好きなものにして下 さい。ここにあなたのログイン名を書いてもかまいません(著者の場合はfreaker (フリーク)]としています。

古いsendmailバージョン:

(*** < file > *** text ***) /etc/maildomains

mydomain.dom            mailservice

新しいsendmailバージョン:

(*** < file > *** text ***) /etc/maildomains

@mydomain.dom           mailservice

動作させてみましょう!

sendmailの古い/新しいバージョンいずれにおいてもbtree(データベース)ファイル を作る必要があります。以下のようにして下さい。

cd /etc    (or /yourhomedir)
makemap btree maildomains < maildomains
(訳注:makemapはsendmail用のデータベースマップを作るコマンドです。その他 オプションについてはmakemap(8)を参照)

この後、sendmailデーモンをkillして再度開始します。これで動作しました。 good luck :)


次のページ 前のページ 目次へ