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 に取り込ませていただきました。
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 オプションが選択できます。 設定は 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 で 音声 が公開されています。 |
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 を持つメールを複数受け取らないようにすることができます。 個人の ~/.forward で procmail を呼び出す場合には、 ~/.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 デーモンは、User、UsEr、 USER 宛のメールを全て小文字に置き換えて、全て user 宛とみなしてしまいます。そのため、名前に大文字を含むローカルユーザ User にメールを送ろうとしても、名前を user に 置き換えてユーザを捜すため、ユーザが存在しないことになってしまいます。 小文字への変換は local_recipient_maps で passwd ファイルを 読み込むときや、newaliases, postalias コマンドでエイリアス データベースを作るときにもおこなわれます。 大文字を含むユーザにメールを送るには、以下のようにすればよいでしょう。
|
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は同じメールを何度も受け取る ことになります。 対処方法としては、
があります。 |
Q 2.18. メールボックスへの配送が、たまにlock失敗により エラー(deferred)になります。 |
A. POP3サーバなどによるメールボックスへのアクセスと競合しているようです。 メールボックスの形式をロックが不要な Maildir にするか、deliver_lock_delay を デフォルトの 1s から増やしてみてください。 |
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 人以上に同時にメールを送るには、 このパラメータの値をもっと大きくしなければいけません。 |
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_checks や body_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@domain2 や domain1!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 の .forward に user と記述した場合、 append_myorigin = yes myorigin = $myhostname mydestination = $myhostname, ... となっているため、user は user@$myhostname に 展開されます。書き換えられたアドレスが再び user 自身で あるため、今度はループを防ぐために .forward を読まずに、そのまま メールボックスに保管されることになります。ただし一旦 user1 宛のメールが別ユーザ user2 に送られ、再び user1 に 転送されてしまった場合にはループしてしまいます。 また、メールボックスのパスを .forward に明示的に指定することも できます。mbox 配送の場合は .forward に /var/mail/user と記述することで mbox 形式で /var/mail/user に保管されます。 また Maildir 配送では ~/Maildir/ とすれば、ホームディレクトリ直下の Maildir に配送される ことになります (最後のスラッシュが Maildir 配送を意味します)。 Postfix では、qmail のように ./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/ と記述します。 |