Sendmail講座

Sendmailとは

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

関連記事