Sendmail インストール、及び MTA 設定

今回は、Sendmail をインストールした上で、MTA 設定を実施し、メール送信が出来るようにします。

やり方は 2通りあって、sendmail.cf をそのまま編集する方法と sendmail.mc を編集してから m4 コマンドを使って、sendmail.cf を生成する方法があります。

前者は、設定ファイルの中身が理解し辛い点があって、後者は、中身が比較的に分かりやすい構文になっているため、設定しやすいメリットがあります。

普通に使う分には、どちらを使っても良いので、自分のやりやすい方を選んで設定してください。

主に、以下の作業を実施します。

  • Sendmail インストール
  • Sendmail MTA 設定 (sendmail.cf と sendmail.mc の 2通り)
  • Sendmail サービス起動
  • メール送信テスト
  • 参考 : DaemonPortOptions について
  • オマケ : リレー制御

System Configuration Diagram システム構成図

sendmail mta

admin@my-server-hogehoge.com から user-1@mail-to.com 宛てに送ったメールを mail-server.hogehoge.com 経由で送信できるようにする

Sendmail インストール

まずは、apt-get を使って、sendmail と必要なパッケージをインストールします。

sendmail インストールRaw Code(S)Raw Code(T)
# apt-get install sendmail sendmail-cf mailutils

# dpkg --list | grep sendmail
ii  sendmail         8.14.4-7    all      powerful, efficient, and scalable Mail Transport Agent (metapackage)
ii  sendmail-base    8.14.4-7    all      powerful, efficient, and scalable Mail Transport Agent (arch independent files)
ii  sendmail-bin     8.14.4-7    amd64    powerful, efficient, and scalable Mail Transport Agent
ii  sendmail-cf      8.14.4-7    all      powerful, efficient, and scalable Mail Transport Agent (config macros)

Sendmail MTA 設定

その1 : sendmail.cf を編集するやり方

まずは、sendmail.cf を直接編集するやり方です。

sendmail のインストールが完了した後は、/etc/mail/sendmail.cf を編集し、実際にメールを転送してもらうための設定を実施します。

ポイントは、Dj に自分自身のホスト名 (FQDN)を設定することと、DS にフォワーディング先 (リレーホスト・メールサーバ) の FQDN、または IP アドレスを設定することです。

  • Djmy-server-fqdn
  • DSrelay-server-fqdn
  • O DaemonPortOptions をコメントアウト

以下の例では、現在のサーバ (sendmail をインストールしたサーバ) の FQDN が my-server.hogehoge.com、 メールサーバの FQDN が mail-server.hogehoge.com の場合の例です。

sendmail.cf : mta 設定Raw Code(S)Raw Code(T)
# cat /etc/hosts
・・・
192.168.100.100    my-server.hogehoge.com    my-server

# cd /etc/mail/

# cp -p sendmail.cf sendmail.cf.org

# vi sendmail.cf
------------- ここから -------------
・・・
#Dj$w.Foo.COM
Djmy-server.hogehoge.com
・・・
#DS
DSmail-server.hogehoge.com
・・・
#O DaemonPortOptions=Family=inet,  Name=MTA-v4, Port=smtp, Addr=127.0.0.1
#O DaemonPortOptions=Family=inet,  Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1
・・・
------------- ここまで -------------

# cat local-host-names
localhost
my-server.hogehoge.com

Djmy-server.hogehoge.com について

sendmail では、/etc/hosts/etc/mail/local-host-names にホスト名 (FQDN) が登録されていなかったりするとメールを受信できないので、該当ファイルにホスト名が設定されていることを確認してください。

また、Djmy-server.hogehoge.com のところを以下のように設定しても大丈夫です。

・・・

Dwmy-server

Dmhogehoge.com

Dj$w.$m

IP アドレス設定時の注意点

例えば、DSrelay-server-fqdn の代わりに IP アドレスを設定したい場合には、IP アドレスを [aa.bb.cc.dd] のように大括弧で囲む必要があります。

・ FQDN 設定時 : DSmail-server.hogehoge.com

・ IP アドレス設定時 : DS[10.10.10.10]

その2 : sendmail.mc を編集するやり方

sendmail.mc を直接編集するやり方です。

sendmail.mc の中身を見れば分かるように、いきなり Dj とか DS とかわけの分からない構文が出てくる sendmail.cf に比べると比較的に分かりやすい構文になっていることが分かります。

設定のポイントは、以下の通りです。

  • Dwmy-server-host
  • Dmmy-server-domain
  • define(`confDOMAIN_NAME',`$w.$m')dnl
  • define(`SMART_HOST', `relay-host-fqdn')dnl
  • DAEMON_OPTIONS をコメントアウト
sendmail.mc : mta 設定Raw Code(S)Raw Code(T)
# cat /etc/hosts
・・・
192.168.100.100    my-server.hogehoge.com    my-server
 
# cd /etc/mail/
 
# cp -p sendmail.cf sendmail.cf.org
# cp -p sendmail.mc sendmail.mc.org
 
# vi sendmail.mc
------------- ここから -------------
・・・ 以下を新規追加 ・・・
dnl #
Dwmy-server
Dmhogehoge.com
dnl #
define(`confDOMAIN_NAME',`$w.$m')dnl
dnl #
define(`SMART_HOST', `mail-server.hogehoge.com')dnl
dnl #

・・・ 以下をコメントアウト ・・・
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
dnl DAEMON_OPTIONS(`Family=inet,  Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1')dnl

・・・
------------- ここまで -------------

# cat local-host-names
localhost
my-server.hogehoge.com

コメントアウトは、dnl

sendmail.mc 内でのコメントアウトは、# ではなく、dnl です。

間違えないように注意してください。

IP アドレス設定時の注意点

例えば、define(`SMART_HOST', `relay-host-fqdn')dnl の代わりに IP アドレスを設定したい場合には、IP アドレスを [aa.bb.cc.dd] のように大括弧で囲む必要があります。

・ FQDN 設定時 : define(`SMART_HOST', `mail-server.hogehoge.com')dnl

・ IP アドレス設定時 : define(`SMART_HOST', `[10.10.10.10]')dnl

設定が終わったら m4 コマンドを使って、sendmail.mc ファイルを実際に sendmail に読込まれる sendmail.cf に変換する必要があります。

m4 を使って sendmail.cf 生成Raw Code(S)Raw Code(T)
# m4 sendmail.mc > sendmail.cf
※実行結果は、何も表示されない

Sendmail サービス起動

設定が終わったところで、設定を反映するために、sendmail サービスを再起動します。

sendmail サービス再起動Raw Code(S)Raw Code(T)
# service sendmail restart

# service sendmail status
MSP: is run via cron (20m)
MTA: 20944 /usr/sbin/sendmail-mta -Am -L sm-mta -bd -q10m
UID        PID  PPID  C STIME TTY          TIME CMD
root     20944     1  0 15:06 ?        00:00:00 sendmail: MTA: accepting connections
Daemon Status: (process 21017) Console socket child

Current number of children: 0
QueueDir free disk space (in blocks): 35451276
Load average: 0
Child Process 20944 Status: accepting connections

# sysv-rc-conf --list | grep "sendmail"
sendmail     0:off      1:off   2:on    3:on    4:on    5:on    6:off

メール送信テスト

メールを送信する際には、sendmail コマンドを使っても良いし、mail コマンドを使っても良いです。

sendmail コマンドでメール送信

sendmail コマンドを使って、メールを送信します。

sendmail : メール送信テストRaw Code(S)Raw Code(T)
# sendmail hogehoge@mail-to.com
Content-Type: text/plain; charset=utf-8
From: root@hogehoge.com
To: hogehoge@mail-to.com
Subject: sendmail コマンドでメール送信・受信テスト
テストメールです!
このメールが受信できることを確認してください。
.

mail コマンドでメール送信

mail コマンドを使って、メールを送信します。

mail : メール送信テストRaw Code(S)Raw Code(T)
# mail hogehoge@mail-to.com
Subject: mail コマンドでメール送信・受信テスト
テストメールです!
このメールが受信できることを確認してください。
.
EOT

参考 : DaemonPortOptions について

ちなみに、一般的に sendmail.cfO DaemonPortOptions は、127.0.0.1 のみ Listen するようになっていて、デフォルトだと外部からのメールはリレーしないようになっています。

そのため、O DaemonPortOptions をコメントアウトしないとメール送信時に以下のエラーで失敗します。

この設定は、上記の手順内で設定済みですが、もし、以下のようなエラーメッセージで原因を探している方は参考にしてください。

/var/log/maillogRaw Code(S)Raw Code(T)
# tail -f /var/log/maillog

・・・ 以下のようなエラーが繰り返し出力される ・・・

NOQUEUE: SYSERR(root): opendaemonsocket: daemon MTA: cannot bind: Address already in use
daemon MTA: problem creating SMTP socket

・・・ メールを送信すると以下のようなエラーで失敗する ・・・

Oct  8 15:42:42 www sm-msp-queue[35962]: r986MuEk035521: to=hogehoge@mail-to.com, ctladdr=hogehoge (500/500), delay=00:19:46, xdelay=00:00:00, mailer=relay, pri=390005, relay=[127.0.0.1], dsn=4.0.0, stat=Deferred: Connection refused by [127.0.0.1]
/etc/mail/sendmail.cf : O DaemonPortOptions コメントアウトRaw Code(S)Raw Code(T)
・・・
#O DaemonPortOptions=Family=inet,  Name=MTA-v4, Port=smtp, Addr=127.0.0.1
#O DaemonPortOptions=Family=inet,  Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1
・・・
サービス再起動Raw Code(S)Raw Code(T)
# service sendmail restart

オマケ : リレー制御

今までの設定は、メールを送信したいサーバ (メール送信コマンドを使いたいサーバ) に sendmail をインストールし、自分自身が直接宛先にメールを送るのではなく、メールサーバ・リレーホストに一旦送って、後はお任せ~というどちらかと言うと郵便局を利用する側の設定でした。

もし、自分が郵便局を利用する側だけでなく、郵便局になって、他のサーバ sonota-server.hogehoge.com に自分自身の FQDN my-server.hogehoge.com または、IP アドレスを設定してもらって、メールを送信させる場合には、さらに、リレー設定が必要です。

sendmail mta relay制御

リレー設定は、access.db というファイルに許可するセグメントを記述するだけなので、そんなに難しい設定ではありません。

ただ、access.db は、ハッシュ化されているため、直接編集することは出来ません。

一旦、/etc/mail/access に許可するセグメントを追加し、makemap コマンドを使ってハッシュ化する必要があります。

この例では、以下のセグメントに対して、リレーを許可するようにします。

リレー許可セグメント設定値
192.168.100.0/24Connect:192.168.100 RELAY
10.10.0.0/16Connect:10.10 RELAY
sendmail : リレー制御Raw Code(S)Raw Code(T)
# cd /etc/mail/

# cp -p access access.org
# cp -p access.db access.db.org

# vi access
------------- ここから -------------
・・・
Connect:192.168.100    RELAY
Connect:10.10          RELAY
・・・
------------- ここまで -------------

# makemap hash access.db < access

makemap コマンドを使うと即時反映されるため、sendmail の再起動は不要です。

後、余裕があれば、sendmail.mc の設定が sendmail.cf にどういうふうに反映されるか比較して見るのも良いかなと思います。

以上、Ubuntu : Sendmail インストール、及びメール転送設定 でした。