メールサーバーの構築

■概要
プロバイダなどから
Fetchmail (メールの受信)

Postfix (メールサーバー)

Procmail SpamAssassin & bsfilter
(スパム・メールのフィルタリングと携帯への転送)

メール・スプール

Dovecot (IMAPサーバー)

メールを読む
SquirrelMail (Webメーラー)
■使用するパッケージがインストールされているかの確認
# rpm -q sendmail postfix
sendmail-8.13.4-2
postfix-2.2.2-2

# rpm -q dovecot
dovecot-0.99.14-4.fc4

# rpm -q procmail
procmail-3.22-16

# rpm -q spamassassin
spamassassin-3.0.3-4.fc4

# rpm -q fetchmail
fetchmail-6.2.5-7
■設定
Postfix (メールサーバー)
Dovecot (IMAPサーバー)
Procmail (メール振り分け)
SpamAssassin & bsfilter (スパム対策)
Fetchmail (メールの受信)
(1) root権限に切り替え
[d1@localhost ~]$ su -
Password:
(2) sendmailの停止
[root@localhost ~]# /etc/rc.d/init.d/sendmail stop
sendmail を停止中:                                         [  OK  ]
sm-client を停止中:                                        [  OK  ]
(3) MTAの切り替え
sendmail -> postfix
[root@localhost ~]# alternatives --config mta ← CUI
[root@localhost ~]# system-switch-mail ← GUI
(4) Postfixの起動
[root@localhost ~]# /etc/rc.d/init.d/postfix start
postfix を起動中:                                          [  OK  ]
[root@localhost ~]# chkconfig postfix on
[root@localhost ~]# chkconfig --list postfix
postfix         0:off   1:off   2:on    3:on    4:on    5:on    6:off
(5) Postfixの設定
[root@localhost ~]# vi /etc/postfix/main.cf
1. FQDN の設定を無効にする。ローカルでのみの使用の為。
#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
初期状態のままでよい
関係のありそうな項目

このメールシステムのインターネットホスト名。
myhostname (default: see "postconf -d" output)

このメールシステムのインターネットドメイン名。
mydomain (default: see "postconf -d" output)

ドメイン名で、ローカルで投函されたメールはそこから来たように見え、またローカルで投かんされたメールはそこに配送されます。
myorigin (default: $myhostname)

2. 外部からのメール配送を受け付ける。
inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost
localhost を無効にし all を有効にする
関係のありそうな項目

このメールシステムがメールを受け取るネットワークインターフェースアドレス。
inet_interfaces (default: all)

3. 届けられたメールが自分宛かどうかを判断するためのパラメータを設定する。
mydestination = $myhostname, localhost.$mydomain, localhost
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
#       mail.$mydomain, www.$mydomain, ftp.$mydomain
初期状態のままでよい

relay_domains = $mydestination
初期状態のままでよい
関係のありそうな項目

$local_transport メール配送 transport を使って配送されるドメインのリスト。
mydestination (default: $myhostname, localhost.$mydomain, localhost)

このシステムがメールをリレーしようとする配送先のドメイン (およびそのサブドメイン)。
relay_domains (default: $mydestination)

4. 信頼されたSMTPクライアントの設定をする。
#mynetworks_style = class
mynetworks_style = subnet
#mynetworks_style = host
初期状態のままでよい

mynetworks = 192.168.1.0/24, 127.0.0.0/8
上記のように変更する
関係のありそうな項目

mynetworks パラメータのデフォルト値を生成する方法。
mynetworks_style (default: subnet)

"よそ者" よりも多くの権限を持つ "信頼された" SMTPクライアントのリスト。
mynetworks (default: see "postconf -d" output)

5. メールボックス形式をMaildir形式にする。
#home_mailbox = Mailbox
home_mailbox = Maildir/
Maildir/ を有効にする
関係のありそうな項目

オプションのメールボックスファイルの local(8) ユーザのホームディレクトリからの相対パス名。
home_mailbox (default: empty)

6. Procmailと連携を行う。
mailbox_command = /usr/bin/procmail
上記のように変更する
関係のありそうな項目

メールボックス配送に local(8) 配送エージェントが使う、オプションの外部コマンド。
mailbox_command (default: empty)

7. バナーを非表示にする。
smtpd_banner = $myhostname ESMTP
上記のように変更する
関係のありそうな項目

SMTP グリーティングバナーで 220 状態コードの後に続くテキスト。
smtpd_banner (デフォルト: $myhostname ESMTP $mail_name)

8. メール受信最大サイズの設定をする。
message_size_limit = 10240000
mailbox_size_limit = 51200000
最後らへんに追記
関係のありそうな項目

エンベロープ情報を含む、バイト単位のメッセージの最大サイズ。
message_size_limit (default: 10240000)

local(8) の個々のメールボックスまたは maildir の最大サイズ、もしくはゼロ (制限なし)。
mailbox_size_limit (default: 51200000)

9. スパム対策として、HELOコマンドの要求とVRFYコマンドの禁止を設定する。
smtpd_helo_required = yes
disable_vrfy_command = yes
最後らへんに追記
関係のありそうな項目

リモートSMTPクライアントが SMTP セッションの最初で HELO または EHLO コマンドで自己紹介することを要求します。
smtpd_helo_required (default: no)

SMTP VRFY コマンドを無効にします。これはEメールアドレス収集に使われるあるテクニックを止めます。
disable_vrfy_command (default: no)

10. ローカル受信者チェック
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
初期状態のままでよい
関係のありそうな項目

知らないローカルユーザを拒否
local_recipient_maps (default: proxy:unix:passwd.byname $alias_maps)

11. 接続制限
smtpd_client_restrictions = permit_mynetworks,
                            reject_rbl_client relays.ordb.org,
                            permit
必要であれば最後に追記
関係のありそうな項目

時間単位ごとにクライアントがこのサービスに接続を試行することが許される最大の接続試行数。
smtpd_client_restrictions (default: empty)

:wq ← vimのセーブして終了するコマンド
(6) Postfixの再起動
[root@localhost ~]# /etc/rc.d/init.d/postfix restart
postfix を停止中:                                          [  OK  ]
postfix を起動中:                                          [  OK  ]
(7) Maildirディレクトリの作成
d1 ユーザ用の設定。
[root@localhost ~]# mkdir /home/d1/Maildir ← メールディレクトリを作成。
[root@localhost ~]# chmod 700 /home/d1/Maildir ← アクセス権限を変更。
[root@localhost ~]# chown -R d1:d1 /home/d1/Maildir ← 所有者を変更。
(8) Procmailの設定
サーバ全体にフィルタを適用する。
[root@localhost ~]# vi /etc/procmailrc ← 新規に作成する
PATH=/bin:/usr/bin
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$HOME/.lockmail

# SpamAssassin
:0fw
|/usr/bin/spamc

## bsfilter 導入済みの場合 ↓ ##

# bsfilter
:0 fw
| /usr/local/bin/bsfilter --pipe --insert-flag --insert-probability

## bsfilter 導入済みの場合 ↑ ##
[root@localhost ~]# ← vimを終了して戻ってきた状態
(9) Dovecotの設定
[root@localhost ~]# vi /etc/dovecot.conf
1. DovecotをIMAPサーバーにする。
#protocols = imap imaps pop3 pop3s
protocols = imap
imap のみを有効にする
関係のありそうな項目

Protocols we want to be serving: imap imaps pop3 pop3s If you only want to use dovecot-auth, you can set this to "none".
protocols = imap imaps

2. メールボックスの形式を Maildir にする。
#default_mail_env =
default_mail_env = maildir:~/Maildir
初期状態のままでも動作するが、念のため設定しておく
関係のありそうな項目

Location for users' mailboxes. This is the same as the old default_mail_env setting.
mail_location =

:wq ← vimのセーブして終了するコマンド
(10) Dovecotの起動
[root@localhost ~]# /etc/rc.d/init.d/dovecot start
Dovecot Imap を起動中:                                     [  OK  ]
[root@localhost ~]# chkconfig dovecot on
[root@localhost ~]# chkconfig --list dovecot
dovecot         0:off   1:off   2:on    3:on    4:on    5:on    6:off
(11) SpamAssassinの起動
[root@localhost ~]# /etc/rc.d/init.d/spamassassin start
Starting spamd: を起動中:                                  [  OK  ]
[root@localhost ~]# chkconfig spamassassin on
[root@localhost ~]# chkconfig --list spamassassin
spamassassin    0:off   1:off   2:on    3:on    4:on    5:on    6:off
(12) root権限から一般ユーザ権限に戻る
[root@localhost ~]# exit
logout
(13) 各ユーザのProcmailの設定
[d1@localhost ~]$ vi .procmailrc ← 新規に作成する
SHELL=/bin/bash
PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Maildir
LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$HOME/.lockmail

SPAMMER_FROM=$HOME/.spammer_from

# From:, Reply-To:, Sender:, From のどれかに
# スパマーのメールアドレスが含まれていたらJunkに移動
:0
* ? test -s $SPAMMER_FROM
* ? (formail -x From: -x Reply-To: -x Sender: -x From | fgrep -iqf $SPAMMER_FROM)
$MAILDIR/.Junk/

# X-Spam が付いていない場合SpamAssassinに送る
#:0fw
#* !^X-Spam.*
#|/usr/bin/spamc

# SpamAssassinでスパム判定されたメールをJunkに移動
:0
* ^X-Spam-Status: Yes
$MAILDIR/.Junk/

## bsfilter 導入済みの場合 ↓ ##

# bsfilterでスパム判定されたメールをJunkに移動
:0
* ^X-Spam-Flag: Yes
$MAILDIR/.Junk/

# bsfilterでスパム判定されたメールをJunkに移動
:0
* ^X-Spam-Probability: *(1|0\.[89])
$MAILDIR/.Junk/

## bsfilter 導入済みの場合 ↑ ##

# メールを携帯に転送
:0 HBb
* < 1000
* ! \<html\>
! example@example.com
[d1@localhost ~]$ ← vimを終了して戻ってきた状態

スパマのメールアドレスを記述する。
[d1@localhost ~]$ vi .spammer_from ← 新規に作成する
example@example.com
foo@bar.com
bar@foo.com
[d1@localhost ~]$ ← vimを終了して戻ってきた状態
(14) Fetchmailの設定
[d1@localhost ~]$ vi .fetchmailrc
poll pop.example.or.jp ← POP3のアドレス
protocol POP3
username yourname ← 認証時の名前
password pass ← 認証時のパスワード
fetchall
[d1@localhost ~]$ ← vimを終了して戻ってきた状態

[d1@localhost ~]$ chmod 600 .fetchmailrc ← 権限を変更
(15) cronの設定
[d1@localhost ~]$ EDITOR=gedit crontab -e
# 15分間隔で実行
*/15 * * * * /usr/bin/fetchmail -s >/dev/null 2>&1

# 毎日午前2時に起動
0 2 * * * /usr/bin/sa-learn --spam --dir $HOME/Maildir/.Junk/cur/ >/dev/null 2>&1

# 毎日午前3時に起動
0 3 * * * /usr/bin/sa-learn --ham --dir $HOME/Maildir/cur/ >/dev/null 2>&1

## bsfilter 導入済みの場合 ↓ ##
0 2 * * * /usr/local/bin/bsfilter --add-spam $HOME/Maildir/.Junk/cur/ >/dev/null 2>&1

0 3 * * * /usr/local/bin/bsfilter --add-clean $HOME/Maildir/cur/ >/dev/null 2>&1

0 4 * * * /usr/local/bin/bsfilter --update
## bsfilter 導入済みの場合 ↑ ##

Q. Dovecot 起動時に以下のように表示され起動できない。
Can't use SSL /dovecot.pem Permission denied

A. SSL/TLS が不要であれば /etc/dovecot.conf ファイルを
# Disable SSL/TLS support.
ssl_disable = yes
のように変更してください。SSL/TLS が必要であれば
サーバー証明書等必要なファイルを作成してください。

■メールの送受信テスト
配送のテスト
# host -t mx example.co.jp
メール送信テスト
$ echo "This is a test message." | mail -s 'TEST' d1

$ mail d1 ← d1 ユーザに送る
Subject: TEST ← 題名
This is a test message. ← 本文
. ← メールの終わり
Cc: ← 何も入力しない
スパムメールテスト
$ echo "XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X" | mail -s 'TEST' d1
d1@localhost.localdomain
root@localhost.localdomain
Postfix
項目名 設定
myhostname  
mydomain  
myorigin  
inet_interfaces inet_interfaces = all
mydestination mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks mynetworks = 192.168.1.0/24, 127.0.0.0/8
home_mailbox home_mailbox = Maildir/
mailbox_command mailbox_command = /usr/bin/procmail
Dovecot
項目名 設定
protocols protocols = imap