このページではLinux構築した自宅サーバーで使用するSendmailでの、virtusertableによるメールの振分けについて初心者向けに解説します。
お便利サーバー.com+相互リンクサイト内をキーワードで検索
Sendmailの設定

Sendmailについて

Sendmailのファイル構成

sendmail.mcの編集と設定

sendmail.cfの作成

受信するホスト名の設定

ホスト名毎のメールの振分け

メール転送設定の使い分け

受信/転送に関する設定

Sendmailのコントロール

連携するアプリケーション等


"virtusertable"によるホスト名ごとのメールボックス振分け

Sendmail の利用で、 "local-host-names" の記述 受信するホスト名の設定 だけで自 ホスト 宛のメールアドレスを設定した場合、ちょっと困ることがあります。

それは、例えば "tanaka@obenri.com" "tanaka@mail.obenri.com" "tanaka@ugegege.com" など、 アカウント の部分が "tanaka" であるメールアドレス宛のメールデータは、メールアドレスとしてはすべて異なるにも係わらず、ひとつのメールボックス "/var/spool/mail/tanaka" に書き込まれることです。

これらのメールアドレスの利用者がすべて同じ人であれば良いのですが、それぞれのユーザーが別人である場合はちょっと困ったことになります。

もしもアカウント名にこだわりがなければ、例えばユーザーアカウントを、 "t_tanaka" "s_tanaka" のように別々に作成して、メールアドレスごと別にしてしまうという強引な方法もあります。

しかし普遍的なメールアドレスの場合、例えば、 "webmaster@obenri.com" を既にあなたが使っているとすると、 "webmaster@ugegege.com" は別の人に使わせることができなくなってしまうことになります。

こういう場合に役に立つのが、 "/etc/mail/virtusertable" によるメールデータの振分け機能です。

"/etc/mail/virtusertable"は"local-host-names"の設定によって「自ホスト宛」と判断したメールアドレスを検査し、特定のアカウントのメールボックスに書き込む仕組みを提供するもので、 サブドメイン や異なる ドメイン名 をひとつのSendmailで扱うときに、上のような不具合を解消します。

以下に、その使用方法について説明します。

関連セクションへ 関連セクション・ メールサーバーの構築

"/etc/mail/virtusertable"の編集とデーベースの作成

まず、 サブネット 内の適当な クライアント機 から SSHクライアント 構築中のLinuxサーバー ログイン します SSHクライアントでサーバーに接続する(WBEL3) SSHクライアントでサーバーに接続する(CentOS3) SSHクライアントでサーバーに接続する(WBEL4) SSHクライアントでサーバーに接続する(CentOS4) SSHクライアントでサーバーに接続する(CentOS5)

最初は"virtusertable"には何も記述されていないので、実際にバックアップをとる必要があるのは二度目以降の編集からになります。

それから su コマンドで アカウント "root" に変更し、 cp コマンドでバックアップを作成した後、 nano エディタで "/etc/mail/virtusertable" を開きます nanoエディタでファイルを開く

[tanaka@web1 ~]$ su -Enter
Password: "root"のパスワードを入力します。 Enter
[root@web1 ~]# cp /etc/mail/virtusertable /etc/mail/virtusertable.orgEnter
[root@web1 ~]# nano /etc/mail/virtusertableEnter

デフォルト の"/etc/mail/virtusertable"には何の記述もありませんので、エディタの画面は空白になるはずです。

記述方法は以下のようになります。

[受信対象のメールアドレス] [書き込み先のアカウント]

一つの設定は一行で記述し、二つのパラメータの間は空白またはタブで区切ります。

例えば以下のように記述します。

webmaster@obenri.com    webmas_obenri
webmaster@ugegege.com    webmas_ugegege

この設定によって、 "webmaster@obenri.com" 宛てのメールは ユーザーアカウント "webmas_obenri" のメールボックスへ、 "webmaster@ugegege.com" 宛てのメールはユーザーアカウント "webmas_ugegege" のメールボックスへ書き込まれることになります。

記述が終わったら"/etc/mail/virtusertable"を保存し、nanoエディタを閉じます nanoエディタでファイルを閉じる

実は"/etc/mail/virtusertable"はそのままでは使えないので、 makemap コマンド を使ってこの テキストファイル バイナリ 形式の データベース "/etc/mail/virtusertable.db" に変換します。

[root@web1 ~]# makemap -v hash /etc/mail/virtusertable.db < /etc/mail/virtusertableEnter
key=`webmaster@obenri.com', val=`webmas_obenri'
key=`webmaster@ugegege.com', val=`webmas_ugegege'
[root@web1 ~]#

次に、 useradd コマンドで書き込み先のユーザーアカウントをそれぞれ作成します。 MUA で受信するためのパスワードも passwd コマンドで設定しておきましょう。

[root@web1 ~]# useradd webmas_obenriEnter
[root@web1 ~]# passwd webmas_obenriEnter
Changing password for user webmas_obenri.
New password: 新しいパスワードを入力します。Enter
Retype new password: もう一度新しいパスワードを入力します。 Enter
passwd: all authentication tokens updated successfully.
[root@web1 ~]# useradd webmas_ugegegeEnter
[root@web1 ~]# passwd webmas_ugegegeEnter
Changing password for user webmas_ugegege.
New password: 新しいパスワードを入力します。Enter
Retype new password: もう一度新しいパスワードを入力します。 Enter
passwd: all authentication tokens updated successfully.
[root@web1 ~]#

以上で設定は終わりです。

この場合、メールアドレス "webmaster@obenri.com" を利用するユーザーのMUAの設定パラメータは以下のようになります。

メールアドレス: webmaster@obenri.com

受信メールサーバー(POP3): mail.obenri.com

送信メールサーバー(SMTP): mail.obenri.com

アカウント名またはユーザー名: webmas_obenri

パスワード: web1.obenri.comシステム上のwebmas_obenriのパスワード

一方、メールアドレス "webmaster@ugegege.com" を利用するユーザーのMUAの設定パラメータは以下のようになります。

メールアドレス: webmaster@ugegege.com

DNSサーバー "mail.ugegege.com" が設定済みであれば、それを設定することもできます。

受信メールサーバー(POP3): mail.obenri.com

送信メールサーバー(SMTP): mail.obenri.com

アカウント名またはユーザー名: webmas_ugegege

パスワード: web1.obenri.comシステム上のwebmas_ugegegeのパスワード

以上が"/etc/mail/virtusertable"を用いた基本的な「ホスト名ごとのメールの振分け」の設定になります。

関連セクションへ 関連セクション・ メールサーバーの構築

このページの先頭へ↑

"/etc/mail/virtusertable"の設定のポイント

"/etc/mail/virtusertable.db" は、 構築中のLinuxサーバー が受信するメールアドレスの設定 "local-host-names" 受信するメールアドレスの設定 が評価された後に参照されますから、左側のパラメータ [受信対象のメールアドレス] は必ず"local-host-names"で受信が有効になっている ホスト名 のメールアドレスを設定する必要があります。

また、 [書き込み先のアカウント] が存在しない場合は「宛先不明」として処理されますので、同じ名前の アカウント の作成も忘れないようにしてください。

さて、"/etc/mail/virtusertable"の利用については、一つ大きな注意点があります。それは例えば "tanaka@obenri.com" "tanaka@ugegege.com" の振分けにおいて、既に 構築中のLinuxサーバー 上に "tanaka" というアカウントが存在するケース、つまり一般的にいうと、

「メールのアカウント名と同名のアカウントがシステム上に存在する場合」

の扱いが難しくなるということです。

通常 Sendmail は、例えば "tanaka@[ホスト名]" 宛てに送られてきたメールデータについて、ホスト名が"local-host-names"と一致した場合には、 "@" より前の部分のアカウント名に一致するアカウントを 構築中のLinuxサーバー 上から探し、メールボックスへの保存を試みます。

ところが、"/etc/mail/virtusertable.db"に有効な設定が存在すると、同名のアカウントへの書き込みを試みる前に"/etc/mail/virtusertable.db"が参照されるようになります。

そして"/etc/mail/virtusertable"に記述された上の行から順に評価され、書き込みの条件が一致してメールボックスへの書き込みが終了した段階で処理が終了します。

そして、もしも"/etc/mail/virtusertable"で設定されたどの条件とも一致しなかった場合に、Sendmailは 同名のアカウントへの書き込みを試みる ことになります。

ということは、例えば"local-host-names"に、

# local-host-names - include all aliases for your machine here.
obenri.com
mail.obenri.com
ugegege.com

という設定があり、"/etc/mail/virtusertable"で、

tanaka@obenri.com    tanaka
tanaka@ugegege.com    tanaka_ugegege

という設定を有効にしているとすると、"/etc/mail/virtusertable"に明示されていない "tanaka@mail.obenri.com" 宛てのメールは、アカウント "tanaka" のメールボックスに書き込まれることになります。

従って、「アカウント "tanaka" は、 "tanaka@obenri.com" 宛てのメール以外は受け付けない。」という設定にしたければ、"/etc/mail/virtusertable"には、

tanaka@mail.obenri.com宛てのメールは「宛先不明」として処理したいので、存在しないアカウント "no_user" に対して架空の転送処理を行います。
tanaka@obenri.com    tanaka
tanaka@mail.obenri.com  no_user
tanaka@ugegege.com    tanaka_ugegege

と、"local-host-names"に記述されているすべてのホスト名について明示的に設定しなければならないことになります。

もちろんこの程度であれば大した面倒でもないのですが、Sendmailで扱う ドメイン名 が増えると、"/etc/mail/virtusertable"にはその都度記述を増やさなければなりません。

例えば"/etc/mail/local-host-names"が、

# local-host-names - include all aliases for your machine here.
obenri.com
mail.obenri.com
ugegege.com
aa.ugegege.com
okekeke.com
obibibi.com

となった場合、"/etc/mail/virtusertable"は、

tanaka@obenri.com    tanaka
tanaka@mail.obenri.com  no_user
tanaka@ugegege.com    tanaka_ugegege
tanaka@aa.ugegege.com  no_user
tanaka@okekeke.com    no_user
tanaka@obibibi.com    no_user

「受信をしないためのやむをえない記述」 ばかりになってしまいます。

ここでは "tanaka" に限って説明しているのでまだ記述は簡単ですが、メールサーバーを利用するユーザーの数だけこの 「受信をしないための記述」 をしなければならないので、実際の設定作業は恐ろしく面倒なことになるでしょう。

ところが、 構築中のLinuxサーバー "tanaka" というアカウントが存在せず、 "tanaka@obenri.com" 宛てのメールを受信するアカウントとして "tanaka_obenri" を使うとすれば、"/etc/mail/virtusertable"の設定は、

tanaka@obenri.com    tanaka_obenri
tanaka@ugegege.com    tanaka_ugegege

だけで済みます。

今度は "tanaka" というアカウントがシステム上に存在しないわけですから、この"/etc/mail/virtusertable"に記述されていない "tanaka@[ホスト名]" 宛てのメールは書き込み先のメールボックスが存在せず、自動的に「宛先不明」として処理されることになります。

同じ理由から、"/etc/mail/local-host-names"の記述がいくら増えても、このケースでは"/etc/mail/virtusertable"への記述の修正や追記の必要はありません。

結局のところ、複数のホスト名を併用する場合の運用のコツは、

「メールアドレスのアカウント名と、サーバー上のアカウントを同じ名前にしないように運用する。」

ということに尽きるかもしれません。

関連セクションへ 関連セクション・ メールサーバーの構築

このサイトは既に更新を終了していますが、今のところ店じまいの予定はありません。 リンクフリー ですので、趣味や勉強のためでしたら、引用、転用、コピー、朗読、その他OKです。このサイトへのリンクについては こちら をご覧ください。
Powered by Apache
”Linux”は、Linus Torvalds 氏の各国における登録商標です。”Red Hat”及びRed Hatのロゴおよび Red Hat をベースとしたすべての商標とロゴは、各国におけるRed Hat, Inc. 社の商標または登録商標です。その他のプログラム名、システム名、製品名などは各メーカー、ベンダの各国における登録商標又は商標です。
www.centos.org - The Community ENTerprise Operating System