Postfixの設定

Red Hat Linuxのページトップへ

The Postfix Home Page(Postfixの公式サイト)
#First Create the DatabaseCREATE DATABASE maildb;use maildb;## Table structure for table 'transport'#CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain)) TYPE=MyISAM;## Table structure for table 'users'#CREATE TABLE users ( id varchar(128) NOT NULL default '', address varchar(128) NOT NULL default '', crypt varchar(128) NOT NULL default '', clear varchar(128) NOT NULL default '', name varchar(128) NOT NULL default '', uid smallint(5) unsigned NOT NULL default '1000', gid smallint(5) unsigned NOT NULL default '1000', home varchar(128) NOT NULL default '/', domain varchar(128) NOT NULL default '', maildir varchar(255) NOT NULL default '', imapok tinyint(3) unsigned NOT NULL default '1', bool1 tinyint(3) unsigned NOT NULL default '1', bool2 tinyint(3) unsigned NOT NULL default '1', PRIMARY KEY (id), UNIQUE KEY id (id), UNIQUE KEY address (address), KEY id_2 (id), KEY address_2 (address)) TYPE=MyISAM;## Table structure for table 'virtual'#CREATE TABLE virtual ( address varchar(255) NOT NULL default '', goto varchar(255) NOT NULL default '', UNIQUE KEY address (address)) TYPE=MyISAM;

/usr/sbin/postconf -m | grep sql
mysql

'CCARGS=-DHAS_MYSQL -I/usr/include/mysql' \
'-DUSE_SASL_AUTH -I/usr/include/sasl' \
'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -L/usr/lib -lsasl'


After that you have to create a directory to have all your virtual users mail dropped in, this directory needs
to be owned by Postfix.


% mkdir /usr/local/virtual
% chown -R postfix:postfix /usr/local/virtual
% chmod -R 751 /usr/local/virtual
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:1001
virtual_mailbox_base = /usr/local/virtual
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 1001
virtual_transport = virtual
virtual_uid_maps = static:1001
# Additional for quota support
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes

6.2 mysql_virtual_alias_maps.cf 

You will need to put this into a text file for postfix to pickup.


user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address
Back to TOP a
6.3 mysql_virtual_domains_maps.cf 

You will need to put this into a text file for postfix to pickup.


user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = domain
select_field = description
where_field = domain
#additional_conditions = and backupmx = '0' and active = '1'
Back to TOP 
6.4 mysql_virtual_mailbox_maps.cf 

You will need to put this into a text file for postfix to pickup.


user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
#additional_conditions = and active = '1'
Back to TOP 
6.5 mysql_virtual_mailbox_limit_maps.cf 

You will need to put this into a text file for postfix to pickup.


user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = quota
where_field = username
#additional_conditions = and active = '1'
Back to TOP 
6.6 mysql_relay_domains_maps.cf 

You will need to put this into a text file for postfix to pickup.


user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '1'

*************************************
# main.cf
transport_maps=mysql:/usr/local/etc/postfix/transport.cf
virtual_mailbox_maps=mysql:/usr/local/etc/postfix/mysql_virt.cf
virtual_uid_maps=mysql:/usr/local/etc/postfix/uids.cf
virtual_gid_maps=mysql:/usr/local/etc/postfix/gids.cf
virtual_mailbox_base=/    #You might want to change this to something more secure.  In untested theory, you 
mydestination = $mydomain, $myhostname, $transport_maps
virtual_maps =mysql:/usr/local/etc/postfix/virtual.cf

# master.cf you need to add this line if it isn't already there. 

virtual   unix  -       n       n       -       -       virtual


# transport.cf
user=postfix
password=whatever
dbname=maildb
table=transport
select_field=transport
where_field=domain
hosts=localhost

# mysql_virt.cf
user=postfix
password= whatever
dbname=maildb
table=users
select_field=maildir
where_field=address
hosts=localhost

# uids.cf
user=postfix
password=whatever
dbname=maildb
table=users
select_field=uid
where_field=address
hosts=localhost

# gids.cf
user=postfix
password=whatever
dbname=maildb
table=users
select_field=gid
where_field=address
hosts=localhost

# virtual.cf
user=postfix
password=whatever
dbname=maildb
table=virtual
select_field=goto
where_field=address
hosts=localhost
************************************************************
virtual_mailbox_base=/
virtual_mailbox_maps=mysql:/etc/postfix/vmailbox.cf
virtual_uid_maps=mysql:/etc/postfix/vuid.cf
virtual_gid_maps=mysql:/etc/postfix/vgid.cf
fallback_transport=virtual

# vmailbox.cf
user=postfix
password=whatever
dbname=maildb
table=transport
select_field=mailbox
where_field=email
hosts=localhost

# vuid.cf
user=postfix
password=whatever
dbname=maildb
table=users
select_field=uid
where_field=email
hosts=localhost

# vgid.cf
user=postfix
password=whatever
dbname=maildb
table=users
select_field=gid
where_field=email
hosts=localhost
*********************************************************
virtual_mailbox_base = /data/mail
virtual_maps = mysql:/etc/postfix/remote_aliases.cf
virtual_mailbox_maps = mysql:/etc/postfix/aliases.cf
transport_maps = mysql:/etc/postfix/transport.cf
virtual_uid_maps = mysql:/etc/postfix/vuids.cf
virtual_gid_maps = mysql:/etc/postfix/vgids.cf
 

Config files:  
transport.cf: 
user = postfix
password = postfix
dbname = mail
table = transport
select_field = transport
where_field = domain
hosts = localhost

 

vuids.cf: 
user = postfix
password = postfix
dbname = mail
table = aliases
select_field = vuid
where_field = alias
hosts = localhost

 

vgids.cf: 
user = postfix
password = postfix
dbname = mail
table = aliases
select_field = vgid
where_field = alias
hosts = localhost

 

aliases.cf: 
user = postfix                  
password = postfix              
dbname = mail                   
table = aliases
select_field = maildir
where_field = alias
hosts = localhost

 

remote_aliases.cf: 
user = postfix
password = postfix
dbname = mail
table = remote_aliases
select_field = rcpt
where_field = alias
hosts = localhost

 

Also remember that relay_domains needs to contain $transport_maps to lookup local virtual domains. 
alias_maps does not affect the virtual agent.  

MySQL Setup:

 
Create a mysql user/database for postfix:  
gaia:~# mysql
mysql> use mysql;
mysql> insert into user (Host, User, Password) values('localhost','postfix', password('postfix'));
mysql> insert into db (Host, Db, User, Select_priv) values('localhost','mail','postfix','Y');
mysql> create database mail;
 

Create the tables needed:  
mysql> use mail;
mysql> create table transport (domain varchar(255) PRIMARY KEY, transport char(8));
mysql> create table aliases (vuid int(6), vgid int(6), alias varchar(255) PRIMARY KEY, maildir varchar(255));
mysql> create table remote_aliases (alias varchar(255) PRIMARY KEY, rcpt varchar(255));
 

Finish off by reloading the mysql server:  
gaia:~# mysqladmin reload  

Table explanation:  

The 'transport' table (from the man page): 

The optional transport table specifies a mapping from 
domain hierarchies to message delivery transports and/or 
relay hosts. The mapping is used by the trivial-rewrite(8) 
daemon. 

Example: 
mysql> select * from transport; 
+-----------+-----------+
| domain    | transport |
+-----------+-----------+
| gostil.dk | virtual:  |
+-----------+-----------+

 

The 'aliases' table: 

This table is used for 2 things: 

1: Map aliases to mailboxes / maildirs. 
2: Map uid/gids to mailboxes. 

Example: 
mysql> select * from aliases;
+------+------+---------------+------------------------+
| vuid | vgid | alias         | maildir                |
+------+------+---------------+------------------------+
| 1002 | 1002 | dvp@gostil.dk | gostil.dk/dvp/Maildir/ |
+------+------+---------------+------------------------+

 

The 'remote_aliases' table: 

This final table is used to map aliases at one domain 
to aliases at another domain. 

Example: 
mysql> select * from remote_aliases;
+----------------+----------------+
| alias          | rcpt           |
+----------------+----------------+
| test@gostil.dk | daniel@rtfm.dk |
+----------------+----------------+

 
************************************************************************
このコードは Andrew McNamara  によって作られ、
Xavier Beaudouin によって snapshot 20001121 に適合されました。
これは Wietse によって 20010128 に Postfix の本流にマージされました。

このソフトウェアの目的
======================

一つのマシンで扱っている一部もしくは全てのドメインのメールボックス
配送に virtual 配送エージェントを使うことができます。

このメカニズムはバーチャルエイリアスドメインとは異なります。
それはそれぞれの受信者アドレスを異なるアドレスに変換することで
実装されています。それをおこなうには、virtual(5) マニュアルページを
参照してください。

virtual 配送エージェントを使うと、それぞれの受信者アドレスは
それぞれのメールボックスを持つことができます。受信者アドレスを
別のアドレスに変換することはありません。

以下は Andrew McNamara が virtual 配送エージェントを使えるように
した時に書いたものです。

「このコードはバーチャルメールホスティングを提供する ISP 向けに
デザインされたものです。別々のマップからユーザメールボックスの
場所や uid, gid を検索し、またメールボックスロケーションマップは
mailbox, maildir 配送のどちらを指定することもできます (mailbox
名の最後にスラッシュを付けて制御します)。

このエージェントは user+foo 拡張アドレスや aliases、.forward を
サポートしない (代わりに virtual テーブルを使って下さい) ので、
ファイルやプログラムエイリアスもサポートしません。この選択により
コードは簡単になり、効率良くなりました (これにより local のコードの
70% - ほとんどがセキュリティ対策の細かいもの - の手間を省けました)。
- もしこの機能が必要であれば、このエージェントはあなたには適しません。

また、ルート権限で共通のスプールへ書き込み、メールボックスをユーザに
chown することもサポートしません - この機能は私の目的に全面的に
合致しないと思いました。」

[End of Andrew McNamara's words]

その結果、Postfix に見られる中で、最も安全なローカル配送エージェントに
なりました。

この配送エージェントは受信者を(メールボックスのパス、ユーザID、
グループID)として定義するために3つの異なる検索テーブルを必要と
します。これは Postfix のテーブル検索が複数の結果を
返すことができないためです。

バーチャルメールボックスが全て同じユーザ/グループID により
所有されているのであれば、単に常に同じ結果を返す「静的な」マップを
指定します。以下の例を参照してください。

バーチャルメールボックスが異なるユーザ/グループID により所有され
なければならなかったり、3つの同じようなテーブルが不便で維持できない
場合は LDAP や MYSQL データベースを (もしくは共通のテンプレートから
3つの平行なテーブルを生成して) 利用して下さい。

設定パラメータ
========================

virtual_mailbox_base

    全てのメールボックスのパスの前に付けるパス名を指定します。これは
    バラバラのファイルシステムにメールボックスが分散した、制御不能な
    マップ(かそれより悪いもの)を確実にするための安全対策です。
    "/" を セットすることも可能ですが、推奨しません。

virtual_mailbox_domains

    $virtual_transport 配送エージェント (デフォルト: virtual) に
    配送されるべきドメインのリストを指定します。バージョン 2.0 では、
    Postfix は Postfix transport マップに全てのドメインをリストアップ
    する必要がないように、十分賢くなりました。

virtual_mailbox_maps

    受信者のメールボックスのパスを決めるために、このマップで受信者が
    検索されます。返り値のパスがスラッシュ ("/") で終わっていると、
    Maildir 形式の配送が行なわれ、そうでなければメールボックス
    ファイルが指定されたとみなされます。virtual_mailbox_base
    ディレクトリが無条件にこのパスに付加されます。受信者が
    見つからないと、メールはバウンスされます。

    特有の user@domain.tld エントリを持たない特定のドメインの
    ユーザにマッチさせるには、検索テーブルの左側部分に
    @domain.tld を指定します。検索テーブルをサーチする際には、
    拡張アドレス (user+foo@domain.tld) は無視されます。

    受信者が見つからなければ、メールは送信者に返されます。

    正規表現マップが使えます。セキュリティ上の理由で、$1 などの
    正規表現の置き換えはセキュリティホールを開けることにつながる
    ため、許されません。

    メール管理者は受信用 mailbox ファイルもしくは maildir
    ディレクトリを前もって作成し、chown しておく必要があります。

virtual_minimum_uid

    virtual_uid_maps 検索から返されたものとして受け入れられる
    uid の最小値を指定します。返り値がこの値より小さいと拒否され、
    メッセージは遅延されます。

virtual_uid_maps

    目的のメールボックスに書き込む時に使われる UID (所有者権限)
    を決定するために、受信者はこのマップから検索されます。

    特有の user@domain.tld エントリを持たない特定のドメインの
    ユーザにマッチさせるには、検索テーブルの左側部分に
    @domain.tld を指定します。検索テーブルをサーチする際には、
    拡張アドレス (user+foo@domain.tld) は無視されます。

    正規表現マップが使えます。セキュリティ上の理由で、$1 などの
    正規表現の置き換えはセキュリティホールを開けることにつながる
    ため、許されません。

    全てのメールボックスが同じ UID によって所有されるのであれば、
    静的マップを指定します。例えば、全てのメールボックスが
    UID 5000 によって所有されるのであれば、次のように指定します:

    virtual_uid_maps = static:5000

virtual_gid_maps

    目的のメールボックスに書き込む時に使われる GID (グループ権限)
    を決定するために、受信者はこのマップから検索されます。

    特有の user@domain.tld エントリを持たない特定のドメインの
    ユーザにマッチさせるには、検索テーブルの左側部分に
    @domain.tld を指定します。検索テーブルをサーチする際には、
    拡張アドレス (user+foo@domain.tld) は無視されます。

    正規表現マップが使えます。セキュリティ上の理由で、$1 などの
    正規表現の置き換えはセキュリティホールを開けることにつながる
    ため、許されません。

    全てのメールボックスが同じ GID によって所有されるのであれば、
    静的マップを指定します。例えば、全てのメールボックスが
    GID 5000 によって所有されるのであれば、次のように指定します:

    virtual_gid_maps = static:5000

virtual_mailbox_lock

    この設定は maildir 配送の場合には無視されます。

    メールボックスを更新する時に使われるロック方法です。デフォルトは
    システム依存で、fcntl または flock です。POP や IMAP サーバに
    よっては、 mailbox ファイルの親ディレクトリに受信者の UID または
    GID の書き込み権が必要な dotlock を指定する必要があるかも
    知れません。

    あなたのシステムの Postfix がどのロック方法をサポートしているかを
    知るには、"postconf -m" コマンドを使って下さい。

virtual_mailbox_size

    Mailbox や Maildir ファイルのサイズの上限です。

例 1: 全てのローカルメールに virtual 配送エージェントを使用する
===============================================================

この例では Postfix local 配送エージェントは全く使いません。
この設定では Postfix はエイリアスの展開や .forward ファイルの展開、
/etc/passwd の受信者の検索も行ないません。また、user+foo 拡張
アドレスは許されますが無視されます。

システム形式に応じて "hash" の代わりに "dbm" や "btree" を指定して
下さい。"postconf -m" コマンドで使用可能な検索テーブル形式を表示します。

    /etc/postfix/main.cf:
    # ローカル配送エージェントにメールを送らないで下さい。
    mydestination =

    # $virtual_mailbox_domains にリストアップされた全てのドメインは
    # $virtual_transport を使って配送されます。デフォルトではこれは
    # virtual 配送エージェントです。
    virtual_mailbox_domains =
        $myhostname localhost.$mydomain virtual1.domain virtual2.domain

	virtual_transport = virtual
	virtual_mailbox_base = /var/mail/vhosts
	virtual_mailbox_maps = hash:/etc/postfix/vmailbox
	virtual_minimum_uid = 100
	virtual_uid_maps = hash:/etc/postfix/vuid
	virtual_gid_maps = hash:/etc/postfix/vgid

virtual 配送エージェントのエントリがまだなければ定義します。

    /etc/postfix/master.cf:
    virtual     unix  -       n       n       -       -       virtual

受信者の例。1人の UNIX スタイル mailbox と 1人の qmail 形式 maildir:

    /etc/postfix/vmailbox:
	test1@virtual1.domain test1
	test2@virtual2.domain test2/

    /etc/postfix/vuid:
	test1@virtual1.domain 5001
	test2@virtual2.domain 5002

    /etc/postfix/vgid:
	test1@virtual1.domain 5001
	test2@virtual2.domain 5002

それぞれの mailbox 受信者のために次のようなコマンドを実行します。

    # touch /var/mail/vhosts/test1
    # chown 5001:5001 /var/mail/vhosts/test1

それぞれの maildir 受信者のために次のようなコマンドを実行します。

    # mkdir /var/mail/vhosts/test2
    # chown 5002:5002 /var/mail/vhosts/test2

root@$myhostname, postmaster@$myhostname やその他の必要なアドレスに
対応する必要なエントリを忘れないで作るようにしてください。

例 2: デフォルトの local 配送エージェントとの共存
=================================================

この例では、デフォルトの Postfix local 配送エージェントが非バーチャル
受信者へのメールを扱います; virtual 配送エージェントはバーチャル
受信者を扱い、全てのバーチャルメールボックスはユーザ ID 5000、
グループ ID 5000 によって所有されます。

システムによっては "hash" の代わりに "dbm" や "btree" を指定して
下さい。"postconf -m" コマンドで使用可能な検索テーブル形式を表示
します。

    /etc/postfix/main.cf:
    # 全てのドメインやユーザは virtual ローカル配送エージェントによって
    # 配送されます。

    virtual_transport = virtual
	virtual_mailbox_base = /var/mail/vhosts
	virtual_mailbox_maps = hash:/etc/postfix/vmailbox
    virtual_mailbox_domains = $virtual_mailbox_maps
	virtual_minimum_uid = 100
	virtual_uid_maps = static:5000
	virtual_gid_maps = static:5000

    # 全てのドメインやユーザは local 配送エージェントによって
    # 配送されます。知らないユーザ宛のメールを拒否するために、
    # local_recipient_maps が使われます。

    local_transport = local
	mydestination = $myhostname $localhost.$mydomain
    local_recipient_maps = unix:passwd.byname $alias_maps

virtual 配送エージェントのエントリがまだなければ定義します。

    /etc/postfix/master.cf:
	virtual     unix  -       n       n       -       -       virtual

受信者の例。1人の UNIX スタイル mailbox と 1人の qmail 形式 maildir:

    /etc/postfix/vmailbox:
	test1@virtual1.domain test1
	test2@virtual2.domain test2/

    /etc/postfix/vmaildomains:
    virtual1.domain     required to prevent relay access denied errors
    virtual2.domain     required to prevent relay access denied errors

それぞれの mailbox 受信者のために次のようなコマンドを実行します。

    # touch /var/mail/vhosts/test1
    # chown 5001:5001 /var/mail/vhosts/test1

それぞれの maildir 受信者のために次のようなコマンドを実行します。

    # mkdir /var/mail/vhosts/test2
    # chown 5002:5002 /var/mail/vhosts/test2

それぞれのドメインに postmaster にコンタクトするためのアドレスを
持つことが必要なことを忘れないで下さい。

例3: たくさんのバーチャルユーザをホスティングする
=================================================

例2は少数のバーチャルユーザをホスティングするだけであればうまく
いきます。ユーザが多くなると、よく変わる情報 (ユーザアドレス) と
あまり変わらない情報 (ホスティングされるドメイン名) を分離したく
なるでしょう。

この例は上と同じで、local と virtual ドメインが共存しますが、
バーチャルドメイン名を指定するのに別のテーブルを使います。

    /etc/postfix/main.cf:
    # 全てのドメインやユーザは virtual ローカル配送エージェントによって
    # 配送されます。

    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 配送エージェントによって
    # 配送されます。知らないユーザ宛のメールを拒否するために、
    # local_recipient_maps が使われます。

    local_transport = local
    mydestination = $myhostname $localhost.$mydomain
    local_recipient_maps = unix:passwd.byname $alias_maps

virtual 配送エージェントのエントリがまだなければ定義します。

    /etc/postfix/master.cf:
	virtual     unix  -       n       n       -       -       virtual

受信者の例。1人の UNIX スタイル mailbox と 1人の qmail 形式 maildir:

    /etc/postfix/vmailbox:
	test1@virtual1.domain test1
	test2@virtual2.domain test2/

    /etc/postfix/vmaildomains:
    virtual1.domain     required to prevent relay access denied errors
    virtual2.domain     required to prevent relay access denied errors

それぞれの mailbox 受信者のために次のようなコマンドを実行します。

    # touch /var/mail/vhosts/test1
    # chown 5001:5001 /var/mail/vhosts/test1

それぞれの maildir 受信者のために次のようなコマンドを実行します。

    # mkdir /var/mail/vhosts/test2
    # chown 5002:5002 /var/mail/vhosts/test2

それぞれのドメインに postmaster にコンタクトするためのアドレスを
持つことが必要なことを忘れないで下さい。

例4: 古いアカウント宛のメールを新しいアドレスに転送する
=======================================================

存在しなくなったユーザ宛のメールを転送するために、virtual テーブルで
次のようなルールを設定できます (virtual 設定ファイル内のバーチャル
ドメインに関するテキストは無視して下さい):

    /etc/postfix/main.cf:
	virtual_maps = hash:/etc/postfix/virtual

    /etc/postfix/virtual:
	old_user@old.domain	new_user@new.domain

例5: バーチャル vacation 自動応答の設定
=======================================

バーチャル受信者へのメールに自動応答するとともに普通に配送するように
設定するためには、virtual テーブルに次のようなルールを書きます
(virtual 設定ファイル内のバーチャルドメインに関するテキストは
無視して下さい):

    /etc/postfix/main.cf:
        virtual_maps = hash:/etc/postfix/virtual

    /etc/postfix/virtual:
        user@domain.tld	user@domain.tld, user@autoreply.domain.tld

これは受信者にメールを配送し、またメールのコピーを自動応答を処理する
アドレスにも送ります。このアドレスは他のマシンでサービスすることも
できますし、transport マップのエントリで autoreply.domain.tld 宛の
全てのメールを何らかのスクリプトにパイプで渡し、送信者に自動応答を
返すようにして、ローカルでサービスすることもできます。


****************************************************************************
myhostname = mail.example.com

mydomain = example.com

myorigin = $mydomain

inet_interfaces = all

mydestination = $myhostname, localhost.$mydomain $mydomain

local_recipient_maps = unix:passwd.byname $alias_maps $virtual_mailbox_maps

mynetworks = 192.168.0.0/16, 127.0.0.0/8

relay_domains = $mydestination

fallback_transport=virtual
virtual_mailbox_base=/
virtual_mailbox_maps=mysql:/etc/postfix/vmailbox.cf
virtual_uid_maps=mysql:/etc/postfix/vuid.cf
virtual_gid_maps=mysql:/etc/postfix/vgid.cf

ぺんたん.info
あかいひ.com
IPくん.com
8枠.com - 競馬情報
galhime.com

PC Q&A||古い記事|雑学|ラーメン