postfix logo Postfixのぺーじ
− Postfix Q and A
更新: 2005年2月19日 [English Page]


ホームオリジナルドキュメント >Postfix Q and A


この Q & A は Postfix-JP メーリングリストからの情報など、 Postfix 2.0 以前に付属していた FAQ には載っていない 情報を集めています。 ここに掲載したもの以外に、Postfix を導入したり運用する上で 戸惑ったり失敗した点などありましたら、ML もしくは私に教えて下さい。 このページを作る参考にしたいと思います。

中満さんのご厚意により、中満さんが作られた Postfix FAQ の内容をこちらの Q & A に取り込ませていただきました。


Index


1. Postfix について

Q 1.1. Postfix って何?

A. Postfix はこれまで世界中で非常に多く使われてきた、sendmail に代わる プログラムとして IBM の支援の元に Wietse Venema によって開発された MTA (Mail Transport Agent) です。sendmail との互換性を保ちながら 速く、管理が容易で安全なソフトウェアを目指しています。

Q 1.2. Postfix は日本語のメールも大丈夫?

A. これまでのところ、私のところでは日本語の本文・ヘッダに関して問題が 起こったことはありませんし、聞いたこともありません。なにか問題があれば すでにどこかで表面化していることでしょう。RFC にしたがって本文は JIS、ヘッダは MIME B エンコードをしている場合はもちろんのこと、 ヘッダや本文を EUC や Shift-JIS で書いてあるものも簡単にテストして みましたが、問題はなさそうです。To: "漢字名" <user@domain.name> の形式で JIS コードを使うとメールが送れないことがありますが、 sendmail でも同様に送れませんでした。 ただし、途中の SMTP サーバが 8bit 文字を 7bit に変換する場合が ありますし、MUA (Mail User Agent) が RFC にしたがっていないヘッダや 本文を処理できるとは限らないので、 RFC 1468 に従ったメールを送るべきでしょう。

Q 1.3. IPv6 には対応しているの?

A. Postfix は公式には IPv6 をサポートしていませんが、BSD 系の OS に関しては KAME Project で snapshot 用の IPv6 対応 Patch を当てることで v4 と v6 の共存が できるようになるようです。この Patch を元にした最新公式リリース対応の パッチを高山さんが配布しています。 FreeBSD の ports を使うと、メニューから IPv6 オプションが選択できます。
Linux では、PLD (Polish(ed) Linux Distribution) の方が IPv6 パッチを作っています。 また、Postfix のぺーじの関連リンク にもいくつか IPv6 (+ TLS) のパッチがあります。
その他のプラットホームでの対応状況を ご存知の方は教えて下さい。

設定は IPv4 とあまり変わらないようですが、IP アドレスの指定は、 例えば main.cf

    mynetworks = 127.0.0.0/8, 12.34.56.0/24,
                 [::1]/128, [IPv6 NLA2ブロック::]/48

のように、v6 アドレスを [ ] で囲む必要があるようです。

Q 1.4. 作者の名前はどう発音するの?

A. Wietse Venema さん自身の web page音声 が公開されています。

▲Top

2. 一般的なトラブル

Q 2.1. Postfix をインストールしましたが、メールが送れません。

A. もっと詳しい状況が必要です。とりあえずログを見てみましょう。 たいていのシステムでは /var/log/var/adm/syslog など (/etc/syslog.conf に書いてある場所) にログが出ている はずです。

Q 2.2. 設定をいじっているうちに、どれをいじったかわからなくなって しまいました。

A. Postfix をすでにインストールしたのであれば、postconf -n コマンドを実行するとデフォルト値ではないパラメータのリストを出力 します。メーリングリストで質問する時にもこれをつかうと便利です。

Q 2.3. メールが送信できません。メールサーバのログに fatal: unknown service: smtp/tcp と書いてあったのですが。

A. chroot した環境で Postfix を運用していませんか? chroot していると、 master.cf の中の chroot の項目がいくつか y に なっています。この場合、chroot した先のディレクトリ ($queue_directory/etc) に /etc/services など いくつかのファイルをコピーしておかなければいけません。詳しくは 配布パッケージの examples/chroot-setup/ 以下の各システム用 ファイルを参照して下さい。または、master.cf の chroot の 項目を全て n にしても解決できるでしょう。

Q 2.4. RedHat 7 でうまくコンパイルできません。

A. RedHat 7 ではヘッダファイルなどの配置がこれまでと変わっているものが あります。make 時に

  -DPATH_DB_H='<db3/db_185.h>'

を付けてみて下さい。

Q 2.5. 同じメールが2通以上届くのですが。

A. FAQ 内にも ある通り、Postfix はエイリアスなどによってメールを複製することが あります。 Postfix だけでは対応できませんが、procmail を利用することで、 同じ Message-ID を持つメールを複数受け取らないようにすることができます。

個人の ~/.forwardprocmail を呼び出す場合には、 ~/.forward

    "|exec /usr/local/bin/procmail"

を、~/.procmailrc

    :0 Wh: msgid.lock
    | formail -D 8192 msgid.cache

を記述すれば、同じ Message-ID を持つメールは1度しか配送しないように できるようです。また、Postfix の main.cf

    mailbox_command = /usr/local/bin/procmail -t

を指定し、/etc/procmailrc

    PATH=/bin:/usr/bin
    LOGFILE=$HOME/procmaillog
     
    :0 Wh: $HOME/msgid.lock
    | /usr/bin/formail -D 8192 $HOME/msgid.cache 

としてローカルメーラに procmail を用いている人もいるようです。 詳しくは procmailex(5) を参照して下さい。

関連: 同じメールが2通以上届くのですが。エイリアス宛の メールが、local userへの配送に失敗したときに起きるようです。 も参照。

Q 2.6. メールヘッダの From: や To: に "\" が付加されます。

20010228 版におけるバグです。Release 20010228 Patchlevel 01 で 修正されたようです。

Q 2.7. Linux glibc 2.1/2.2 環境で SMTP-AUTH が使えません。

A. Cyrus-sasl と Postfix が異なるバージョンの BerkeleyDB を使っているかもしれません。ともに DB3 を利用するようにすればよいようです。 [Postfix-jp:934] の記事が参考になるでしょう。

Q 2.8. フレッツ ISDN/ADSL/B などでメールが送れません。

A. Path MTU discovery 問題の可能性があります。これは Postfix FAQ に出ている問題と同じです。Postfix-JP ML に荒木さんが解決策をまとめてくださいました。

Q 2.9. MS Outlook Express で SMTP Auth が使えません。

A. MS Outlook Express では、いくつかある SMTP Auth の認証方法のうち、 LOGIN 認証しか使えません。そのため、Cyrus SASL ライブラリを構築する 際には、configure コマンドに --enable-login=yes を付ける 必要があります。

また Postfix 側では、smtpd_sasl_security_options に noplaintext が 含まれていると、PLAIN 認証と LOGIN 認証が禁止されるので、LOGIN 認証を許可するには、noplaintext を外す必要があります。さらに

broken_sasl_auth_clients = yes

を設定する必要があるかもしれません。詳細は SASL_README ファイルを参照して ください。

Q 2.10. Solaris で aliases ファイルが消えて しまいました。

A. Sendmail パッケージが入っている状態で Solaris に Postfix を インストールした場合、Solaris の Recommended Patch をインストール すると、Sendmail パッケージが更新されて aliases ファイルなどが 上書きされてしまう可能性があります。

Solaris に Postfix をインストールする場合、Sendmail パッケージを あらかじめ消しておくとよいでしょう:

# pkgrm SUNWsndmu
# pkgrm SUNWsndmr
Q 2.11. ログファイルの時間帯がずれてしまいます。

A. Postfix が chroot 環境で動作している場合、 ログファイルに記録されるタイムゾーンは /var/spool/postfix/etc/localtime/var/spool/postfix/usr/share/lib/zoneinfo などに依存します。Linux であれば

# cp /usr/share/zoneinfo/Japan /var/spool/postfix/etc/localtime

Solaris であれば

# cp /usr/share/lib/zoneinfo /var/spool/postfix/usr/share/lib/zoneinfo

としてコピーするなどの対処をおこなってください。

Q 2.12. /etc/resolv.conf を修正しても Postfix で反映されません。

A. タイムゾーンの問題 と同様、chroot 環境が 原因の可能性があります。 /var/spool/postfix/etc/resolv.conf を正しく修正してみてください。

Q 2.13. main.cf は正しく設定されているのに 外部へのメール配信に失敗することがあります。

A. 送信先のメールサーバによっては、接続元のIPアドレスの逆引きが できない場合に受信を拒否する場合があります。 送信メールサーバの逆引き設定が正しく行われているか確認してください。

Q 2.14. postfix コマンドでメールが 送れません。

A. Sendmail パッケージ内の sendmail と違って、Postfix パッケージの postfix コマンドはメールを送信するための コマンドではありません。postfix コマンドはメールサーバ システムを制御 (起動や停止など) するために使われます。Postfix でも メールの送信には sendmail コマンドを使ってください。ただし、 Sendmail のものと完全互換というわけではないので、Sendmail 用の ツールを Postfix で使う場合には注意が必要です。

Q 2.15. postmapコマンドで正規表現マップを 作れません。

A. DBM や DB ファイルと違い、regexp や pcre マップは postmap コマンドで処理する必要はありません。正規表現マップの場合、Postfix は 指定されたテキストファイル (regexp:/etc/postfix/regexp-file と 指定されている場合は /etc/postfix/regexp-file.db ではなく /etc/postfix/regexp-file) を直接読みます。

Q 2.16. アルファベットの大文字を含むメール ボックスにメールを送れません。

A. Postfix の local デーモンは、UserUsErUSER 宛のメールを全て小文字に置き換えて、全て user 宛とみなしてしまいます。そのため、名前に大文字を含むローカルユーザ User にメールを送ろうとしても、名前を user に 置き換えてユーザを捜すため、ユーザが存在しないことになってしまいます。

小文字への変換は local_recipient_maps で passwd ファイルを 読み込むときや、newaliases, postalias コマンドでエイリアス データベースを作るときにもおこなわれます。

大文字を含むユーザにメールを送るには、以下のようにすればよいでしょう。

  1. local_recipient_maps に、大文字を含むユーザを リストアップしたマップを追加する (passwd ファイルのエントリは小文字に 変換されてしまうため、別マップを登録する必要があります)。
  2. master.cf で大文字・小文字を区別する MDA を pipe で 呼び出すように設定し、それを $local_transport に設定する。 このとき、pipe には u フラグを設定しないようにする。
Q 2.17. 同じメールが2通以上届くのですが。 エイリアス宛のメールが、local userへの配送に失敗したときに起きるよう です。

A. aliasesにlocal userを記述する場合、そのうち一人でも配送に失敗すると、 再送の際に、メンバ全員に再配送してしまいます。

たとえば、aliasesに

    group1: foo bar baz

とあって、foo, bar, bazがlocal userのとき、foo宛の配送が(mailbox の lock file の作成失敗などで)deferredになると、fooだけでなくgroup1 全体に 再配送しようとします。結果として、bar, bazは同じメールを何度も受け取る ことになります。

対処方法としては、

  1. aliasesに owner-aliasname エントリを作成する(新たなmail queue が作成され、エイリアスが展開されるので、配送に失敗したユーザだけに 再配送されるようになる)
  2. aliasesのかわりに、virtualを使用する。

があります。

Q 2.18. メールボックスへの配送が、たまにlock失敗により エラー(deferred)になります。

A. POP3サーバなどによるメールボックスへのアクセスと競合しているようです。 メールボックスの形式をロックが不要な Maildir にするか、deliver_lock_delay を デフォルトの 1s から増やしてみてください。

▲Top

3. メーリングリスト関連

Q 3.1. これまで sendmail で動かしてきたメーリングリストが Postfix になってからうまく動きません。メールを送ると
<ml@host.domain>: mail to command is restricted
というエラーメッセージが返されます。

A. /etc/aliases:include: でスクリプトを呼び出しているのであれば、 設定ファイルに

allow_mail_to_commands = alias,forward,include

の行を付け足す必要があります。デフォルトでは /etc/aliases や .forward での include は使えません。

これまで root 権限で運用してきた ML の場合、Postfix では nobody 権限で 動かしてしまいます。ユーザ権限 (ユーザ postfix は使ってはいけない) で ML を運用するようにしましょう。拡張アドレスを使うと、ユーザが自分で ML を開くことも可能です。

名大の村瀬さんのページが ML ドライバの取扱について詳しいので、そちらも参考にするとよいでしょう。

Q 3.2. 大量のユーザを持つメーリングリストでちゃんと配送できません。

A. 同時に送ろうとしたユーザ数が smtpd_recipient_limit の値を 越えたのでしょう。デフォルトの 1000 人以上に同時にメールを送るには、 このパラメータの値をもっと大きくしなければいけません。

▲Top

4. Postfix の設定に関する問題

Q 4.1. From: 行をファイアウォールのホスト名にするために $myorigin をファイアウォール名にすると、うまく配送できない 場合があります。

A. ファイアウォール内のマシンなどからメールを送信する場合、From: の行で メールを出したホストの名前を隠したいということはよくあります。 ここで main.cf の説明を読むと、$myorigin を変更するだけで 済むように思えますが、実際には $myorigin は他の目的でも使われる 変数のようです。 $myorigin に書き換えたいドメイン名を記述するとよい場合も 多いのですが、$myorigin$mydestination に含まれて いない場合には localhost のユーザに転送するつもりで .forward や aliases にユーザ名しか書かないと、user@$myorigin と展開されて、そちらに 配送されてしまいます。

このような場合、aliases などに user ではなく user@localhost などとしてもよいのですが、 $myoriginはホスト名(ドメイン名)としておき、 このホスト名を $sender_canonical_maps で変更するようにすると 便利です。具体的には、/etc/postfix/sender_canonicalという ファイルを次の内容で作成します。

@host.domain.name @mail.domain.name

このファイルを postmap /etc/postfix/sender_canonical として hash テーブルを作成し、main.cf内で次のように指定します。

sender_canonical_maps = hash:/etc/postfix/sender_canonical

これにより、メールを送信する際に送信者のアドレスを user@host.domain.name から user@mail.domain.nameに 変換して送信することが出来ます。

この方法は、OS に標準で入っている mail コマンドなどが勝手に From: 行を付けてしまう場合にも有効です。

Q 4.2. リレーホストのバックアップサーバを指定したいのですが、どのように 設定すればよいのでしょうか。

A. 通常は DNS サーバの MX レコードを複数指定することで、優先度の高い サーバが使えない場合にバックアップサーバを使うようにします。

IN MX 10 mail1.hogehoge.com.
IN MX 20 mail2.hogehoge.com.

MX レコードが変更できないような場合は $fallback_relay パラメータに転送先のホスト名や IP アドレスを書けば、リレーホストが 使えない場合にはそちらに送られます。

Q 4.3. Received: ヘッダに LAN のマシンのマシン名や IP アドレスが出てしまうので隠したい。

A. 現在(2000.9.21)のところ、Received: ヘッダの書式を変更するオプションは サポートされていません(TODO に含まれています)。書式を変更するには、 ソースコードを修正します。snapshot-20000921 版以降であれば、 header_checksbody_checks パラメータに IGNORE を指定することで、不要なヘッダなどを取り除くことが できるようになっています。

Q 4.4. 「User has moved」メッセージを送信者に返すのと同時に、移転先の アドレスに元のメールを送りたい。relocated テーブルでは移転先にメールを 送ることができないのですが。

A. 同時に移転先にもメールを送るには、relocated マップとともに virtual マップを使います。 user1 宛のメールを user2@new.domain へ送るとともに、 送信者へ新しいアドレスを案内するには、次のように記述します。

[main.cf]
relocated_maps = hash:/etc/postfix/relocated
virtual_maps = hash:/etc/postfix/virtual

[/etc/postfix/virtual]
user1 user2@new.domain, user1

[/etc/postfix/relocated]
user1 user2@new.domain

relocated および virtual ファイルは postmap コマンドでマップファイルを 作成して下さい。

Q 4.5. ワイルドカード MX レコードを使う時の設定は?

$mydestination で全てのサブドメイン宛のメールを受けるように 設定するには、.domain.name$mydestination に付け加えます (domain.name は別に必要です)。

virtual および canonical テーブルでは、 @.domain.name address のように記述すればよいでしょう。

Q 4.6. メールを受けるポートを25から別のものに変えたいのですが。

A. /etc/services の smtp ポートを 25 から変更するか、 master.cf の smtpd の行を

smtp      inet  n       -       n       -       -       smtpd

から

#smtp      inet  n       -       n       -       -       smtpd
2525      inet  n       -       n       -       -       smtpd

のように変更して postfix reload を実行すれば変更できます。

Q 4.7. relay-test.mail-abuse.org のテストで問題があるといわれてしまいます。

A. まずは Postfix での Spam 対策 のページを 読み、特に $mynetworks$relay_domains に 不正な値が入っていないか調べます。

これらに問題がなく、user%domain1@domain2domain1!user@domain2 などの形式をリレーするといわれた場合でも、

allow_percent_hack = no
swap_bangpath = no

になっている場合には、一度 Postfix がメールを受け取り、その後で バウンスを返すので、relay-test.mail-abuse.org のテストではリレーするように 見えてしまいます。この場合は、

allow_percent_hack = yes
swap_bangpath = yes

にするか、main.cf

smtpd_recipient_restrictions = regexp:/etc/postfix/recipient_checks.reg,
    permit_mynetworks, check_relay_domains

をセットし、次の内容の recipient_checks.reg ファイルを作ります (regexp をサポートする場合のみ。regexp のかわりに pcre を用いてもよい)。

/[@!%].*[@!%]/           550 Please use user@domain address forms only.

これを指定すると、全てのソースルーティングアドレスを拒否します。

Q 4.8. DRAC を使って POP before SMTP をやろうとしましたが、 rpc.dracd が Signal 11 で落ちてしまいます。

A. DRAC のコンパイル時に -DREQ_HASH をつけて、hash 形式のデータベースを 扱おうとすると落ちることがあるようです。DRAC のデフォルトである btree 形式にしてみてください。

Q 4.9. メールを同じホストの別のMTAに送ろうとしても、「mail for localhost:xxx loops back to myself」 といわれて送れません。

A. Postfix の smtp クライアントは、SMTP サーバからの応答に $myhostname が含まれていると、自分自身に接続したと認識して 「メールがループした」というエラーを出します。$myhostname に別の名前を入れることで回避できますが、このパラメータは $mydestination など、他のパラメータのデフォルト値に 入っていることも多いので、注意が必要です。

Q 4.10. メールの送信に /etc/hosts ファイルを参照させるには?

A. Postfix は DNS が前提で作られており、通常メール送信時には DNS に MX レコードを問い合わせ、見つからなければメールの送信ができません。 MX レコードが見つからない場合に A レコードを検索するには

ignore_mx_lookup_error = yes
としますが、この設定で /etc/hosts ファイルを参照させることはできません。 また、[example.com] のようにして MX レコードの検索を禁止しても、 /etc/hosts を参照することができません。

強制的に hosts ファイルを使うためには、main.cf で

disable_dns_lookups = yes
を指定します。ただしこの場合、MXレコードを使うことはできないので、 イントラネット専用メールサーバでなければ relayhost を 指定する必要があるかもしれません。

注意: disable_dns_lookups は Postfix の DNS クライアントを 無効にして libc (OS 標準) のリゾルバを使って名前解決をおこなう オプションであり、一切の DNS 検索をおこなわなくなるわけではありません。

Q 4.11. Postfix 2.0 から transport テーブルや relayhost に複数のアドレスを指定できなくなりました。

A. 1.x で

example.co.jp  smtp:[mailserver-1] [mailserver-2]

のような指定ができたのは、仕様外の動作であり、2.0 以降は 複数のアドレスを指定できない仕様に沿ったものになっています。

DNS の MX レコードを複数指定するか、 複数のアドレスを指定できるようにするSMTP Connect Patch をとみたさんが公開されているので、これを使うこともできます。

Q 4.12. virtual_mailbox_domains の アドレス宛のメールをパイプでコマンドに渡したい。

A. virtual デーモンはセキュリティ上の理由でメールを コマンドに渡すことができません。そのため、 virtual_mailbox_domains に指定されたドメインのアドレス virtual@example.com 宛のメールをコマンドに渡すためには、 main.cf

virtual_alias_maps = hash:/etc/postfix/virtual
(Postfix 1.1.x では
virtual_maps = hash:/etc/postfix/virtual )

と指定し、例えば /etc/postfix/virtual

virtual@example.com virtual+example.com

として virtual+example.com という架空のユーザに転送します。 次に /etc/aliases

virtual+example.com "|/usr/local/bin/pipeprog"

とすると、virtual@example.com 宛のメールを /usr/local/bin/pipeprog というコマンドに渡すことができます。

Q 4.13. UNIXアカウントを使用せずにバーチャル ドメインを利用するには?

A. virtual_mailbox_maps を利用すると、UNIX アカウントを 最小限に利用してメール配送を行うことができます。以下の設定例や VIRTUAL_README を 参考にしてください。

[main.cf]
virtual_transport = virtual
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_mailbox_domains = hash:/etc/postfix/vmaildomains
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
local_transport = local
mydestination = $myhostname $localhost.$mydomain
local_recipient_maps = unix:passwd.byname $alias_maps  

[/etc/postfix/vmailbox]
virtual@example.com example.com/virtual
virtual@example.jp example.jp/virtual/Maildir/  

[/etc/postfix/vmaildomains]
virtual1.domain required to prevent relay access denied errors
virtual2.domain required to prevent relay access denied errors  
Q 4.14. 送信専用としてPostfixを利用したい。

A. ウェブサーバで sendmail コマンドを実行するタイプのメールフォームを 使用する場合には、メールの送信環境が前提となりますが、 別に正式なメールサーバが存在するのであれば、ウェブサーバの Postfix は 25/tcp を listen する必要はありません。

Postfix が 25/tcp を listen しないように設定するには、 master.cf

#smtp  inet  n  -  n  -  -  smtpd

のように、smtpd の行をコメントアウトして smtpd を使わないようにします。

Q 4.15. .forward でローカルのメールボックスに メールを保管するには?

A. Postfix は Sendmail と違い、.forward で

\user

のように記述しても展開を抑制することはできません。単に \ が 無視され、.forward があるシステムから user 宛にメールを 送る場合の宛先のとおなじアドレスに宛先が書き換えられます。

デフォルトでは、例えば user.forwarduser と記述した場合、

append_myorigin = yes
myorigin = $myhostname
mydestination = $myhostname, ...

となっているため、useruser@$myhostname に 展開されます。書き換えられたアドレスが再び user 自身で あるため、今度はループを防ぐために .forward を読まずに、そのまま メールボックスに保管されることになります。ただし一旦 user1 宛のメールが別ユーザ user2 に送られ、再び user1 に 転送されてしまった場合にはループしてしまいます。

また、メールボックスのパスを .forward に明示的に指定することも できます。mbox 配送の場合は .forward

/var/mail/user

と記述することで mbox 形式で /var/mail/user に保管されます。 また Maildir 配送では

~/Maildir/

とすれば、ホームディレクトリ直下の Maildir に配送される ことになります (最後のスラッシュが Maildir 配送を意味します)。 Postfix では、qmail のように

./Maildir/

というカレントディレクトリでの指定はできません。

▲Top

5. Maildir に関する問題

Q 5.1. mbox 形式のメールを Maildir 形式に変換するには?

A. mbox2maildir (by Russell Nelson)mbox2maildir (by Bruce Guenter) といった perl スクリプトで mbox 形式のメールを Maildir 形式に変換できます。

Q 5.2. ~/.forward./Maildir/ を指定すると、配送がうまくいきません。

A. Postfix local デーモンは仕様でカレントディレクトリの移動ができない ことと、特権プログラムがユーザのディレクトリに chdir するのは 好ましくないという理由で、~/.forward./Maildir/ と書くことはできません。代わりに /home/user/Maildir/~/Maildir/ と記述します。

▲Top


ike@kobitosan.net