スパムフィルタの適用実績を調べる

Postfix の main.cf で

smtpd_client_restrictions =
    reject_rbl_client bl.spamcop.net,
    # 中略…
    permit

のように複数のブラックリストデータベース(MAPS RBL)を設定していて、実際どれが使われているのか判断したい場合、以下のようにして実際に何件のメールについてブロックが適用されたか調べられます。
 

$ cat /var/log/maillog | perl -ne ‘if(/blocked using (.+?);/){print $1.”\n”;}’ | sort | uniq -c

結果例:

$ cat /var/log/maillog | perl -ne ‘if(/blocked using (.+?);/){print $1.”\n”;}’ | sort | uniq -c
  45 bl.spamcop.net
   4 list.dsbl.org
   7 sbl-xbl.spamhaus.org

procmail を使う

procmail とはメール受信時の振り分け、フィルタリングなどを行うためのメール処理プログラムです。
 
Postfix で利用するためには、メール受信ユーザのホームディレクトリに
以下の内容をもつ .forward ファイルを作成します(両端のダブルクォーテーションも必要)。

“|IFS=’ ‘&&exec procmailのフルパス -f-||exit 75 #ログインユーザ名”

例:
/home/john

“|IFS=’ ‘ && exec /usr/local/bin/procmail -f-||exit 75 #john”

 
次に同様に .procmailrc ファイルを作成します。

MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$MAILDIR/.procmail.lock
# — 例1:未承諾広告を捨てる
:0 H
* ^Subject:.*iso-2022-jp
* ^Subject:.*\/.*
* ? echo “$MATCH” | nkf -me | egrep ‘※未承諾広告’
/dev/null
# — 例2:エイリアスによる script@example.org 宛のメールの内容(ヘッダ含む)を /usr/local/bin/dosomething.sh に渡して実行する
:0
* ^To:.*script@example.org

/usr/local/bin/dosomething.sh

前者はメールフィルタリングの例です。
後者はメールをトリガとして任意のプログラムを実行する例です。このようにすることで自動応答メール等様々な用途で利用できます。
 
~/.forward がない場合、main.cf の mailbox_command 変数で指定されたコマンド, mailbox_cmmand も指定されていない場合は通常のメール配送を行います。
procmail を実行した時に ~/.procmailrc がない場合も(procmail が)単純にメール配送を行います。
 
なお、仮想ドメインのメールボックスでは .forward ファイルおよび main.cf での mailbox_command は参照されないため、 procmail 等コマンド実行は適用されません。
このため、仮想ドメインのメールアドレスで procmail を扱うためには virtual_alias_maps でそのメールアドレスのみローカルのリアルユーザにエイリアスする必要があります。
 

例:
foo@example.org 宛のメールをリアルユーザ mailuser で受け取る場合…
main.cf

# …略…
# @localhost のみリアルユーザとする(仮想ドメインを含めないこと)
mydestination = localhost
# …略…
# 仮想メールアカウントのエイリアス
virtual_alias_maps = hash:/etc/postfix/viatual
# 仮想メールアカウントのメールボックス
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps

/etc/postfix/virtual

foo@example.com mailuser@localhost

/etc/postfix/virtual_mailbox_maps

# (エイリアスしたものは含めません)
# example.com
info@example.com example.com/info
postmaster@example.com example.com/postmaster
root@example.com example.com/postmaster
# example.net
info@example.net example.net/info
postmaster@example.net example.net/postmaster
root@example.net example.net/postmaster

以下のコマンドを実行

# cd /etc/postfix
# postmap hash:virtual_mailbox_maps
# postmap hash:virtual
# postfix reload

あとは前述のとおり mailuser のホームディレクトリ(例: /home/mailuser/ )に .forward, .procmailrc を作成すれば foo@example.com に対して procmail が利用できます。
 
参考:
Advanced Email Forwarding
Manpage of PROCMAILRC(JM Project による和訳)
Postfix 設定パラメータ
.procmailrc の書き方
Virtual環境での.forward が有効になりません(postfix-jp: 425)
Postfix 設定パラメータ

Postfix での Port 25 Blocking 対策

Outbound Port 25 Blocking により、外部にSMTP が通せない環境でメールサーバを運用する場合、次のいずれかの対応方法をとる必要があります。
1.プロバイダのメールサーバに転送する
2. サブミッションポート(Submission Port)が使える外部のメールサーバに転送する
 
1 の場合で認証が不要な場合は、main.cf に以下を加えることで簡単に対応することができます。
main.cf:

relayhost = smtp.nifty.com

smtp.nifty.com は自分のプロバイダの SMTP サーバに置き換えてください。
 
1 で認証が必要な場合、あるいは、2 の場合は普通認証を必要としますが、この場合は Cyrus SASL 対応の Postfix を使うことで、認証付きのリレーが可能になります。
main.cf:

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/saslpass
relayhost = [smtp.nifty.com]:587
smtp_use_tls = yes # optional

relayhost は自分が使う SMTP サーバ、ポート番号に置き換えてください(587 はサブミッションポートを使う場合)
 
次に、smtp_sasl_password_maps で指定したファイルを作成します。
saslpass:

# 書式:”relayhostに指定した値”<space>”認証ユーザ名”:”認証パスワード”
[smtp.nifty.com]:587 user:pass

作成後、postmap で saslpass.db を生成します。

$ cd /etc/postfix/
$ postmap saslpass

 
このままでも動作しますが、ここでセキュリティを考慮するのであれば、元としたプレインテキストのパスワードファイル saslpass は削除しておくべきでしょう。

$ rm saslpass

 
あとは Postfix を再起動し、好きなメーラを使って動作確認を行えば完了です。ここでは CUI の mail コマンドの例を示します。

$ mail -s test foo@example.com
hello, world
.

(foo@exmple.com は自分が確認できる任意のメールアドレス)
 
参考:
Re: プロパイダのsmtpホストが smtp authを要求してる場合(Postfix-jp ML:1685)
  ぷらら環境での Postfix 設定。
25番ポートブロック対策について(Fedoraで自宅サーバー構築BBS)
  @nifty 環境での Postfix 設定。
Postfix で、Gmail にメールをリレーする(私の二次記憶)
  Postfix + Gmail
postconf(5)(Postfix 日本語マニュアル)

Postfix でバーチャルドメインを利用した例

/etc/postfix/main.cf
# 略.. プログラムの指定
myhostname = foo.example.org
mydomain = example.org
myorigin = $mydomain
inet_interfaces = all
# 実ユーザに配送したくないため mydestination にはあえて何も指定しない
mydestination=
# LAN も信頼しない
mynetworks_style = host
#
# 略.. プログラムのパス指定やグループ指定, オプションのディレクトリ指定など
#
virtual_alias_maps = hash:/etc/postfix/v_alias_maps
# virtual_alias_maps で指定するディレクトリパスのルートディレクトリ。
virtual_mailbox_base=/var/vmaildir
# このサーバで処理する(virtual_alias_maps で解決する)ドメインの一覧
virtual_mailbox_domains = example.org, example.net, example.com
# どのユーザをどの UID で処理するかの対応づけ。static なら全てに適用。
virtual_uid_maps = static:5000
# どのユーザをどの GID で処理するかの対応づけ。
virtual_gid_maps = static:5000
#

/etc/postfix/v_alias_maps
# 最後に postmap hash:v_alias_maps として更新すること
# 空白区切りで メールアドレス ディレクトリ を指定する
# 指定したディレクトリを Maildir として扱う
# email dir
root@example.com exmaple.com/postmaster/
john@eaxmple.com example.com/john/
 
root@example.org example.org/postmaster/
# ユーザ名前を省略すると、そのドメインについてユーザが存在しない場合にマッチする
@example.org example.org/allusers/
 
@example.net example.net/postmaster/

Postfix をローカル配送専用に設定する

SMTP サーバ、 POP3 サーバとして XMail(1.20) を使っている時に、sendmail の仕様が妙だったため、sendmail プログラムは Postfix を使っていました。その時の、Postfix の設定方法概略です。

main.cf:
# (略)
# 取得ドメインを example.org, サーバのホスト名を foo とする場合の設定
myhostname = foo.example.org
mydomain = example.org
myorigin = $mydomain
inet_interfaces = localhost
# 決して Postfix でメール配送を完結させないような、存在しないドメイン名を指定する(こんなみっともない事せず空っぽでいいのかも…)
# mydestination =
mydestination = no.domain.for.localmailer.localhost
mynetworks_style = host
# (以下略)

master.cf:
# inet はコメントアウト。unix はコメントアウトしない。
# smtp inet n – n – – smtpd
smtp unix – – n – – smtp

Postfix + Cyrus SASL で Outlook でも SMTP Auth

– broken なメールクライアントであるところの Outlook で SMTP Auth を使うには、 postfix の main.cf で次の記述が必要。

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain

ただし LOGIN しか使えないので POP before SMTP のほうがまだマシ。
http://uniunix.net/contents/postfix.html
– Linux Lovers -Fedora Coreで始めるサーバ構築-: Postfix の設定