sendmailのインストール



●sendmailとは

 最も普及しているSMTP(simple mail transfer protocol)サーバ・ソフト。フリーソフト版と商用化した製品版があります。フリーソフト版は開発者のエリック・オールマンが米カリフォルニア大学バークレイ校時代にリリースしました。当時、オールマンがARPANET接続用に開発したdelivermailが原型です。
 1998年3月に、オールマンは製品版を開発・販売する会社として「sendmail」社を設立。「sendmail Pro」をリリース。2003年2月に日本法人のセンドメールを設立しました。
 製品版とフリーウエア版の違いは扱いやすさにあります。製品版は、複雑で難解だといわれるフリーソフト版の設定を簡易化するため、GUI(グラフィカル・ユーザ・インタフェース)を活用した設定ツールを付属するなど工夫を施してあります。オールマンは、sendmail社の最高技術責任者として開発を担当する一方で、フリーソフト版のsendmailのメンテナンスを続けています。

SMTP

 上記のイメージ図について、下記のURLを参考しました。
 http://www.askasystems.com/service/itmemo/itmemo-smtp.html

●sendmailのインストール

 古いsendmailやPostfix等は削除しておきます。
ここからダウンロードし、/usr/local/srcに保存します。
 念のため古いsendmailの各情報も削除しておきます。
# userdel -r smmsp
# rm -rf /usr/bin/sendmail
# rm -rf /var/spool/mqueue
 sendmail専用のユーザを作成します。
# useradd -s /bin/false smmsp
 マニュアルページのディレクトリを作成します。
# mkdir /usr/man /usr/man/man1 /usr/man/man5 /usr/man/man8
 メールキューディレクトリを作成します。
# mkdir /var/spool/mqueue
 ここまで準備が出来たら、インストールを開始します。
$ cd /usr/local/src
$ tar xzf sendmail.x.xx.x.tar.gz
$ cd sendmail-x.xx.x
# sh Build
# sh Build install
 各パーミッションを変更します。
# chmod go-w / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue
# chown root / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue
 sendmail.mcの設定とsendmailcfへの書き出しをします。cf/cf/sendmail.mcが設定ファイルです。ですがそのファイルは存在しないので、雛型ファイルgeneric-linux.mcをコピーして使用します。また、このsendmail.mcを編集し、これをもとに正規のコンフィグファイルsendmail.cfに書き出します。
# cd cf/cf
# cp generic-linux.mc sendmail.mc
 コピーした設定ファイルを編集します。
divert(-1)
#
# Copyright (c) 1998, 1999 sendmail, Inc. and its suppliers.
#	All rights reserved.
# Copyright (c) 1983 Eric P. Allman.  All rights reserved.
# Copyright (c) 1988, 1993
#	The Regents of the University of California.  All rights reserved.
#
# By using this file, you agree to the terms and conditions set
# forth in the LICENSE file which can be found at the top level of
# the sendmail distribution.
#
#
#
#  This is a generic configuration file for Linux.
#  It has support for local and SMTP mail only.  If you want to
#  customize it, copy it to a name appropriate for your environment
#  and do the modifications there.
#
divert(0)dnl
VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $')
OSTYPE(linux)dnl
FEATURE(`always_add_domain')dnl
MASQUERADE_AS(`youre_domain')dnl
FEATURE(`masquerade_envelope')dnl
MASQUERADE_DOMAIN(`localhost')dnl
FEATURE(`masquerade_entire_domain')dnl
dnl EXPOSED_USER(`root daemon')dnl
FEATURE(`mailertable')dnl
FEATURE(`virtusertable')dnl
FEATURE(`access_db')dnl
FEATURE(`blacklist_recipients')dnl
FEATURE(`accept_unresolvable_domains')dnl
FEATURE(`no_default_msa')dnl
DOMAIN(generic)dnl
MAILER(local)dnl
MAILER(smtp)dnl
Dmbigbang.dyndns.org
Dwmailb
define(`confDOMAIN_NAME', `$w.$m')dnl
define(`confCF_VERSION', `bigbang-mail01')dnl
define(`SMART_HOST',`smtp.your.provider')dnl
 設定の詳細については、/etc/mail/sendmail.cfを参照してください。
 sendmail.mcの設定が終わったら、sendmail.cfに書き出します。
# sh Build sendmail.cf
# sh Build install-cf
 ローカルで受信するドメイン名を設定します。
# echo "hoge.ne.jp" > /etc/mail/local-host-names
 必要であればエイリアスを設定します。詳細は/etc/aliasesについてを参照してください。
 メールのリレー設定をします。リレーを設定するファイルは/etc/mai/accessです。詳細/etc/mail/accessについてを参照してください。

●起動スクリプトの作成

 この状態ではOSを起動したときにsendmailが立ち上がってこないので、起動するようにします。
 起動スクリプトの雛型をカスタマイズして、/etc/rc.d/init.d にsendmailという名前でコピーし、下記の箇所を変更します。(2行目〜11行目までも利用する環境により変更してください)
prog_name=sendmail
exec_file="/usr/sbin/sendmail"
lock_file="/var/lock/subsys/sendmail"
pid_file="/var/run/sendmail.pid"
daemon $exec_file -bd -q15m ← startルーチンに追記
 コピーしたsendmailに実行権限をつけ、実行できるように設定します。
# chmod 755 /etc/rc.d/init.d/sendmail
 OSの再起動時も自動起動出来るようにします。
# chkconfig --add sendmail
 sendmailを起動します。
# service sendmail start
sendmailを起動中:           [ OK ]

●sendmailの設定ファイル

 設定ファイルには以下のようなものがあります。
  1. /etc/mail/access
  2.     sendmailアクセスデータベースファイル(受信、転送を許可するホストの設定)
  3. /etc/aliases
  4.     メールボックスエイリアス
  5. /etc/mail/local-host-namesについて
  6.     sendmail が受け付ける配送先ホストのリスト
  7. /etc/mail/mailer.conf
  8.     メーラプログラムの設定
  9. /etc/mail/mailertable
  10.     メーラ配送表
  11. /etc/mail/sendmail.cf
  12.     sendmailの主設定ファイル
  13. /etc/mail/virtusertable
  14.     仮想ユーザおよび仮想ドメイン表

 /etc/mail/accessについて

 sendmailではその制御を行うのに、「/etc/mail/access.db」というバイナリのデータベースファイルを参照します。メール転送の中継を許可するホストの範囲やスパムメール対策、自ドメインの無効なアドレスへ来たメールの対処などを設定します。このファイルの設定によって、スパムメールの中継などを不可能にします。
 「access.db」ファイルは「access」というテキストファイルに設定を記述した後に「makemap」コマンドを用いて変換します。「.db」は、データベース・ファ イルです。
 ただし、「makemap」コマンド使用すると応答がなくなる場合があります。この場合は「make」コマンドを使用します。
 「access」の設定を以下の例を参考にして説明します(バージョン8.13.8から記載方法等が変わったようです)。
 「Connect:」とあるのは、タグです。タグは、Connect:、To:、From: の3種類があります。それぞれ、
  • Connect: 受信メールの接続を開始したリモートシステムのIPアドレスを、条件テストと照合 (connection information ${client_addr}, ${client_name}))
  • To: メッセージエンベロープの受信者アドレス(Envelop の RCPT TO の部分)を、条件テストと照合 (envelop recipient)
  • From: メッセージエンベロープの送信者アドレス(Envelop の MAIL FROM の部分)を、条件テストと照合 (envelop sender)
 タグを省略できます。省略すると、受信メールの接続を開始したリモートシステムのIPアドレス、メッセージエンベロープの受信者アドレス、メッセージエンベロープの送信者アドレスの3つが、条件テストと照合され、どれか1つが合致すると、定義した動作が起きます。タグを付けたときは、タグで指定したものだけが、条件テストと照合されます。
 OK、RELAY、REJECT等を書くことができます。
  • OK: 他のルールにより拒否されるメールでもacceptする
  • RELAY: リレーを許可する (trasmission of messages from a site outside your host (class{w}) to another site except yours)
  • REJECT: 拒否する
1:  Connect:mail.hoge.com	RELAY
2:  Connect:hoge.co.jp		RELAY
3:  Connect:192.168          	RELAY
4:  From:cracker.com		REJECT
5:  From:hacker@cracker.com	OK
6:  Connect:spammer.net		DISCARD
7:  From:cracker.co.jp		ERROR:"550 We reject mail from you"
8:  To:friend.domain		RELAY
9:  Connect:192.168.1           SKIP
 書式は、1行にドメインや、IPアドレス、e-mailアドレスなどと、それに対する許可や不許可などを記述します。
 上記の例の1行目では、ホスト名「mail.hoge.com」に対して転送を許可しています。「RELAY」はメール転送の許可を表しています。sendmailサーバ自身のドメインに対しては許可しておかなければ、メールを送れません。
 2行目は、ドメイン名「hoge.co.jp」に属する全てのホストからメール転送を許可する設定です。
 3行目は、サブネットで指定しています。「192.168」は「192.168.0.0/16」を意味します。もちろん、
3:  192.168.0.0/16       RELAY
でも構いません。
 4行目の「REJECT」はメール転送の拒否を表しています。「cracker.com」ドメインからのメール転送を拒否しています。
 5行目で、同じドメインの「hacker@cracker.com」からのメールだけは転送を許可したいので「OK」を指定します。「OK」は他の行の設定よりも優先されるので、4、5行目のようにすれば、あるe-mailアドレスだけを許可する設定が行えます。
 しかし、個人的にはこのような設定はおすすめしません。抜け穴のようになってしまいますし、許可するe-mailアドレスが多いと管理が大変ですから。
 6行目は、ホスト「spammer.net」からのメールを破棄しています。「DISCARD」はメール破棄の設定です。
 7行目は、ホスト「cracker.co.jp」からのメールの転送に対して、メッセージ「"550 We reject mail from you"」を送り、メール転送を拒否します。「ERROR:」の後にメッセージを指定するとこのような設定が行えます。
 8行目は、「friend.domain」へのリレーを許可しています。
 9行目は、3行目で許可したサブネット「192.168」のうち「192.168.2」のサブネットは除くと言う意味になります。
# makemap -v hash /etc/mail/access.db < /etc/mail/access
応答が無い場合はCtrl+cを押下後
# cd /etc/mail ← 必ずcdする
# make /etc/mail/access.db
 なお、この時sendmailの再起動は必要ありません。

 /etc/aliasesについて

 メールサーバで有効とされるメールID(メールアドレスの「@」の左に置かれる名前)には、そのメールサーバに登録されているユーザアカウント名のほかにエイリアス(別名)があります。エイリアスは、ユーザアカウント名、メーリングリストのファイル名、メールを処理するプログラム(メーリングリストプログラムを含む)の名前、または別のメールアドレスに対応付けられます。SMTPサービスプログラムとしてsendmailを使う場合は、エイリアス定義は/etc/aliasesファイルに記述します。
 ここでは、/etc/aliasesファイルの設定方法を説明します。必ず記述しなければならない定義がありますので、注意してください。
  1. 必須のエイリアス

  2.  sendmailをインストールした時に作られる/etc/aliasesファイルには、以下の記述が入っています。
    # Basic system aliases -- these MUST be present.
    MAILER-DAEMON:  postmaster
    postmaster:     root
    
     これらは、MAILER-DAEMON(メール配送デーモン:sendmailデーモンのこと)宛に通知されたメールはpostmaster(郵便局長の意味)が受け取るべきこと、さらにpostmaster宛のメールはroot(システム管理者)が受け取るべきことを定義しています。これらは必須の定義ですから、消してはいけません。
     また、この後にbin、daemonなどいくつかのエイリアスをrootに対応付ける定義が並んでいます。それらもそのままにしてください。
     さらに、root宛のメールはシステム管理者の個人アカウント名に対応付けます。
    # Person who should get root's mail
    root:           taro
    
     ここで、taroはシステム管理者の個人アカウント名の一例です。複数人の場合は、次の例のように、コンマで区切って並べます。
    # Person who should get root's mail
    root:           taro, hanako
    
     この定義は必ず書き加えなければなりません。さもないと、コンソールからrootでログインした時にしかroot宛のメールに気付くことができません。
     root作業をするためには、rootでログインするのでなく、一般ユーザアカウントでログインしてsuコマンドでroot権を持つようにすべきです。最近のUNIX系OSでは、セキュリティのためにネットワークからはrootでログインできないようになっているのが普通です。
     /etc/aliasesファイルの編集が終ったら、
    # newaliases
    
    を実行します。以降に述べる設定を行った場合も同じです。

  3. 別のメールIDでメールを受け取るためのエイリアス定義

  4.  たとえば、taroというアカウントを持っている鈴木太郎さんがsuzukiというメールIDでもメールを受信したい場合は、以下のようにエイリアスを定義します。
    suzuki:         taro
    
     ただし、当然、そのサーバにsuzukiというアカウントを持つ別人がいない場合に限られます。

  5. 転送のためのエイリアス定義

  6.  そのサーバにアカウントがない人へのメールを受け取って転送するように設定することもできます。転出した人に届いたメールを新しい勤務先へ転送したい場合によく使われる方法です。例を示します。
    jiro:           jiro@anotherdomain.co.jp
    

  7. /dev/nullに送る

  8.  hoge宛のメールは自動的に/dev/nullに送られます(闇に葬られる)。
    hoge:           /dev/null
    

  9. 蓄積と転送を同時に行う方法

  10.  そのサーバにアカウントを持つ人に届いたメールを、その人のメールスプールに蓄積すると同時に別のアドレスへ転送することもできます。例を示します。
    jiro:           \jiro, jiro@anotherdomain.co.jp
    
     ここでは、アカウント名jiroと同名のエイリアスjiroを定義していることになります。この場合、アカウント名には頭に「\」を付けて区別しなければなりません。これがないとエイリアスループ(エイリアス定義の堂堂巡り)になってしまいますので、ご注意ください。
     しかし、実はこれは危険です。jiroさんがこのサーバ上のアドレスを差出人アドレスとして自分宛にメールを送った時、転送先のメールサーバのトラブルなどで転送がエラーになると、その差し戻しがまた転送されようとしてエラーになるというループが起こるおそれがあります。特に、 MAILER-DAEMON、postmaster、およびroot宛のメールを受ける人が別アドレスへの転送を仕掛けていると、エラーメールのループが起こる危険が大きくなります。
     この問題を避けるには、やや面倒ですが、以下の方法をとることを強くお勧めします。
     次のように記述したシェルプログラムファイルfw-jiro.sh(ファイル名は何でもかまいません)を作ります。
    #!/bin/sh -
    /usr/lib/sendmail -f owner-fw-jiro@mydomain.co.jp jiro@anotherdomain.co.jp
    
     ここで、「mydomain.co.jp」はこのサーバのアドレスの例です。シェルプログラムファイルのモードは次のようにしてください。
    chmod 755 fw-jiro.sh
    
     /etc/aliasesファイルでの定義は次のようにします(シェルプログラムファイルのディレクトリ位置は一例です)。
    jiro:           \jiro, "|/var/fw/fw-jiro.sh"
    owner-fw-jiro:  \jiro
    
     このようにすれば、転送されるメールの差し戻し先はowner-fw-jiroとなり、これはアカウントjiroだけに対応付けられていますから、差し戻しはjiroさんのメールスプールだけに届き、もはやそれ以上転送されません。

 /etc/mail/local-host-namesについて

 /etc/mail/local-host-namesでは、サーバが管理しているドメイン宛のメールだけ受信するための設定を行います。sendmailがメールを受け取るすべてのドメインやホストにこのファイルを置いてください。
 たとえば、このメールサーバはhoge.comドメインおよびmail.hoge.comホストへのメールを受け取るとすると、local-host-namesファイルの内容は次のようになるでしょう。
hoge.com
mail.hoge.com
 このファイルを更新したら、変更を読み込むためにsendmailを再起動する必要があります。
# service sendmail restart
注意  本ファイルを正常に設定しないと、中継が拒否されたことがあります。その場合、/var/log/maillog に次のような中継を拒否するログが記録されます。
Jun 30 04:32:09 sion sendmail[18937]: k78Bs47cd187636: ruleset=check_rcpt,
arg1=<receiver@example.jp>, relay=mailserver.private.com [192.168.10.1],
reject=550 5.7.1 <sender@example.jp>… Relaying denied・・・

 /etc/mail/mailertableについて

 mailertable(mailertable.db)ファイルは、静的な配送の設定を行うためのファイルで、このファイルにドメインとIPアドレスの組み合わせなどを記述しておけば、DNSサーバのMXレコードでドメインが検索されなくても、転送するメールを指定したドメインに正確に送ることが出来るようになります。
 この設定を行えば障害に強いサーバにすることが出来ます。
 mailertable.dbファイルはmailertableというテキストファイルに設定を記述した後に「makemap」コマンドを用いて変換します。

/etc/mail/mailertableを編集
# vi /etc/mail/mailertable
hoge.com	smtp:[222.111.100.101]
.hoge.co.jp	smtp:mail.hoge.ne.jp
 設定は、1行に1つ、左にホスト名やドメイン名の一部を、右にメーラーに続けて「:(コロン)」、IPアドレスやホスト名を記述します。メーラーには、sendmail.mcで設定されている
MAILER(smtp)dnl
の括弧内のメール転送エージェントを指定します。
 上記例の1行目は、ドメイン「hoge.com」宛のメールをsmtpメール転送エージェントで、IPアドレス「222.111.100.101」(<-このアドレスはもちろん架空の アドレスです)へ転送する設定です。
 2行目は、「.hoge.co.jp」のホスト、例えば、「sale@kobe.hoge.co.jp」宛のメールなどをsmtpメール転送エージェントで、ホスト「mail.hoge.ne.jp」 へ転送する設定です。
 1行目のように、IPアドレスやホストを「[」と「]」で囲むと、そのホストやアドレスに対してはDNSサーバのMXレコード(メールサーバに対する設定)を参照しないでAレコードのアドレスに向けて転送されます。このようにする理由は、設定が不完全な場合に「MXループ」(MXレコード参照を限りなく繰り返してしまうような現象)を引き起こしてしまうからです。
 設定行の左に来るホスト名やドメイン名で、部分的に一致する設定を記述した場合、例えば、
 *1:  .hoge.co.jp      smtp:[222.111.100.101]
 *2:  kobe.hoge.co.jp  smtp:mail.hoge.ne.jp
のような場合は、より一致する部分が多い方が優先されます。ですので、上記の設定では、「sale@kobe.hoge.co.jp」宛のメールは*2行目が適用されます。

変更が完了したら、ハッシュ化します。
# makemap -v hash /etc/mail/mailertable.db < /etc/mail/mailertable
応答が無い場合は、Ctrl+cで強制終了後
# make /etc/mail/mailertable.db
 なお、この時sendmailの再起動は必要ありません。

 /etc/mail/sendmail.cfについて

1 「sendmail.mc」の設定

 「sendmail.cf」はアドレスの解析などsendmailの動作の重要な部分の設定を行うファイルです。設定は複雑なために「m4」というマ クロを使ってsendmail.cfファイルを生成します。
 「m4」マクロを使って設定を行うのは、デフォルトから変更する部分だけで、基本的にはそんなに複雑な作業にはなりません。
 なお、今回の説明で使用するメールサーバ名は「mail.hoge.com」とします。
 ソースファイルからsendmailをインストールした場合、sendmail.cfファイルの生成は、「sh Build」を実行したディレクトリ下で行います。
 まずは、rootユーザで、「sh Build」を実行した「sendmail-*.**.**」ディレクトリの下の「cf/cf」へ移ります。
# cd cf/cf
 このディレクトリには、それぞれのOS用の必要最低限の設定ファイルがあり、これを「sendmail.mc」というファイルにコピーし、さらに設定に必要な内容を書き 足して「m4」マクロを使ってsendmail.cfファイルを作成します。
 Linuxでは「generic-linux.mc」というファイルを「sendmail.mc」にコピーします。
 
# cp generic-linux.mc sendmail.mc
 一度中身を確認してみましょう。viエディタや、cat、lessコマンドで確認してください。
  1:  divert(-1)
  2:  #
  3:  # Copyright (c) 1998, 1999 sendmail, Inc. and its suppliers.
  4:  #       All rights reserved.
   :  :
 19:  #  and do the modifications there.
 20:  #
 21:  
 22:  divert(0)dnl
 23:  VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $')
 24:  OSTYPE(linux)dnl
 25:  DOMAIN(generic)dnl
 26:  MAILER(local)dnl
 27:  MAILER(smtp)dnl
以上は、本当に基本的な部分だけの設定です。
 1行目の「divert(-1)」から22行目の「divert(0)dnl」まではm4マクロで無視され、sendmail.cfにはなにも出力されません。
 23行目の「VERSIONID」はsendmail.cfにバージョン情報を出力するためのモノ、24行目でOSの種類を出力し、25行目でドメインの標準設定を出力し、26、27行目 は内向き(ホスト内)と外向き(インターネットなどの外部転送先)のメール配送エージェントの設定を出力します。
 いくつかの行末に「dnl」が記述されていますが、「dnl」は次の改行までを削除するという命令です。これはm4マクロが不必要な改行を出力しないために指定 するモノで、この「dnl」以降は無視されるので、m4マクロのコメント行として使えます。
 なお、詳細はあとで説明するので、今は内容の確認だけをしてください。
 rpmパッケージからsendmailをインストールした場合は、「/etc/mail/」ディレクトリにある「sendmail.mc」ファイルを編集します。
 上記sendmail.mcファイルの内容とsendmail.mcとは違いますが、設定は同じなので、ここでの説明を参考にして編集してください。
 では、順に説明していきましょう。viなどのエディタでsendmail.mcを開いて下さい。
 sendmail.mcの22行目の「divert(0)dnl」までは、m4マクロ用のコメントなので、なにも変更しません。
 次のバージョン情報もそのままでも構いませんが、管理しやすくするためにバージョンや日付を変更してください。24行目のOSの種類もLinuxなのでそのままで構いません。25行目のDOMAINも、標準的な設定を指定しているだけなのでそのままで構いません。
 設定項目は、基本的に以下の順序で記述します。

 1:VERSIONID
 2:OSTYPE 必須  使用するOSの指定
 3:DOMAIN 推奨  ドメイン全体に共通の情報
 4:FEATURE 推奨  特殊な必要性の解決
 5:define
 6:MAILER 必須  必要な配信エージェント
 7:LOCAL_RULE
 8:LOCAL_RULESETS

 もちろん、基本的な設定順なので、実際には他の設定項目が必要になる場合があります。
 では、「ドメインの書き換え」などの設定を行います。
 まずは、24行目の下に、
 *1: FEATURE(`always_add_domain')dnl
を書き加えます。これは、ローカルで配送されるメールに対して、ドメイン名を必ず付け加えるようにします。
 続けて次に、
 *2: MASQUERADE_AS(`hoge.com')dnl
 *3: FEATURE(`masquerade_envelope')dnl
と記述します。これは、*2行目で転送されるメールのアドレスの「@(アットマーク)」以降の部分を「hoge.com」というドメイン名に書き換えます。*3行目で、差出人アドレスもドメイン名の書き換えを行います。
 この設定で、ローカルから外部へ配送するメールのローカルでのドメイン名を書き換えることが出来ます。
 次は、書き換え対象となるドメインなどの指定です。
 *4: MASQUERADE_DOMAIN(`hoge.com')dnl
 *5: FEATURE(`masquerade_entire_domain')dnl
 *6: EXPOSED_USER(`root daemon')dnl
 *4行目は、書き換えの対象となるドメインの指定で、*5行目でそのドメイン以下の全てのサブドメインを指定する設定になります。*6行目は書き換えをしないユーザを指定しています。送信元がrootの場合も書き替えるは、6行目をコメントとします。
 mail.hoge.comのドメインだけを書き換える場合は、*4、*5行目を
 *4-1: MASQUERADE_DOMAIN(`mail.hoge.com')dnl
 *5-1: FEATURE(`limited_masquerade')dnl
と変更してください。全てのドメインを書き換え対象とする場合は、*4、*5行目を
 *4-2: FEATURE(`allmasquerade')dnl
と1行にしてください。ローカル配送のドメインを書き換えない場合は、
 *4-3: FEATURE(`allmasquerade')dnl
 *5-3: FEATURE(`local_no_masquerade')dnl
とします。どの設定が良いか悩む場合は、「*4〜*6」の設定にしてください。
 次は、「配送用テーブル」などの設定を行います。
 まずはドメイン毎に静的(固定的)な配送先を設定します。
 *7: FEATURE(`mailertable')dnl
で、静的な配送先の指定に「mailertable」ファイルを使う、という設定になります。「mailertable」ファイルについては次回以降で説明します。
 *8: FEATURE(`virtusertable')dnl
で、local-honst-namesファイル(ローカルと見なすドメインなどを設定するファイル)に複数のドメインを設定した場合、ドメインまで含めた宛先に対する転送設定にvirtusertableを使うという設定になります。

 次は、「スパム対策」などの設定です。
 まずは、アクセス制御に対する設定です。
  *9: FEATURE(`access_db')dnl
 *10: FEATURE(`blacklist_recipients')dnl
 *11: FEATURE(`accept_unresolvable_domains')dnl
で、アクセス制御が行えます。*9行目で、アクセス制御に「access_db」ファイルを使用し、*10行目である特定のアドレスにメール爆弾が来た場合や、すでになくなっているアドレスに対してメールが来た場合の動作を「access_db」ファイルで制御できるようになります。*11行目はDNSサーバで名前解決が出来ない場合も受け付けるための設定です。
 次は、「sendmailのMSA機能」などの設定です。
 MUA(Mail User Agent)からのメールの送信を受け付けるプロセスを「MSA(Mail Submission Agent)」と言います。
 *12: FEATURE(`no_default_msa')dnl
と書き加えると、MSAで使用するポート587番を閉じ、25番ポートをMTAと併用します。一般的なメールクライアントは、メールの送信先サーバにsendmailなどのメールサーバを使用し、その場合、25番ポートがメールクライアントのデフォルトとなっていることが多いのでこの指定をします。
 ここまでを、最初にgeneric-linux.mcからコピーしたsendmail.mcファイルの25行目と26行目の間に書き加えます。
 従って、次が、
 26:  MAILER(local)dnl
 27:  MAILER(smtp)dnl
になります。これらは、内向き(ホスト内)と外向き(インターネットなどの外部転送先)のメール配送エージェントの設定で、「cf/mailer/」にあるファイルを指定します。
 「local」は、ローカルのメールボックスに配送する場合に使われ、「smtp」は、他サーバへ「SMTP」配送する場合に使われます。
 次は、自身のドメイン名を完全なモノとしてsendmailに教え込む設定です。つまり、完全なホスト名、ドメイン名をsendmailが知っていれば、DNSサーバに何らかのエラーがあったり、停止してしまった場合でも、メールの転送が可能になり、このような障害に強くなります。
 *13: Dmhoge.com
 *14: Dwmail
 *15: define(`confDOMAIN_NAME', `$w.$m')dnl
と記述します。*13行目の「Dm」で、m4マクロの変数「$m」に「hoge.com」を設定します。*14行目の「Dw」は変数「$w」に「mail」を設定しています。*15行目 で、それらをつなげたものを正式なホスト名としてsendmailに教え込ますための設定をsendmail.cfに書き出す設定になります。

 最後に、生成するsendmail.cfファイルのバージョンを指定しましょう。
 *16: define(`confCF_VERSION', `hoge-mail01')dnl
と記述します。この設定では、ここで指定した文字列「hoge-mail01」がsendmail.cfのローカルバージョンとして指定され、自身を経由した全てのメールの「Received:ヘッダー」の一部にMTAのバージョンの一部として表示されます。

 こちらにsendmail 8.13.8付属のsendmail.mcの説明があります。

 その他補足

 ◆メールサーバ名及びバージョン情報の隠蔽
 コネクション時のグリーティングメッセージのバージョン非表示設定
define(`confSMTP_LOGIN_MSG',`unknown')dnl
変更前(sendmailのバージョンが表示される)
# telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 mail.example.com ESMTP sendmail 8.14.5/8.13.8; Wed, 29 Jun 2011 00:03:40 +0900
quit
 変更後(ホスト名及びsendmail バージョンが表示されなくなった)
# telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 unknown ESMTP 
quit

 ヘッダー情報でのバージョン非表示設定
define(`confRECEIVED_HEADER',`$?sfrom $s $.$?_($?s$|from $.$_)
	\ $.$?{auth_type}(authenticated)
	\ $.by $j (unknown)$?r with $r$. id $i$?u
	\ for $u; $|;
	\ $.$b')dnl
 上記は1行で記載してください。

 変更前のヘッダー抜粋
Received: from example.com (xxxxx.ne.jp [xxx.xxx.xxx.xxx])(authenticated bits=0)
by mail.example.com (8.13.8/8.13.8) with ESMTP id o6D1bHZ0065092for
; Wed, 29 Jun 2011 22:13:00 +0900
 変更後のヘッダー抜粋(バージョン表示が消え「unknown」と表示される)
Received: from example.com (xxxxx.ne.jp [xxx.xxx.xxx.xxx])(authenticated bits=0)
by mail.example.com (unknown) with ESMTP id o6D2NF39046360for
; Wed, 29 Jun 2011 22:13:00 +0900
 メールのヘッダ情報に入るReceived:からローカル情報を削除
 ローカルなIPアドレス情報を削除するためには、sendmail.cf内の「Format of headers」を次のように変更します。
変更前
 HReceived: $?sfrom $s $.$?_($?s$|from $.$_) $.by $j ($v/$Z)$?r with $r$. id $i$?u for $u$.; $b
 
変更後
 HReceived: $?sfrom $s ($s) $.by $j ($v/$Z)$?r with $r$. id $i$?u for $u$.; $b
 ロカールホストから送信したの場合
変更前のヘッダー抜粋
Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
	by mail.example.com (unknown) with ESMTP id p6121mnj011046
	for <hoge@smail.example.com>; Fri, 1 Jul 2011 11:01:48 +0900
変更後のヘッダー抜粋(「[127.0.0.1]」が消えた)
Received: from localhost.localdomain (localhost.localdomain)
	by mail.example.com (unknown) with ESMTP id p612GXNU011324
	for <hoge@smail.example.com>; Fri, 1 Jul 2011 11:16:33 +0900
 別ホストから送信した場合
変更前のヘッダー抜粋
Received: from pc1 (pc1.bigbang.dyndns.org [1.0.0.1])
	by bigbang.dyndns.org (unknown) with SMTP id p611GoGX010327
	for <hoge@smail.example.com>; Fri, 1 Jul 2011 10:16:53 +0900
変更後のヘッダー抜粋(「.bigbang.dyndns.org [1.0.0.1]」が消えた)
Received: from pc1 (pc1)
	by bigbang.dyndns.org (unknown) with SMTP id p6145sNQ012731
	for <hoge@smail.example.com>; Fri, 1 Jul 2011 13:05:54 +0900

 ◆出力ログレベルの設定
dnl define(`confLOG_LEVEL', `9′)dnl
 デフォルトは9です。9はだいたいsyslogのinfoに相当します。これくらいでちょうどでしょう。0(少ない)~98(多い)まで設定できますが、16以上はdebugレベルです。15ですべてのSMTPコマンドが見ることができます。

 ◆スマートホストの設定
define(`SMART_HOST',`smtp.your.provider')
 このサーバが、インターネット側から見て、「DNS名の正引き結果とIPアドレスの逆引き結果が一致」しているならスマートホストの設定をしなくても送信は可能です。(厳密にはその必要はないのですが、そうでないサーバからのSMTP接続が拒否されてしまう設定が最近非常に増えてます。)
 スマートホストを設定する必要性としては、
  • 固定IP1個のプロバイダ契約で、正引きは設定できるが、逆引きの設定はできず、そのIPアドレスを逆引きするとプロバイダの名前が引ける
  • メールサーバがNAPTの内側(つまりLAN内)にあり、WAN側からLAN内のメールサーバの名前引きはまったくできないが、DMZセグメントにメールゲートウェイ(メールリレー)サーバがある
  • キャンペーンサイトのメール送信などで、一度にたくさんのメールを送信するため、メール送信専用サーバがある(名前引きなどで負荷がかかりますからね。)
などの場合はスマートホスト、DMZなどにあるメールリレーサーバを設定します。(IPアドレスではだめです。)プロバイダのメールサーバなんかを指定してもいいのかもしれません。

 ◆受信メールサイズの調整
define(`confMAX_MESSAGE_SIZE',`10485760')dnl
 10MB=10*1024*1024に制限(本文と添付ファイルの合計サイズ)。

 ◆通過MTA数上限を24HOPまでにする
define(`confMAX_HOP',`24′)dnl
 これはメールピンポン(ループ)を防止するための措置です。

 ◆あて先数上限の設定

 たくさんばら撒かれるのも困るので。
define(`confMAX_RCPTS_PER_MESSAGE',`128′)dnl

 ◆SMTP-AUTHの設定

 下記インストールされているかどうか確認します。インストールされていない場合はインストールしてください。
# rpm -qa | grep sasl
cyrus-sasl-plain-2.1.26-23.fc22.i686
cyrus-sasl-md5-2.1.26-23.fc22.i686
cyrus-sasl-lib-2.1.26-23.fc22.i686
cyrus-sasl-devel-2.1.26-23.fc22.i686
cyrus-sasl-2.1.26-23.fc22.i686
 SMTP-AUTHが動作するようにsaslauthdを起動します。
# systemctl enable saslauthd
# systemctl start saslauthd
 sendmailの設定で下記を有効化します。
define(`confAUTH_OPTIONS',`A')dnl

 ◆SMTP-AUTHの有効化
dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS',`EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')
↓
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
 ↑ 行頭のdnlを削除
define(`confAUTH_MECHANISMS',`EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')
 ↑ 行頭のdnlを削除
 必要なければdnlをつけたままにします。今回はLOGIN PLAINを有効にしていますので認証できるかどうかアカウントを作成し確認します。

 PLAIN:「認可識別子<NULL>認証識別子<NULL>パスワード」形式の平文によるユーザ認証方式
 LOGIN:LOGINもPLAIN同様、平文を用いた認証形式
 CRAM-MD5:チャレンジレスポンスによるパスワード認証
 DIGEST-MD5:CRAM-MD5の後継

 プレーンテキスト(LOGIN、PLAIN)の場合、SMTP AUTH用アカウントはUNIXパスワードを利用します。認証はSASLをインストールしたディレクトリに含まれるsaslauthdが行うため、事前にsaslauthdを起動しておく必要があります。
アカウントの作成
# saslpasswd2 -u bigbang.mydns.jp -c user
Password: パスワード入力
Again (for verification): パスワード再入力
作成されたアカウントの確認
# sasldblistusers2
user@bigbang.mydns.jp: userPassword
アカウントの削除方法
# saslpasswd2 -d user@bigbang.mydns.jp
 アカウント認証を確認させるためアカウントとパスワードをエンコードします。
アカウントのエンコード
# perl -MMIME::Base64 -e 'print encode_base64("user\@bigbang.mydns.jp");'
c2hpYmFAYmlnYmFuZy5teWRucy5qcA==
アカウントの確認
# sasldblistusers2
user@bigbang.mydns.jp: userPassword
パスワードのエンコード
# perl -MMIME::Base64 -e 'print encode_base64("password");'
cGFzc3dvcmQ=
メールサーバに接続し、認証機能の確認
# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 unknown ESMTP
ehlo localhost (入力)
250-bigbang.mydns.jp Hello server [192.168.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE 104857600
250-DSN
250-AUTH GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN SMTP-AUTH動作中
250-DELIVERBY
250 HELP
auth login (入力)
334 VXNlcm5hbWU6 「Username:」の意味
c2hpYmFAYmlnYmFuZy5teWRucy5qcA== (アカウント入力)
334 UGFzc3dvcmQ6 (入力)
SE43NmRmMw== 「Password:」の意味
235 2.0.0 OK Authenticated
quit (切断)
221 2.0.0 bigbang.mydns.jp closing connection
 作成したアカウントを削除します。
# saslpasswd2 -d user@bigbang.mydns.jp

 ◆STARTTLSを使うときの証明書置き場の設定

 使うときはdnlをはずします。
dnl define(`confCACERT_PATH',`/usr/share/ssl/certs')
 ↑ CAの証明書が保存されているディレクトリを指定
dnl define(`confCACERT',`/usr/share/ssl/certs/ca-bundle.crt')
 ↑ CA証明書を指定
dnl define(`confSERVER_CERT',`/usr/share/ssl/certs/sendmail.crt')
 ↑ sendmail用の証明書を指定
dnl define(`confSERVER_KEY',`/usr/share/ssl/certs/server.key')
 ↑ sendmailを動作させているサーバの秘密鍵を指定
dnl define(`confDONT_BLAME_sendmail',`groupreadablekeyfile')dnl
 ↑ コメントアウトする。
   サーバ秘密鍵のアクセス権が640であっても下記のようなエラーは出力されなくなる。
dnl DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
 ↓ 
DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
dnl ##### 下記はsasl認証使用時に25番ポートは認証しないように設定
DAEMON_OPTIONS(`Port=smtp, Name=MTA, M=A')dnl
 これでSTARTTLS用のポート587が開きます。接続できるか確認します。
# telnet localhost 587
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 unknown ESMTP
ehlo localhost (入力)
250-bigbang.mydns.jp Hello server [192.168.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE 104857600
250-DSN
250-AUTH GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN SMTP-AUTH動作中
250-STARTTLS
250-DELIVERBY
250 HELP
auth login (入力)
334 VXNlcm5hbWU6 「Username:」の意味
c2hpYmFAYmlnYmFuZy5teWRucy5qcA== (アカウント入力)
334 UGFzc3dvcmQ6 「Password:」の意味
cGFzc3dvcmQ= (パスワード入力)
235 2.0.0 OK Authenticated
quit
221 2.0.0 bigbang.mydns.jp closing connection
Connection closed by foreign host.
 指定したサーバ秘密鍵のアクセス権が600でない場合、下記のようなログが出力されます。
sendmail[****]: STARTTLS=server: file /etc/pki/tls/certs/server.key unsafe: Group readable file
 587ポートを使用して接続できるかどうかの確認方法は下記のとおりです。
openssl s_client -starttls smtp -connect [server]:587
 問題なく接続できれば、設定したSSL証明書等が表示されます。

 ◆SSL、TLSを使うときの設定

 上記STARATTLSの設定に加え、下記を実施します。
dnl DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl
 ↓ 
DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl
 メーラー(Thunderbird)の送信メールサーバの設定は下記のとおりです。
  サーバ名:設定したメールサーバ
  ポート番号:465
  接続の保護:SSL/TLS
  認証方式:暗号化されたパスワード認証
  ユーザ名:user@mail.bigbang.mydns.jp

 正常に送信できたときのmaillogは下記のようです。

Mar 23 18:21:49 centos7 sendmail[12727]: STARTTLS=server, relay=hogehoge.bigbang.dyndns.org [192.168.0.1], version=TLSv1/SSLv3, verify=NO, cipher=DHE-RSA-AES256-SHA, bits=256/256
Mar 23 18:21:49 centos7 sendmail[12727]: AUTH=server, relay=hogehoge.bigbang.dyndns.org [192.168.0.1], authid=user@mail.bigbang.mydns.jp, mech=CRAM-MD5, bits=0
Mar 23 18:21:49 centos7 sendmail[12727]: u2N9LnMO012727: from=<user@mail.bigbang.mydns.jp>, size=360, class=0, nrcpts=1, msgid=<56F2602D.6020309@mail.bigbang.mydns.jp>, proto=ESMTP, daemon=TLSMTA, relay=hogehoge.bigbang.dyndns.org [192.168.0.1]
Mar 23 18:21:49 centos7 sendmail[12728]: u2N9LnMO012727: to=<user@localhost>, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=30546, dsn=2.0.0, stat=Sent


 ◆送信保留メールの再送信間隔を5分に
define(`confMIN_QUEUE_AGE',`300m')dnl

 ◆送信保留メールを保持するのを5日(これは長い)
define(`confTO_QUEUERETURN',`5d')dnl

 ◆送信失敗の通知タイミングを4時間に
define(`confTO_QUEUEWARN',`4h')dnl

 ◆Load Averageが値まで上昇時の送信キュー保留
dnl define(`confQUEUE_LA',`12′)dnl

 ◆Load Averageが値まで上昇時の接続拒否
dnl define(`confREFUSE_LA',`18′)dnl

 ◆IDENTのクエリの待ち時間を設定

 0がよい。
define(`confTO_IDENT',`0′)dnl

 ◆mailertableとvirtusertableファイルの設定
FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl

 ◆リダイレクト機能

 /etc/mail/aliaseにhoge:hoge@hoge.com.REDIRECTのように記載すると、受信者であるhogeユーザのアドレスが「hoge@hoge.com」であるというメッセージを発信者に返します。
FEATURE(`redirect')dnl

 ◆すべての発信者アドレスにサーバのホスト名の追加

 ホスト名というのはFQDNです。「xxx@mail.hogehoge.local」のような感じになります。
 ※そうじゃなくて「xxx@hogehoge.local」にしたい場合は下のほうのマスカレードを設定してください。
 /etc/hostsか、hostnameコマンドの文字列のどちらかで、FQDNとなっているものが@の後ろにくっつきます。
 むしろ、/etc/hostsかhostnameのどちらにもFQDNが設定されていない場合(というか、自分の名前解決が正常にできない場合)sendmailの動作がおかしくなってしまうことに問題がありますので、サーバにFQDNとこのalways_add_domainは必ず設定しておきます。
FEATURE(always_add_domain)dnl

 ◆/etc/mail/local-host_namesの使用
FEATURE(use_cw_file)dnl

 ◆/etc/mail/trusted-usersからの信頼するユーザの読み込み
FEATURE(use_ct_file)dnl

 ◆/etc/mail/accessの使用
FEATURE(`access_db',`hash -T -o /etc/mail/access.db')dnl

 ◆rootからのメールの場合だけはマスカレードしない

 rootからのメールもマスカレードする場合は、dnlを先頭につけて無効化します。
EXPOSED_USER(`root')dnl

 ◆localhost以外からの送信

 初期状態では、DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnlと、なっており、SMTP接続を受け付けるアドレスを127.0.0.1からに限定してます。
 このままでは外部からのSMTP接続を受け付けられないので、dnlを先頭につけて無効化するか、DAEMON_OPTIONS(`Port=smtp,Addr=192.168.0.1, Name=MTA')dnl などと、接続をListenするインターフェースを指定します。
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
↓
DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl
 ただし、そのままではオープンリレー(誰でもかまわずリレーしてしまう)サーバとなってspamメール送信のための踏み台となってしまうので、/etc/mail/accessで適切にリレー制限を行う必要があります。

 ◆名前解決できないドメインからのメールの受け付け
FEATURE(`accept_unresolvable_domains')dnl

 ◆このサーバをMXレコードにしているドメインからの中継の許可

 あまりよいものではないので、dnlにしておくほうがよいでしょう。
dnl FEATURE(`relay_based_on_MX')dnl

 ◆送信メールにドメイン名強制付加

 ここに書かれたドメインが送信メールに必ずつくようになります。「マスカレード」といいます。自分の好きなドメインがつけられるか、いやおうなしにサーバのFQDNがつくかが、上のalways_add_domainとの違いです。
MASQUERADE_AS(`hogehoge.local')dnl

 ◆エンベロープアドレス

 エンベロープアドレス(SMTPコマンド中で「MAIL FROM:」で入力するとこです)でマスカレードするらしいです。普通は必要ないです。
dnl FEATURE(masquerade_envelope)dnl
dnl FEATURE(`.hogehoge.local')dnl

 ◆Received: from localhost.localdomain等の書き換え

 ローカルホストからメール送信した場合、ヘッダー情報が下記のようになっていました。
Received: from localhost.localdomain 
        by localhost.localdomain (8.12.8/8.12.8) with ESMT
 調べたところ下記を追記したところ一部書き換わるようになりました。
Dw自ホスト名
Dm自ドメイン
define(`confDOMAIN_NAME', `自ホストのFQDN')dnl
 変更前のヘッダー抜粋
Return-Path: <root@bigbang.dyndns.org>
Received: from mail.hoge.co.jp by mailsv.hoge.co.jp with ESMTP
          id <20110629131300995.TMDP.7162.mailsv.hoge.co.jp@mta103.hoge.co.jp>
          for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 22:13:00 +0900
Received: from emta103.hoge.co.jp by mail.hoge.co.jp with ESMTP
          id <20110629131300950.YIIU.6719.mail.hoge.co.jp@mta103.hoge.co.jp>
          for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 22:13:00 +0900
Received: from localhost.localdomain ([***.***.***.***] [***.***.***.***])
          by emta103.hoge.co.jp with ESMTP
          id <20110629131300886.LIOW.7470.emta103.hoge.co.jp@mta103.hoge.co.jp>
          for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 22:13:00 +0900
Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
	by localhost.localdomain (unknown) with ESMTP id p5TDD0BB005837
	for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 22:13:00 +0900
Received: (from root@localhost)
	by localhost.localdomain (8.14.5/8.14.5/Submit) id p5TDD0vf005836
	for user@mq.hoge.co.jp; Wed, 29 Jun 2011 22:13:00 +0900
Date: Wed, 29 Jun 2011 22:13:00 +0900
From: root <root@bigbang.dyndns.org>
Message-Id: <201106291313.p5TDD0vf005836@localhost.localdomain>
 変更後のヘッダー抜粋
Return-Path: <root@bigbang.dyndns.org>
Received: from mail.hoge.co.jp by mailsv.hoge.co.jp with ESMTP
          id <20110629140827222.TQFI.7162.mailsv.hoge.co.jp@mta103.hoge.co.jp>
          for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 23:08:27 +0900
Received: from emta103.hoge.co.jp by mail.hoge.co.jp with ESMTP
          id <20110629140827177.YKVS.6719.mail.hoge.co.jp@mta103.hoge.co.jp>
          for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 23:08:27 +0900
Received: from bigbang.dyndns.org ([***.***.***.***] [***.***.***.***])
          by emta103.hoge.co.jp with ESMTP
          id <20110629140827109.LKLS.7470.emta103.hoge.co.jp@mta103.hoge.co.jp>
          for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 23:08:27 +0900
Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
	by bigbang.dyndns.org (unknown) with ESMTP id p5TE8Q1n007114
	for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 23:08:26 +0900
Received: (from root@localhost)
	by localhost.localdomain (8.14.5/8.14.5/Submit) id p5TE8QDu007113
	for user@mq.hoge.co.jp; Wed, 29 Jun 2011 23:08:26 +0900
Date: Wed, 29 Jun 2011 23:08:26 +0900
From: root <root@bigbang.dyndns.org>
Message-Id: <201106291408.p5TE8QDu007113@localhost.localdomain>
 しかし、赤い部分がまだ残ってしまいました。さらに、調べてみると/etc/hostsの127.0.0.1のホスト部分の先頭にホスト名を追記すると変更される事がわかりました。
# vi /etc/hosts
127.0.0.1	mailb.bigbang.dyndns.org localhost.localdomain localhost
 変更前のヘッダー抜粋
Return-Path: <root@bigbang.dyndns.org>
Received: from mail.hoge.co.jp by mailsv.hoge.co.jp with ESMTP
          id <20110629140827222.TQFI.7162.mailsv.hoge.co.jp@mta103.hoge.co.jp>
          for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 23:08:27 +0900
Received: from emta103.hoge.co.jp by mail.hoge.co.jp with ESMTP
          id <20110629140827177.YKVS.6719.mail.hoge.co.jp@mta103.hoge.co.jp>
          for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 23:08:27 +0900
Received: from bigbang.dyndns.org ([***.***.***.***] [***.***.***.***])
          by emta103.hoge.co.jp with ESMTP
          id <20110629140827109.LKLS.7470.emta103.hoge.co.jp@mta103.hoge.co.jp>
          for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 23:08:27 +0900
Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
	by bigbang.dyndns.org (unknown) with ESMTP id p5TE8Q1n007114
	for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 23:08:26 +0900
Received: (from root@localhost)
	by localhost.localdomain (8.14.5/8.14.5/Submit) id p5TE8QDu007113
	for user@mq.hoge.co.jp; Wed, 29 Jun 2011 23:08:26 +0900
Date: Wed, 29 Jun 2011 23:08:26 +0900
From: root <root@bigbang.dyndns.org>
Message-Id: <201106291408.p5TE8QDu007113@localhost.localdomain>
 変更後のヘッダー抜粋
Return-Path: <root@bigbang.dyndns.org>
Received: from mail.hoge.co.jp by mailsv.hoge.co.jp with ESMTP
          id <20110629140827222.TQFI.7162.mailsv.hoge.co.jp@mta103.hoge.co.jp>
          for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 23:08:27 +0900
Received: from emta103.hoge.co.jp by mail.hoge.co.jp with ESMTP
          id <20110629140827177.YKVS.6719.mail.hoge.co.jp@mta103.hoge.co.jp>
          for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 23:08:27 +0900
Received: from bigbang.dyndns.org ([***.***.***.***] [***.***.***.***])
          by emta103.hoge.co.jp with ESMTP
          id <20110629140827109.LKLS.7470.emta103.hoge.co.jp@mta103.hoge.co.jp>
          for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 23:08:27 +0900
Received: from mailb.bigbang.dyndns.org (mailb.bigbang.dyndns.org [127.0.0.1])
	by bigbang.dyndns.org (unknown) with ESMTP id p5TE8Q1n007114
	for <user@mq.hoge.co.jp>; Wed, 29 Jun 2011 23:08:26 +0900
Received: (from root@localhost)
	by mailb.bigbang.dyndns.org (8.14.5/8.14.5/Submit) id p5TE8QDu007113
	for user@mq.hoge.co.jp; Wed, 29 Jun 2011 23:08:26 +0900
Date: Wed, 29 Jun 2011 23:08:26 +0900
From: root <root@bigbang.dyndns.org>
Message-Id: <201106291408.p5TE8QDu007113@mailb.bigbang.dyndns.org>

 ◆配信エージェントの設定

 配信エージェントにsmtpとprocmailを使っているという宣言です。必ず一番最後に書かなくてはなりません。Cyrus-IMAPを使う場合などは
MAILER(`cyrusv2′)dnl
MAILER(smtp)dnl
などとしますが、普段は特別変更する必要もないでしょう。
MAILER(smtp)dnl
MAILER(procmail)dnl
 以上で、sendmail.cfを作成する準備が出来ました。ここで説明した設定内容は基本的なモノばかりで、それ以外についてはsendmailのサイトなどを参考にして 下さい。

 ◆パーセントハックの禁止

 @(アットマーク)より、前に書かれているアドレスを「ローカルパート」といいますが、このローカルパート部に、強制的に他のメールアドレスへリレーさせるための記述を行い、関係のないメールサーバを踏み台としてSPAMメールを送信するという方法があります。
 このようなSPAMメールの踏み台にさせないために、[メールリレーの制限]に[メールを促すアドレスについての対応]として、ローカルパート部に、%(パーセント)、!(エクスクラメーションマーク)、'(シングルクォート)、"(ダブルクォート)のいずれかが含まれている場合には、メールの受け取りを拒否するという設定をすることができます。
	RCPT TO:sales%xxx.com@hoge.co.jp
 具体的には上記のようなメールアドレスは全て拒否するということです。
この方法は有効か?
define(`confOPERATORS', `%.:@!^/[]+')dnl 
 以下の方法ではどうか?。sendmail.mcの最終行に以下を追記。
※以下の記述の「hoge.jp」はみなさんの環境に合わせて書き換えてください。
#vi /etc/mail/sendmail.mc
?省略?
LOCAL_CONFIG
Kallnumbers regex -a@MATCH ^.+[\%].+$
LOCAL_RULESETS
SLocal_check_rcpt
# check address against various regex checks
R$*                    $: $>Parse0 $>3 $1
R$+ < @ hoge.jp > $*   $: $(allnumbers $1 $)
R@MATCH                $#error $@ 5.7.1 $: "550 Relaying denied"
 sendmail.cf作成。sendmailを再起動します。

「sendmail.cf」の作成

 ソースファイルからインストールした場合、sendmail.mcファイルの作成が終われば、sendmail.cfファイルを作成しましょう。作業は、sendmail.mcファイルを作成 したのと同じディレクトリで行います。
 まずは、「sendmail.cf」ファイルの作成です。
 **1: # make sendmail.cf
 **2:  rm -f sendmail.cf
 **3:  m4 ../m4/cf.m4 sendmail.mc > sendmail.cf || ( rm -f sendmail.cf && exit 1 )
 **4:  chmod 444 sendmail.cf
などの表示があれば、sendmail.cfファイルが作成されています。
 次はインストールです。
 **5: # make install-cf CF=config
 **6:  ./../devtools/bin/install.sh -c -o root -g bin -m 0444 sendmail.cf
 **7: ../../devtools/bin/install.sh -c -o root -g bin -m 0444 submit.cf /etc/mail/submit.cf
となど表示されれば、作成されたsendmail.cfとsubmit.cfが適切なディレクトリへインストールされます。
 rpmパッケージからsendmailをインストールした場合は、sendmail.mcの編集が終われば、
 **1: # m4 /usr/share/sendmail-cf/m4/cf.m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
と、入力してください。これで、適切なsendmail.cfファイルが作成され、適切なディレクトリへ配置されます。

 /etc/mail/virtusertableについて

 virtusertableは仮想ドメインおよび仮想メールボックスに対するアドレスを実際のメールボックスと対応づけます。これらのメールボックスにはローカル、リモート、 /etc/aliasesに定義されたエイリアス、またはファイルを使用できます。
root@example.com                root
postmaster@example.com          postmaster@noc.example.net
@example.com                    joe
@sm.hoge.co.jp                  %1@hoge.com
 上の例ではexample.comドメインへの対応づけをしています。このファイルはファイルの下までファーストマッチ(訳注: 一致するルールが複数ある場合、一番最初に一致したルールが適用されること)で処理されます。 はじめの行ではroot@example.comをローカルのrootメールボックスに対応づけています。
 次のエントリではpostmaster@example.comをnoc.example.netホスト上のpostmasterメールボックスに対応づけています。今までのところではexample.comに関して何も一致しない場合、最後のエントリと一致するでしょう。これはexample.comの誰かに送ったすべてのメールが一致します。これはjoeのローカルメールボックスに対応づけられています。
「sm.hoge.co.jp」ホスト宛のメール全てを「hoge.com」に転送しています。「%1」はワイルドカードで、「@hoge.com」の左のユーザ名の部分を補います。
 つまり、この設定では「matsuzaka@sm.hoge.co.jp」宛のメールであれば、「matsuzaka@hoge.com」に転送されます。

●メールキュー

 滞留しているメールキューは下記のように確認します。
 下記のメールはインターネット宛にメールを送信しています。
 しかし、送信元のドメイン名(bigbang.dyndnd.org)を/etc/mail/accessで中継することを許可していないため滞留メールとなってしまっています。
 もし、許可したとしてもインターネットプロバイダ側で存在しないドメインメイトして中継を拒否されます。この場合、送信元のドメイン名(bigbang.dyndnd.org)が間違っているのでエラーメールも返って来ません。
# mailq
                /var/spool/mqueue (1 request)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
p646CURg023292*       5 Mon Jul  4 15:12 <root@bigbang.dyndnd.org>
                                         <hoge@mail.server.com>
                Total requests: 1
 詳細な情報を表示したい場合は「-v」オプションを付加します。
# mailq -v
		/var/spool/mqueue (1 request)
-----Q-ID----- --Size-- -Priority- ---Q-Time--- --------Sender/Recipient--------
p646CURg023292-       5     120343 Jul  4 15:12 <root@bigbang.dyndnd.org>
                 (Deferred: 450 Unable to find bigbang.dyndnd.org) ← 滞留している理由
						<haa81380@syd.odn.ne.jp>
		 (Deferred: 450 Unable to find bigbang.dyndnd.org) ← 滞留している理由
		Total requests: 1
 この時のメールログの内容は下記のようになっていました。

Jul 4 15:12:30 neko sendmail[23291]: p646CTTD023291: from=root@bigbang.dyndnd.org, size=47, class=0, nrcpts=1, msgid=<201107040612.p646CTTD023291@mailb.bigbang.dyndns.org>, relay=root@localhost
Jul 4 15:12:30 neko sendmail[23292]: p646CURg023292: from=<root@bigbang.dyndnd.org>, size=343, class=0, nrcpts=1, msgid=<201107040612.p646CTTD023291@mailb.bigbang.dyndns.org>, proto=ESMTP, daemon=MTA, relay=mailb.bigbang.dyndns.org [127.0.0.1]
Jul 4 15:12:30 neko sendmail[23291]: p646CTTD023291: to=haa81380@syd.odn.ne.jp, ctladdr=root@bigbang.dyndnd.org (0/0), delay=00:00:01, xdelay=00:00:00, mailer=relay, pri=30047, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (p646CURg023292 Message accepted for delivery)
Jul 4 15:12:43 neko sendmail[23294]: p646CURg023292: to=<haa81380@syd.odn.ne.jp>, delay=00:00:13, xdelay=00:00:13, mailer=relay, pri=120343, relay=smtp01.odn.ne.jp. [143.90.14.5], dsn=4.0.0, stat=Deferred: 450 Unable to find bigbang.dyndnd.org

 滞留しているキューを削除するには下記のようにします。
# ls -l /var/spool/mqueue
合計 8
-rw------- 1 root smmsp   5  7月  4 15:12 dfp646CURg023292
-rw------- 1 root smmsp 908  7月  4 15:43 qfp646CURg023292
 上記qmailコマンド実行結果に表示されている「Q-ID」と/var/spool/mqueueで表示されているファイル名の共通部分「p646CURg023292」に着目して、/var/spool/mqueueで表示されているファイル名2つを削除します。削除後、mailqコマンドで該当キューがなくなっていることを確認します。
  qfから始まるファイルは、ヘッダー情報が格納されています。
  dfから始まるファイルには、本文が格納されています。
# rm -f /var/spool/mqueue/[dq]fp646CURg023292
# ls -l /var/spool/mqueue | grep p646CURg023292
# ← 何も表示されなければOK
# mailq
/var/spool/mqueue is empty
		Total requests: 0
 滞留していたキュー(Q-ID:p646CURg023292)がなくなっていることが分かります。
 多くのキューが滞留しているうち一部のみを削除する場合は/var/log/maillogを参照しながら、慎重に作業する必要があります。

●プロバイダからのメールが届かない

 「/etc/mail/local-host-names」に自メールサーバのホスト名を記載してください。
 TCPwrapperを利用している場合には、「/etc/hosts」に下記にように追記してください
sendmail : ALL

●Maildir形式メールボックス作成

 新規ユーザ追加時ホームディレクトリにMaildir形式のメールボックスが自動的に作成されるようにします。
# mkdir -p /etc/skel/Maildir/new
# mkdir -p /etc/skel/Maildir/cur
# mkdir -p /etc/skel/Maildir/tmp
# chmod -R 700 /etc/skel/Maildir/

●Maildir形式へメールボックス対応

 sendmailはMaildir形式メールボックスに対応していないません。ProcmailでMaildir形式メールボックスへ配送するようにします。
# vi /etc/procmailrc
SHELL=/bin/bash
PATH=/usr/bin:/bin
DROPPRIVS=yes
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
#LOGFILE=$HOME/procmail.log # ログ出力先
#VERBOSE=ON # 詳細ログ出力
 ここで、sendmailを再起動します。procmailについてはprocmailとは?を参照してください。
 後は、Dovecot 2.0の設定方法を参照して、Dovecotを設定します。

●不正リレーのチェック

 第三者中継チェックで確認できます。