外部アカウントを作り、メールアドレスも入手しました。さらにDNSエントリーと あなたのアカウントへのフォワードも済みました。ProcmailとFetchmailもインスト ールしました。さあいきましょう。
.procmailrc
ファイルを作る必要があります。これにはユーザーへの
"配送"情報が含まれています。
ここで.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
としています)。
これはシステム上のユーザーにメールを転送するためのコントロールファイルです。
上記したように2つの方法があります。メールヘッダの"to:"を
使う方法と、"subject"を使う方法です。
ファイルには配送するユーザーが含まれています。"#"はコメント
文で必要ないならいりません。同様にchmodコマンドでパーミッションを600にします
(訳注:chmod 600 .procmailrc
)。その他のグループついてはこれらの
プライベートアドレスは必要ありません :) ...。"nosuchuserfile"は、procmailrc
ファイルにないユーザー宛ての場合、送信者に戻すメールに添付されます。これにより
送信者にメールが配送できない旨を知らせます。
(*** < 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:このフッタ処理の簡単な解説。
|(/usr/bin/formail -r -k -A"X-loop: mailservice@mydomain.dom"
formailコマンドで
-r:自動返信用のヘッダを作る。Errors-To: あるいは From: のアドレス を To: に指定します。 -k:自動返信用のヘッダを作る時、引用符を付けて本文をキープします。 -A:指定したヘッダフィールドをヘッダに追加します。 この場合"X-loop: mailservice@mydomain.dom "を追加します。としています。これを以下のawk処理にパイプします。
|/usr/bin/gawk '{print }/^/ && !HEADER { system("/bin/cat nosuchuser");print"--" ;HEADER=1 }')
awkコマンドによるメール処理。nosuchuserファイルの挿入。
{print }/^/ && !HEADER { system("/bin/cat nosuchuser"); print"--" ; HEADER=1 }まず頭の一行を表示。
HEADER=0
(デフォルト値)の時はnosuchuserファイルを
挿入してHEADER=1
とします(以下この{..}内の処理は実行されず、メール
ファイルをprint
していくだけです)。
以上の処理をまとめるとリプライメールは以下のようになります:
To: MAIL_ERR@hoge.ac.jp <== このアドレスは Errors-To: のもの メールエラー <== ここからnosuchuserファイル (連絡を取りたいユーザーはこのシステムにはいません。 受け取り人をsubjectに書いてください。 例えば"subject: freaker"とすればfreakerにメールが届きます) <== ここまでがnosuchuser -- <== awk処理の print"--" ; の箇所。 Subject: Re: hello References: <199710141701.CAA06199@dokoka.co.jp> In-Reply-To: <199710142352.IAA27235@dokoka.co.jp> X-loop: mailservice@mydomain.dom >こんにちは。このアドレスでいいのかな? >
| /usr/bin/sendmail -t
以上の処理をしたメールを送ります。
-t
オプションは、To:, Cc:, Bcc:
行を受取人アドレスにスキャンします。
つまりメッセージヘッダにリストされていてもコピーは受信しません。
(*** < 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
(*** < 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にメールが届きます。
もしcrontabの動かし方を知らないなら :)適当なマニュアルを読んで下さい :) ...。 ここで"checkmail"ファイルを作る必要があります。接続されたときに 設定ファイルと同じように調べるものです。著者はPPP接続をしていますので PPP接続がつながったときの見方について例を挙げています。そして10分毎にcronを 使って送りだしています。これはなんだかいい加減なものに思われるかもしれません が決してそんなことはありません!
ここで.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
オプションはサイレントモードです]
cronエントリーファイルはcrontabにロードされる必要があり、ここでは
10分ごとに.checkformail
を呼び出すようにします。コンソール上には何の
情報も表示しません(/dev/null
にリダイレクトしているからです)。
(*** < file > *** text ***) cronentry
0,10,20,30,40,50 * * * * /home/mailservice/.checkformail 1> /dev/null 2> /dev/null
"方法A"を使う時は管理者側のサイトで設定しなければいけません。 電子メールはちゃんとしたドメインから出ていきます。とてもシンプルです。 いったんこうしてしまえばこの方法で猛烈に動いてくれるでしょう。またシステム 管理者がもっと他の方法をつかっているなら"方法A"などいらないし、 あなた側で設定する必要もありません!!!!
sendmailの新しいバージョンを使う時は"古いsendmail"トリックは 多分動作しないでしょう。メールルーティングを動作させるために "新しいsendmail"を参照して下さい。
以下の行を/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 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.cwファイルを他の場所に置いてつかっている時は"/etc/sendmail.cw" を"/yourhomedirectory/sendmail.cw"に置き換えて読んでいって下さい。
このファイルは常に存在していて作る必要はありません。もしすでにあれば 古いデータを上書きしないようにして下さい。
はじめに/etc/sendmail.cwファイルを作ります。
(*** < file > *** text ***) /etc/sendmail.cw
mydomain.dom mailservice
はじめに/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 :)