Sendmailとは
MTAの中でもUNIXで古くから使われてきたのがSendmailです。非常に多くのOSで採用されており、MTAの実質的標準の地位を占めています。Sendmailの特徴は様々な状況に対応できる柔軟性です。ただし、その代償として設定方法が複雑で、多くのセキュリティーホールが見つかっています。
MTA(Mail Transfer Agent)とは
MTAは電子メールを配信するためのソフトウエアです。ユーザが送信したメールを目的地まで配送したり、届いたメールを保管したりします。
Sendmailの設定ファイル
SendmailはほとんどのUNIX系OSにデフォルトでインストールされています。通常、/etc/mail に設定ファイルが集められています。
/etc/mail の設定ファイル
ファイル名 | 機能 |
---|---|
alias | アカウントの転送先の設定ファイル |
sendmail.cf | Sendmailの設定ファイル(本体) |
mail/access | アクセス制御設定ファイル |
mail/access.db | アクセス制御設定データベース |
mail/domaintable | メールアドレスのドメイン書き換えリスト |
mail/domaintable.db | ドメインの一覧設定ファイル |
mail/local-host-names | 自ホスト名設定ファイル |
mail/mailer.conf | メーラプログラムの設定 |
mail/mailertable | メーラ配送表 |
mail/mailertable.db | 静的な配送の設定ファイル |
mail/sendmail.mc | Sendmailの設定ファイル(編集用) |
mail/spamassassin | スパムをフィルタリング |
mail/submit.cf | メール配信プログラムモードで実行した際の設定ファイル(本体) |
mail/submit.mc | メール配信プログラムモードで実行した際の設定ファイル(編集用) |
mail/trusted-users | 信頼できるユーザの設定 |
mail/virtusertable | 仮想ユーザおよび仮想ドメイン表 |
mail/virtusertable.db | バーチャル・ホストの設定ファイル |
sendmail.cfファイルの作成
SendmailはRedhat Linuxなど多くのLinuxディストリビューションやUNIX系OSに標準でインストールされています。まずはインストール確認をし、インストールされていれば設定に移ります。
yumの場合、下記コマンドでsendmailがインストールされているか確認できます。
yum list installed | grep sendmail
必要であれば下記のようにインストールを行います。
yum install sendmail yum install sendmail-cf
Sendmailの標準の設定ファイルはsendmail.cfですが、書式が難解です。Sendmailにはsendmail.mcというm4マクロ言語のテンプレートが用意されているので、これを使ってsendmail.cfを出力します。
sendmail.mcファイルを編集して新しいsendmail.cfファイルを作成します。
vi /etc/mail/sendmail.mc
以下の行を見つけて、先頭行にdnlという文字を挿入します。この行は外部からのメール処理を受け付けるかどうかの設定で、dnlを先頭に挿入することにより外部メール処理を受け付けるようにします。
dnl DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
変更したら保存して、m4コマンドでsendmail.cfファイルを生成します。
m4 /etc/mail/sendmail.mc > /etc/sendmail.cf
ファイル保存後、sendmailをリロードします。
/etc/init.d/sendmail reload
メールリレーを許可する
外部のサーバに送信するには、sendmail にメールのリレー(転送)を許可する必要があります。デフォルトの設定ではメールリレーが許可されていないため、自サーバのユーザ以外にはメールを送ることができません。
accessファイルは、どのアドレスがメールサーバに接続できるか、 そして接続の種類は何か、ということを定義します。 ホストは OK、REJECT、RELAYを指定できます。または、メーラエラーを指定することで、 sendmailのエラー処理ルーチンに渡すことも可能です。
メールリレーの設定はaccessファイルを使います。
vi /etc/mail/access
192.168.0の範囲にあるマシンのメール中継を許可する場合は、/etc/mail/accessに次のように記述します。
# Check the /usr/share/doc/sendmail/README.cf file for a description
# of the format of this file. (search for access_db in that file)
# The /usr/share/doc/sendmail/README.cf is part of the sendmail-doc
# package.
#
# by default we allow relaying from localhost...
localhost.localdomain RELAY
localhost RELAY
127.0.0.1 RELAY
# 192.168.0.0から192.168.0.255までのマシンのみメール中継する
192.168.0 RELAY
accessのオプション
制限 | 意味 |
---|---|
OK | メールを受信する |
RELAY | メールを受信・中継する |
REJECT | メールを受信しない。エラーを出力する |
DISCARD | メールを破棄する。エラーを出力しない |
accessファイルなどの設定ファイルはsendmailが読み込めるデータベース形式に変換する必要があります。変換にはmakemapコマンドを使い、ます。
makemap hash /etc/mail/access.db < /etc/mail/access
複数のドメイン名でメールを受信する
local-host-name
local-host-nameはメールを受け取るドメイン名を設定します。ここで設定したドメイン名はどのメールアドレスでメールが送られても、同じメールボックスに配送されます。
ドメインの一覧は、/etc/mail/local-host-names ファイルに記述します。
vi /etc/mail/local-host-names
local-host-namesを開いたら次のようにドメインを追加します。以下はwww.example.jp、mail.example.jp、example2009.jp宛のメールを処理するように設定しています。
# local-host-names - include all aliases for your machine here.
example.jp
mail.example.jp
# 複数ドメインも指定できます。
example2009.jp
ファイル保存後、sendmail をリロードします。
/etc/init.d/sendmail reload
メールエイリアスの作成
aliases
/etc/aliasesはメールボックスエイリアスを設定します。仮想のメールボックス名を左側に設定し、コロンで区切った後、メールアドレスのリストを記述します。
project: takagi, iida, support@example.jp
上記の設定で、project@ に送られたメールはtakagi@、iida@、support@example.jpに送信されます。メールアドレスを指定する以外に、ファイル名を指定すればそのファイルに書き込みが行われ、パイプを通じて標準入力に書き込むことも可能です。
# /dev/nullに書き込み
project2: /dev/null
# パイプを通じて標準入力に書き込み
project3: "| /usr/local/bin/procmail"
編集が終了したらnewaliasesで更新します。
newaliases
サーバ以外からのメール着信を許可
hosts.allow
hosts.allowに全てのホストからのアクセスを許可する設定を書いておきます。
vi /etc/hosts.allow
viでhosts.allowを開いた後、sendmailのアクセスを許可する行を追加します。
# hosts.allow This file describes the names of the hosts which are
# allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
sendmail:ALL
設定が正しいかどうか、テストモードで起動して確認することができます。
# /usr/sbin/sendmail -bt -C /etc/mail/sendmail.cf
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
>
メール送信のテストは、以下のようにします。最終行に mailer local ... と出力されていれば成功です。
> /parse jun@example.jp
Cracked address = $g
Parsing envelope recipient address
canonify input: jun @ rfs . jp
Canonify2 input: jun < @ rfs . jp >
Canonify2 returns: jun < @ rfs . jp . >
canonify returns: jun < @ rfs . jp . >
parse input: jun < @ rfs . jp . >
Parse0 input: jun < @ rfs . jp . >
Parse0 returns: jun < @ rfs . jp . >
ParseLocal input: jun < @ rfs . jp . >
ParseLocal returns: jun < @ rfs . jp . >
Parse1 input: jun < @ rfs . jp . >
Parse1 returns: $# local $: jun
parse returns: $# local $: jun
2 input: jun
2 returns: jun
EnvToL input: jun
EnvToL returns: jun
final input: jun
final returns: jun
mailer local, user jun
Ctrl + D で終了します。
POP3サーバの構築
sendmailはメールを配信するためのSMTPサーバなので、別途、メールを読み出すためのPOP3、もしくはIMAP4をインストールする必要があります。
メール受信サーバの確認
メール受信サーバが使えるかどうかは、Telnetで接続して確かめることができます。POP3のTCPポート番号は110ですので、ローカルホストのPOP3に接続するには次のようになります。
telnet localhost 110
POP3が起動していない
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
上記のように Connection refused
といったエラーメッセージが表示されたら、次の作業をしてみましょう。
xinetd の場合は /etc/xinetd.d に移動し、vi で ipop3 を開きます。
service pop3
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/ipop3d
log_on_success += HOST DURATION
log_on_failure += HOST
disable = yes
}
disable=yesとなっていたら、disable=no
に変更し、保存して終了しましょう。次に、xinetdをリスタートします。
# /etc/init.d/xinetd restart
dovecotのインストール
受信メールサーバがインストールされていない場合、必要なパッケージをインストールします。ここではDovecotをインストールする方法を紹介します。
Dovecotがインストールされているかどうかは、次のコマンドで確認できます。
rpm -q dovecot
POP3やIMAP4がインストールされていない場合、Dovecotなどの受信メールサーバをインストールします。
yumを使ったインストール
yum -y install dovecot