Postfix
2008年10月03日
改めてメールサーバ構築のまとめ
久しぶりにメールサーバの設定作業を行った。
自分自身の復習目的に、以前書いたメールサーバ構築関連エントリのまとめなおしてみた。
自宅や中小企業用にはこれで間に合うのではないだろうか。
メールサーバ構成概要

主な機能
- Submissionポート
- SMTP-Auth
- IMAP4
- メールアカウント管理ツール
- 複数バーチャルドメイン
PostfixAdminの設定
環境概要
| PostfixAdmin | directory | /var/lib/postfixadmin/ |
|---|---|---|
| URI | http://postfixadmin.example.com/ | |
| Mailbox | $(domain)/$(local-part) | |
| MySQL | db_host | localhost |
| db_name | postfixadmin | |
| db_user | postfix | |
| db_pass | ******** |
ユーザー用Maildirディレクトリデザイン補足
今回、
- 『$(local-part)@$(domain)』のメールボックスを、
- 『$(domain)/$(local-part)』となるようにする
PostfixAdminで設定する。
設定すべき変数が下記2つ。
| $CONF['domain_path'] | 'NO' | (無し) |
| 'YES' | $(domain)/ | |
| $CONF['domain_in_mailbox'] | 'YES' | $(local-part)@$(domain) |
| 'NO' | $(local-part) |
今回の設定。
| $CONF['domain_path'] | 'YES' |
| $CONF['domain_in_mailbox'] | 'NO' |
作業内容
# mkdir -p /var/lib/postfixadmin # cd /var/lib/postfixadminostfixadmin; pwd /var/lib/postfixadmin # wget http://downloads.sourceforge.net/postfixadmin/postfixadmin_2.2.0.tar.gz?modtime=1209482958&big_mirror=0 # tar zxvf postfixadmin_2.2.0.tar.gz # ln -s postfixadmin-2.2.0 htdocsApacheのconfig生成
# cd /etc/httpd/conf/vhosts-available/; pwd /etc/httpd/conf/vhosts-available # vi postfixadmin.example.com .....(省略)..... # cd ../; pwd /etc/httpd/conf # ln -s `pwd`/vhosts-available/postfixadmin.example.com `pwd`/vhosts-enabled/問題なければ反映(reload)
# /usr/sbin/apachectl configtest Syntax OK # /etc/init.d/httpd reload Reloading httpd: [ OK ]ここではsetup.phpへアクセス出きることのみを確認。
→ http://postfixadmin.example.com/setup.php
※まだ設定途中なのでエラーが多々出る。
DBアクセス用アカウント作成
$ mysql -uroot mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY '********'; mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';PostfixAdminの設定
# pwd /var/lib/postfixadmin/htdocs # cp -pi config.inc.php config.inc.php.0 # vi config.inc.php # diff config.inc.php.0 config.inc.php 31c31 < $CONF['configured'] = false; --- > $CONF['configured'] = true; 51,53c51,53 < $CONF['database_host'] = 'localhost'; < $CONF['database_user'] = 'postfixadmin'; < $CONF['database_password'] = 'postfixadmin'; --- > $CONF['database_host'] = 'localhost'; > $CONF['database_user'] = 'postfix'; > $CONF['database_password'] = '********'; 123c123 < $CONF['domain_path'] = 'NO'; --- > $CONF['domain_path'] = 'YES'; 129c129 < $CONF['domain_in_mailbox'] = 'YES'; --- > $CONF['domain_in_mailbox'] = 'NO';再び http://postfixadmin.example.com/setup.php を確認。
- 各項目がOKとなる事を確認。
- 管理アカウント作成を要請されるので、管理アカウントを作成する。
- この時点でPostfixAdminがtableを生成してくれる
※ここでsetup.phpが残っていると管理画面へアクセス出来ない。
# mv -i setup.php setup.php.deleted管理画面へアクセス出切る事を確認する。
→ http://postfixadmin.example.com/
この時点でドメインとメールアカウントの管理を行えるようになる。
しかし、まだメール配送(Postfix)の設定がない。
Postfixの設定
- vpopmailの様なディレクトリ構成にする
- SMTP-Authの認証はDovecotに任せる
- Submissionポート(tcp/587)
設定概要
| virtualドメイン用 | アカウント | vpostmail(uid:12000,gid:12000) |
| スプールディレクトリ | /var/lib/vpostmail/domain/ | |
| 設定ファイル | /var/lib/vpostmail/etc/*.cf |
作業内容
masterにsubmissionポートを追加。
# cd /etc/postfix/ # vi master.cf > submission inet n - n - - smtpdバーチャルドメイン用アカウント作成。
# /usr/sbin/useradd -u 12000 -s /bin/false vpostmailバーチャルドメイン用にmain.cf修正
また、SASLの設定も追加する。
# pwd /etc/postfix # cp -pi main.cf main.cf.0 # vi main.cf # diff main.cf.0 main.cf > virtual_gid_maps = static:12000 > virtual_uid_maps = static:12000 > virtual_mailbox_limit = 51200000 > virtual_minimum_uid = 1001 > virtual_transport = virtual > virtual_mailbox_base = /var/lib/vpostmail/domain > virtual_mailbox_domains = mysql:/var/lib/vpostmail/etc/mysql_virtual_domains_maps.cf > virtual_mailbox_maps = mysql:/var/lib/vpostmail/etc/mysql_virtual_mailbox_maps.cf > virtual_alias_maps = mysql:/var/lib/vpostmail/etc/mysql_virtual_alias_maps.cf > > smtpd_sasl_auth_enable = yes > smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination > smtpd_sasl_type = dovecot > smtpd_sasl_path = private/authメールボックス用ディレクトリ。
今回は/var/lib/vpostmail/配下に作っていく。
# mkdir /var/lib/vpostmail/ # cd /var/lib/vpostmail/; pwd /var/lib/vpostmail # mkdir etc domainvpostmailアカウントが
domainディレクトリにファイルを書き込むのでオーナーを変更する。
# chown vpostmail:vpostmail domainPostfix-mysql用設定
# cd etc/; pwd
/var/lib/vpostmail/etc
# vi mysql_virtual_alias_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s'
# vi mysql_virtual_domains_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT description FROM domain WHERE domain='%s'
# vi mysql_virtual_mailbox_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT concat(maildir,'Maildir/') FROM mailbox WHERE username='%s'
/var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/としたいので、concatを用いて「Maildir/」を追加する。
これにより、後に設定するdovecotの管理が簡単になる。
etc配下のconfigにはMySQL用パスワードが載ってるので読めないようにする。
オーナーをpostfixへ変更。
# cd ../; pwd /var/lib/vpostmail # chown -R postfix:postfix etc/ # ls -ld etc/ drwx------ 2 postfix postfix 4096 May 7 20:35 etc/設定内容確認
# /etc/init.d/postfix check問題なければ反映
# /etc/init.d/postfix reload Reloading postfix: [ OK ]送信テスト
$ telnet localhost 25 helo localhost mail from:foo@example.net rcpt to:bar@example.com data Subject: test test test . quitログ確認
# tail -F /var/log/maillog .....エラーが出てなければOK
Dovecotの設定
メールを受信
PostfixはMTAなので、POP3用サーバが別途必要。
今回はMySQLと連動叶なDovecotを使った。
設定概要
| virtualドメイン用 | アカウント | vpostmail(uid:12000,gid:12000) |
| スプールディレクトリ | /var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/ | |
| 設定ファイル | /etc/dovecot-mysql.conf |
作業内容
dovecotをMySQL対応にする。
# yum install dovecot-mysqldovecot.confの修正。
imapとpop3を使えるようにする。
結果的に設定ファイルはシンプルなものになった。
# cd /etc/; pwd
/etc
# cp -pi dovecot.conf dovecot.conf.0
# vi dovecot.conf
protocols = imap pop3
auth default {
mechanisms = plain
passdb pam {
}
passdb sql {
args = /etc/dovecot-mysql.conf
}
userdb passwd {
}
userdb sql {
args = /etc/dovecot-mysql.conf
}
user = root
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
MySQL用の設定。※12000はvpostmailのuidとgid。
# cat /etc/dovecot-mysql.conf
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=********
default_pass_scheme = MD5
user_query = SELECT concat('/var/lib/vpostmail/domain/', maildir) as home, 12000 as uid, 12000 as gid FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
設定を反映させる
[root@www etc]# /etc/init.d/dovecot reload Stopping Dovecot Imap: [ OK ] Starting Dovecot Imap: [ OK ]POPの確認
$ telnet localhost 25 user foo@example.com pass ******** list retr 1 .....ここで認証が通れば問題なし。
複数バーチャルドメイン対応メール環境が出来上がった。
まとめ
- この構成にはスパムメール対策がない事に気づいた
- そのうちスパムメール対策も追加した物をまとめる…かも知れない
2008年05月08日
メールを受信
PostfixはMTAなので、POP3用サーバが別途必要。
今回はMySQLと連動叶なDovecotを使った。
設定概要
| virtualドメイン用 | アカウント | vpostmail(uid:12000,gid:12000) |
| スプールディレクトリ | /var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/ | |
| 設定ファイル | /etc/dovecot-mysql.conf |
作業内容
dovecotをMySQL対応にする。
# yum install dovecot-mysqldovecot.confの修正。
imapとpop3を使えるようにする。
結果的に設定ファイルはシンプルなものになった。
# cd /etc/; pwd
/etc
# cp -pi dovecot.conf dovecot.conf.0
# vi dovecot.conf
protocols = imap pop3
auth default {
mechanisms = plain
passdb pam {
}
passdb sql {
args = /etc/dovecot-mysql.conf
}
userdb passwd {
}
userdb sql {
args = /etc/dovecot-mysql.conf
}
user = root
}
MySQL用の設定。※12000はvpostmailのuidとgid。
# cat /etc/dovecot-mysql.conf
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=********
default_pass_scheme = MD5
user_query = SELECT concat('/var/lib/vpostmail/domain/', maildir) as home, 12000 as uid, 12000 as gid FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
設定を反映させる
[root@www etc]# /etc/init.d/dovecot reload Stopping Dovecot Imap: [ OK ] Starting Dovecot Imap: [ OK ]POPの確認
$ telnet localhost 25 user foo@example.com pass ******** list retr 1 .....ここで認証が通れば問題なし。
複数バーチャルドメイン対応メール環境が出来上がった。
関連リンク
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(1/n) - 序章
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(2/n) - Postfix入れ替え
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(3/n) - PostfixAdminの設定
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(4/n) - Postfixの設定
構成イメージはvpopmail
vpopmailの様なディレクトリ構成にする。
設定概要
| virtualドメイン用 | アカウント | vpostmail(uid:12000,gid:12000) |
| スプールディレクトリ | /var/lib/vpostmail/domain/ | |
| 設定ファイル | /var/lib/vpostmail/etc/*.cf |
作業内容
バーチャルドメイン用アカウント作成。
# /usr/sbin/useradd -u 12000 -s /bin/false vpostmailバーチャルドメイン用にmain.cf修正
# pwd /etc/postfix # cp -pi main.cf main.cf.0 # vi main.cf # diff main.cf.0 main.cf > virtual_gid_maps = static:12000 > virtual_uid_maps = static:12000 > virtual_mailbox_limit = 51200000 > virtual_minimum_uid = 1001 > virtual_transport = virtual > virtual_mailbox_base = /var/lib/vpostmail/domain > virtual_mailbox_domains = mysql:/var/lib/vpostmail/etc/mysql_virtual_domains_maps.cf > virtual_mailbox_maps = mysql:/var/lib/vpostmail/etc/mysql_virtual_mailbox_maps.cf > virtual_alias_maps = mysql:/var/lib/vpostmail/etc/mysql_virtual_alias_maps.cfメールボックス用ディレクトリ。
今回は/var/lib/vpostmail/配下に作っていく。
# mkdir /var/lib/vpostmail/ # cd /var/lib/vpostmail/; pwd /var/lib/vpostmail # mkdir etc domainvpostmailアカウントが
domainディレクトリにファイルを書き込むのでオーナーを変更する。
# chown vpostmail:vpostmail domainPostfix-mysql用設定
# cd etc/; pwd
/var/lib/vpostmail/etc
# vi mysql_virtual_alias_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s'
# vi mysql_virtual_domains_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT description FROM domain WHERE domain='%s'
# vi mysql_virtual_mailbox_maps.cf
user = postfix
password = ********
hosts = localhost
dbname = postfix
query = SELECT concat(maildir,'Maildir/') FROM mailbox WHERE username='%s'
/var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/としたいので、concatを用いて「Maildir/」を追加する。
これにより、後に設定するdovecotの管理が簡単になる。
etc配下のconfigにはMySQL用パスワードが載ってるので読めないようにする。
オーナーをpostfixへ変更。
# cd ../; pwd /var/lib/vpostmail # chown -R postfix:postfix etc/ # ls -ld etc/ drwx------ 2 postfix postfix 4096 May 7 20:35 etc/設定内容確認
# /etc/init.d/postfix check問題なければ反映
# /etc/init.d/postfix reload Reloading postfix: [ OK ]送信テスト
$ telnet localhost 25 helo localhost mail from:foo@example.net rcpt to:bar@example.com data Subject: test test test . quitログ確認
# tail -F /var/log/maillog .....エラーが出てなければOK
次回はPOP3サーバの設定
関連リンク
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(1/n) - 序章
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(2/n) - Postfix入れ替え
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(3/n) - PostfixAdminの設定
管理ツールで管理負荷軽減
エンジニアであればコマンドラインからの作業で事足りる。
納品する場合など、相手がエンジニアとは限らない。
管理ツールを導入する事により、覚える事は最小限。
今回はメールアカウント管理ツールとしてPostfixAdminを使う。
環境概要
| PostfixAdmin | directory | /var/lib/postfixadmin/ |
|---|---|---|
| URI | http://postfixadmin.example.com/ | |
| Mailbox | $(domain)/$(local-part) | |
| MySQL | db_host | localhost |
| db_name | postfixadmin | |
| db_user | postfix | |
| db_pass | ******** |
ユーザー用Maildirディレクトリデザイン補足
今回、
『$(local-part)@$(domain)』のメールボックスを、
『$(domain)/$(local-part)』となるようにする。
これは単にvpopmailの構成が好きだったから。
PostfixAdminで設定する。
設定すべき変数が下記2つ。
| $CONF['domain_path'] | 'NO' | (無し) |
| 'YES' | $(domain)/ | |
| $CONF['domain_in_mailbox'] | 'YES' | $(local-part)@$(domain) |
| 'NO' | $(local-part) |
今回の設定。
| $CONF['domain_path'] | 'YES' |
| $CONF['domain_in_mailbox'] | 'NO' |
作業内容
# mkdir -p /var/lib/postfixadmin # cd /var/lib/postfixadminostfixadmin; pwd /var/lib/postfixadmin # wget http://downloads.sourceforge.net/postfixadmin/postfixadmin_2.2.0.tar.gz?modtime=1209482958&big_mirror=0 # tar zxvf postfixadmin_2.2.0.tar.gz # ln -s postfixadmin-2.2.0 htdocsApacheのconfig生成
# cd /etc/httpd/conf/vhosts-available/; pwd /etc/httpd/conf/vhosts-available # vi postfixadmin.example.com .....(省略)..... # cd ../; pwd /etc/httpd/conf # ln -s `pwd`/vhosts-available/postfixadmin.example.com `pwd`/vhosts-enabled/問題なければ反映(reload)
[root@www conf]# /usr/sbin/apachectl configtest Syntax OK [root@www conf]# /etc/init.d/httpd reload Reloading httpd: [ OK ]ここではsetup.phpへアクセス出きることのみを確認。
→ http://postfixadmin.example.com/setup.php
※まだ設定途中なのでエラーが多々出る。
DBアクセス用アカウント作成
$ mysql -uroot mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY '********'; mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';PostfixAdminの設定
# pwd /var/irokoi/postfixadmin/htdocs # cp -pi config.inc.php config.inc.php.0 # vi config.inc.php # diff config.inc.php.0 config.inc.php 31c31 < $CONF['configured'] = false; --- > $CONF['configured'] = true; 51,53c51,53 < $CONF['database_host'] = 'localhost'; < $CONF['database_user'] = 'postfixadmin'; < $CONF['database_password'] = 'postfixadmin'; --- > $CONF['database_host'] = 'localhost'; > $CONF['database_user'] = 'postfix'; > $CONF['database_password'] = '********'; 123c123 < $CONF['domain_path'] = 'NO'; --- > $CONF['domain_path'] = 'YES'; 129c129 < $CONF['domain_in_mailbox'] = 'YES'; --- > $CONF['domain_in_mailbox'] = 'NO';再び http://postfixadmin.example.com/setup.php を確認。
- 各項目がOKとなる事を確認。
- 管理アカウント作成を要請されるので、管理アカウントを作成する。
- この時点でPostfixAdminがtableを生成してくれる
※ここでsetup.phpが残っていると管理画面へアクセス出来ない。
# mv -i setup.php setup.php.deleted管理画面へアクセス出切る事を確認する。
→ http://postfixadmin.example.com/
この時点でドメインとメールアカウントの管理を行えるようになる。
しかし、まだメール配送(Postfix)の設定がない。
続きは次回。
関連リンク
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(1/n) - 序章
- RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(2/n) - Postfix入れ替え
RHEL4のPostfixでは駄目
出鼻をくじかれる。
Postfixが対応するルックアップテーブル一覧を確認してみた。
$ /usr/sbin/postconf -m btree cidr environ hash ldap nis pcre proxy regexp static unixmysqlが無い!!
Postfixを作り直す
参考にしたページはPostfix + Courier-IMAP。
$ pwd
/home/admin/work/rpms
$ mkdir -p {SOURCES,SPECS,BUILD,SRPMS,RPMS/i386}
$ echo "%_topdir $HOME/work/rpms" > ~/.rpmmacros
$ cat ~/.rpmmacros
%_topdir /home/admin/work/rpms
SRPMを取得する$ cd SRPMS/; pwd /home/admin/work/rpms/SRPMS $ wget http://ftp.riken.jp/Linux/centos/5/os/SRPMS/postfix-2.3.3-2.src.rpm $ rpm -ivh postfix-2.3.3-2.src.rpmquota修正用パッチ
$ cd ../SOURCES/; pwd /home/admin/work/rpms/SOURCES $ wget http://vda.sourceforge.net/VDA/postfix-2.3.3-vda.patch.gz $ gunzip -d postfix-2.3.3-vda.patch.gz $ cd ../SPECS/; pwd /home/admin/work/rpms/SPECSspecファイル修正。
MySQLを使えるようにする。
$ cp -pi postfix.spec /tmp/ $ vi postfix.spec $ diff /tmp/postfix.spec postfix.spec 2c2 < %define MYSQL 0 --- > %define MYSQL 1 82a83 < Patch10: postfix-2.3.3-vda.patch 136a138 > %patch10 -p1 -b .vda $ rpmbuild -ba postfix.spec標準パッケージと入れ替える
$ su Password: # apt-get remove postfix # rpm -ivh ../RPMS/i386/postfix-2.3.3-2.i386.rpmmysqlが入っている事を確認
$ /usr/sbin/postconf -m btree cidr environ hash ldap mysql nis pcre proxy regexp static unixOK
関連ページ
2008年01月06日
envelope情報
友達に聞かれたので再度確認メモ
「MAIL FROM」「RCPT TO」を取得する方法ないの?
以前書いたメールの時間範囲指定配送を考察 Postfix編では情報不足。
| envelope | 環境変数 | 内容 | SMTP |
|---|---|---|---|
| envelope from | SENDER | 送信者メールアドレス | MAIL FROM |
| envelope to | RECIPIENT | 受信者メールアドレス | RCPT TO |
検証方法
下準備
$ cat ~/.forward "| /usr/bin/env > /tmp/env.log.$$"
- 環境変数を/tmp/env.log.$$へ出力
SMTP
$ telnet [maa ipaddr] 25 HELO smtp.example.com MAIL FROM:<foo+envelope@example.com> RCPT TO:<bar+envelope@example.com> DATA Subject: envelope To: foo+heder@example.com From: bar+header@exampel.com envelope/tmp/env.log.$$の内容のうち、
RECIPIENTとSENDERが、
envelope-to,envelope-fromと一致している事を確認した。
2007年11月16日
2007年08月13日
自分は良くmakeを使う(Makefileを書く)。
▼makeの良い所
対象となるファイルのタイムスタンプを比較し、比較対照よりも
新しくなっている場合、何かしらの処理を行ってくれる所。
この利点を上手く利用してやるとサーバ管理の効率を上げる要素となる。
例えばPostfixのconfig。
Postfixを使っている人は分かるだろうけど、main.cfやmaster.cf、
これ等Postfixのconfigはincludeディレクティブ未対応。
それゆえ、main.cfやmaster.cfを1ファイルに設定を集約してやる必要が出て来る。
効率よく管理する方法はいくつかある。
そのうちの1つが、複数ファイルを1ファイルとして結合する方法。
▼confを結合する時のイメージ

※画像クリックで拡大表示
▼/etc/postfix/main.cfを結合生成プロセス
・/etc/postfix/parts.d-common/main.cf 管理サーバ群共通設定
・/etc/postfix/parts.d-local/main.cf サーバ特有設定
↓
↓2つを結合する
↓
・/etc/postfix/master.cf
▼Makefile例
▼実行結果
makeを実行する事により、main.cfが生成される。
parts.d-common/main.cfかparts.d-local/main.cfのタイムスタンプと比較し、
main.cfのタイムスタンプが *古い場合*、main.cfが再生成される。
結合用スクリプトを生成するよりも、makeを利用した方が良い事は多々ある。
シェルスクリプトを作っておいて良かったと思った事は…無いな。
makeはソースをコンパイルする為だけの物ではない。
サーバ管理にも使えるスグレモノ。
上手く使えば大分サーバ管理効率を上げる事が出来るはず。
広がるmakeの世界。
▼makeの良い所
対象となるファイルのタイムスタンプを比較し、比較対照よりも
新しくなっている場合、何かしらの処理を行ってくれる所。
この利点を上手く利用してやるとサーバ管理の効率を上げる要素となる。
例えばPostfixのconfig。
Postfixを使っている人は分かるだろうけど、main.cfやmaster.cf、
これ等Postfixのconfigはincludeディレクティブ未対応。
それゆえ、main.cfやmaster.cfを1ファイルに設定を集約してやる必要が出て来る。
効率よく管理する方法はいくつかある。
そのうちの1つが、複数ファイルを1ファイルとして結合する方法。
▼confを結合する時のイメージ

※画像クリックで拡大表示
▼/etc/postfix/main.cfを結合生成プロセス
・/etc/postfix/parts.d-common/main.cf 管理サーバ群共通設定
・/etc/postfix/parts.d-local/main.cf サーバ特有設定
↓
↓2つを結合する
↓
・/etc/postfix/master.cf
▼Makefile例
PARTS_COMMON=parts.d-common
PARTS_LOCAL=parts.d-local
MAIN_CFS=$(PARTS_COMMON)/main.cf $(PARTS_LOCAL)/main.cf
all: main.cf
main.cf: $(MAIN_CFS)
cat $(MAIN_CFS) > $@
echo $@ done.
PARTS_LOCAL=parts.d-local
MAIN_CFS=$(PARTS_COMMON)/main.cf $(PARTS_LOCAL)/main.cf
all: main.cf
main.cf: $(MAIN_CFS)
cat $(MAIN_CFS) > $@
echo $@ done.
▼実行結果
$ make
cat parts.d-common/main.cf parts.d-local/main.cf > main.cf
echo main.cf done.
main.cf done.
cat parts.d-common/main.cf parts.d-local/main.cf > main.cf
echo main.cf done.
main.cf done.
makeを実行する事により、main.cfが生成される。
parts.d-common/main.cfかparts.d-local/main.cfのタイムスタンプと比較し、
main.cfのタイムスタンプが *古い場合*、main.cfが再生成される。
結合用スクリプトを生成するよりも、makeを利用した方が良い事は多々ある。
シェルスクリプトを作っておいて良かったと思った事は…無いな。
makeはソースをコンパイルする為だけの物ではない。
サーバ管理にも使えるスグレモノ。
上手く使えば大分サーバ管理効率を上げる事が出来るはず。
広がるmakeの世界。
2007年08月01日
Postfixとpostfix-policyd-spf-perlを使用し、
メールヘッダーに"Received-SPF"を追加する。
■環境
・OS: Debian GNU/Linux (etch)
・MTA: Postfix 2.3.8-2
■概要
・libmail-spf-perlをインストール
・postfix-policyd-spf-perlをインストール
・postfixの設定(/etc/postfix/master.cf編集)
▼Mail::SPF (libmail-spf-perl)
postfix-policyd-spfはMail::SPFに依存する。
debパッケージには存在しない。探してみたらubuntuにあった。
http://packages.ubuntu.com/feisty/perl/libmail-spf-perl
$ wget http://..../libmail-spf-perl_2.004-0ubuntu1_all.deb
$ sudo dpkg -i libmail-spf-perl_2.004-0ubuntu1_all.deb
▼postfix-policyd-spf-perlをdeb化する
postfix-policyd-spf-perlはdeb化される事を想定しているのだろう。
debian/ と言うディレクトリがある。まずはdebパッケージ作り
$ wget http://www.openspf.org/source/software/postfix-policyd-spf-perl/tags/2.004.tar.gz?view=tar -O postfix-policyd-spf-perl-2.0004.tar.gz
$ tar zxvf postfix-policyd-spf-perl-2.0004.tar.gz
$ cd 2.004/
$ chmod +x debian/rules
$ fakeroot dpkg-buildpackage -uc -us
$ ls -1 ../postfix-policyd-spf-perl*
../postfix-policyd-spf-perl-2.0004.tar.gz
../postfix-policyd-spf-perl_2.004-0ubuntu1.dsc
../postfix-policyd-spf-perl_2.004-0ubuntu1.tar.gz
../postfix-policyd-spf-perl_2.004-0ubuntu1_all.deb
../postfix-policyd-spf-perl_2.004-0ubuntu1_i386.changes
$ sudo dpkg -i ../postfix-policyd-spf-perl_2.004-0ubuntu1_all.deb
0utunbu1となっているけど気にしない
$ dpkg -L postfix-policyd-spf-perl
/.
/usr
/usr/sbin
/usr/sbin/postfix-policyd-spf-perl
/usr/share
/usr/share/doc
/usr/share/doc/postfix-policyd-spf-perl
/usr/share/doc/postfix-policyd-spf-perl/copyright
/usr/share/doc/postfix-policyd-spf-perl/changelog.gz
/usr/share/doc/postfix-policyd-spf-perl/changelog.Debian.gz
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/postfix-policyd-spf-perl.8p.gz
▼/etc/postfix/master.cfを修正
$ sudo vi /etc/postfix/master.cf
------------------------------
policy unix - n n - - spawn
user=nobody argv=/usr/bin/perl /usr/sbin/postfix-policyd-spf-perl
------------------------------
追記したらreload
$ sudo /etc/init.d/postfix reload
▼テスト
実際に対してメールを送信し、
メールヘッダーにReceived-SPFが追加されているかを確認
メールヘッダーに"Received-SPF"を追加する。
■環境
・OS: Debian GNU/Linux (etch)
・MTA: Postfix 2.3.8-2
■概要
・libmail-spf-perlをインストール
・postfix-policyd-spf-perlをインストール
・postfixの設定(/etc/postfix/master.cf編集)
▼Mail::SPF (libmail-spf-perl)
postfix-policyd-spfはMail::SPFに依存する。
debパッケージには存在しない。探してみたらubuntuにあった。
http://packages.ubuntu.com/feisty/perl/libmail-spf-perl
$ wget http://..../libmail-spf-perl_2.004-0ubuntu1_all.deb
$ sudo dpkg -i libmail-spf-perl_2.004-0ubuntu1_all.deb
▼postfix-policyd-spf-perlをdeb化する
postfix-policyd-spf-perlはdeb化される事を想定しているのだろう。
debian/ と言うディレクトリがある。まずはdebパッケージ作り
$ wget http://www.openspf.org/source/software/postfix-policyd-spf-perl/tags/2.004.tar.gz?view=tar -O postfix-policyd-spf-perl-2.0004.tar.gz
$ tar zxvf postfix-policyd-spf-perl-2.0004.tar.gz
$ cd 2.004/
$ chmod +x debian/rules
$ fakeroot dpkg-buildpackage -uc -us
$ ls -1 ../postfix-policyd-spf-perl*
../postfix-policyd-spf-perl-2.0004.tar.gz
../postfix-policyd-spf-perl_2.004-0ubuntu1.dsc
../postfix-policyd-spf-perl_2.004-0ubuntu1.tar.gz
../postfix-policyd-spf-perl_2.004-0ubuntu1_all.deb
../postfix-policyd-spf-perl_2.004-0ubuntu1_i386.changes
$ sudo dpkg -i ../postfix-policyd-spf-perl_2.004-0ubuntu1_all.deb
0utunbu1となっているけど気にしない
$ dpkg -L postfix-policyd-spf-perl
/.
/usr
/usr/sbin
/usr/sbin/postfix-policyd-spf-perl
/usr/share
/usr/share/doc
/usr/share/doc/postfix-policyd-spf-perl
/usr/share/doc/postfix-policyd-spf-perl/copyright
/usr/share/doc/postfix-policyd-spf-perl/changelog.gz
/usr/share/doc/postfix-policyd-spf-perl/changelog.Debian.gz
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/postfix-policyd-spf-perl.8p.gz
▼/etc/postfix/master.cfを修正
$ sudo vi /etc/postfix/master.cf
------------------------------
policy unix - n n - - spawn
user=nobody argv=/usr/bin/perl /usr/sbin/postfix-policyd-spf-perl
------------------------------
追記したらreload
$ sudo /etc/init.d/postfix reload
▼テスト
実際に対してメールを送信し、
メールヘッダーにReceived-SPFが追加されているかを確認
どんなアプリケーションの設定をしていても言える事。
設定を変更していると頻出する項目があるはずだ。
Postfixの設定の頻出設定項目の1つが「smtpd_*_restrictions」。
今までは具体的に何をしているのか良く理解していなかった。
これはメールの制御をする為のものだった。
接続からSMTPのコマンド毎まで、細かな設定が可能。
smtpd_*_restrictionsを、評価される順に並べると下記の通り。
smtpd_client_restrictions
↓
smtpd_helo_restrictions
↓
smtpd_sender_restrictions
↓
smtpd_recipient_restrictions
↓
smtpd_etrn_restrictions
↓
smtpd_data_restrictions
↓
smtpd_end_of_data_restrictions
Postfixは機能豊富。豊富過ぎる。
Postfixの設定だけで飯を食って行けそうな気がするくらいに多い。
ただ、使うのは、ごく一部の機能だけ。
リファレンスはリファレンスとして用意しつつ、
受験用英単語の様に、頻出設定項目順に紹介して行くのは需要がありそう。
設定を変更していると頻出する項目があるはずだ。
Postfixの設定の頻出設定項目の1つが「smtpd_*_restrictions」。
今までは具体的に何をしているのか良く理解していなかった。
これはメールの制御をする為のものだった。
接続からSMTPのコマンド毎まで、細かな設定が可能。
smtpd_*_restrictionsを、評価される順に並べると下記の通り。
smtpd_client_restrictions
↓
smtpd_helo_restrictions
↓
smtpd_sender_restrictions
↓
smtpd_recipient_restrictions
↓
smtpd_etrn_restrictions
↓
smtpd_data_restrictions
↓
smtpd_end_of_data_restrictions
Postfixは機能豊富。豊富過ぎる。
Postfixの設定だけで飯を食って行けそうな気がするくらいに多い。
ただ、使うのは、ごく一部の機能だけ。
リファレンスはリファレンスとして用意しつつ、
受験用英単語の様に、頻出設定項目順に紹介して行くのは需要がありそう。
Postfix 辞典
posted with amazlet on 07.08.01
とみた まさひろ
翔泳社 (2006/06/21)
売り上げランキング: 203504
翔泳社 (2006/06/21)
売り上げランキング: 203504
2007年01月18日
2007年01月17日
どうしても0ではないものにしたい場合の解決例
$ diff -C5 /tmp/postfix /etc/init.d/postfix
*** /tmp/postfix 2007-01-17 15:25:28.000000000 +0900
--- /etc/init.d/postfix 2007-01-17 15:28:27.000000000 +0900
***************
*** 101,111 ****
--- 101,113 ----
force-reload|reload)
log_action_begin_msg "Reloading Postfix configuration"
if ${DAEMON} quiet-reload; then
log_action_end_msg 0
else
+ exitcode=$?
log_action_end_msg 1
+ exit $exitcode
fi
;;
flush|check|abort)
${DAEMON} $1
# /etc/init.d/postfix reload
Reloading Postfix configuration...postfix/postfix-script: fatal: the Postfix mail system is not running
failed.
# echo $?
1
2007年01月03日
Postfixは何もしないと頭にハイフンの付くメールアドレスへの送信不可能。
Jan 3 13:18:12 colinux postfix/qmgr[1234]: B52B520123: to=<-foo@example.com>, relay=none, delay=0, status=bounced (invalid recipient syntax: "-foo@example.com")
main.cfに『allow_min_user = yes』を追加
$ sudo vi /etc/postfix/main.cf
+ allow_min_user = yes
$ sudo /etc/init.d/postfix reload
Jan 3 13:38:19 colinux postfix/smtp[19284]: 3E3E34567B: to=<-foo@example.com>, relay=mail.example.com[192.0.2.25], delay=0, status=sent (250 Ok: queued as 85B80B2)
SPF等の送信ドメイン認証が原因ではない事もある。
MTAのログ確認を忘れずに。
Jan 3 13:18:12 colinux postfix/qmgr[1234]: B52B520123: to=<-foo@example.com>, relay=none, delay=0, status=bounced (invalid recipient syntax: "-foo@example.com")
main.cfに『allow_min_user = yes』を追加
$ sudo vi /etc/postfix/main.cf
+ allow_min_user = yes
$ sudo /etc/init.d/postfix reload
Jan 3 13:38:19 colinux postfix/smtp[19284]: 3E3E34567B: to=<-foo@example.com>, relay=mail.example.com[192.0.2.25], delay=0, status=sent (250 Ok: queued as 85B80B2)
SPF等の送信ドメイン認証が原因ではない事もある。
MTAのログ確認を忘れずに。
▼ファイル所有者に気をつける
.forwardのuid,gidは
オーナーのuidかつ、
オーナーのデフォルトグループのgidである必要あり。
.forwardが置かれているディレクトリのグループにオーナーが所属
されているのに.forwardが上手く働いていなかった。ログを見たら
gid問題だと言う事が判明。
Jan 2 13:15:16 colinux postfix/local[20745]: warning: file /home/project/bar/.forward has bad owner uid 1001
fooのデフォルトgidは1001なのに、gidが1002となっていた。
gidをデフォルトgidである1001に変更したら.forwardが有効になった。
解決例
$ sudo chown $(id -u ${file-owner}):$($id -g ${file-owner}) [file]
▼.forwardの中のコマンドはダブルクォートで囲む
何となく動いているコマンドはあるけど、意図した動きをしないコ
マンドもあった。原因はダブルクォートで囲んでいなかった事だ。
悪い例
| [command] || exit 75
良い例
"| [command] || exit 75"
.forwardのuid,gidは
オーナーのuidかつ、
オーナーのデフォルトグループのgidである必要あり。
.forwardが置かれているディレクトリのグループにオーナーが所属
されているのに.forwardが上手く働いていなかった。ログを見たら
gid問題だと言う事が判明。
Jan 2 13:15:16 colinux postfix/local[20745]: warning: file /home/project/bar/.forward has bad owner uid 1001
fooのデフォルトgidは1001なのに、gidが1002となっていた。
gidをデフォルトgidである1001に変更したら.forwardが有効になった。
解決例
$ sudo chown $(id -u ${file-owner}):$($id -g ${file-owner}) [file]
▼.forwardの中のコマンドはダブルクォートで囲む
何となく動いているコマンドはあるけど、意図した動きをしないコ
マンドもあった。原因はダブルクォートで囲んでいなかった事だ。
悪い例
| [command] || exit 75
良い例
"| [command] || exit 75"
2007年01月02日
vpopmailにおいけるvpopmailユーザーに集約させるような設定例。
ここでは example.com と *.example.com 宛メールをpostmasterへ集約させる。
/^[^@]+@(.*\.)?example\.com$/ -> postmaster
▼ルックアップ方法とテーブルファイルの設定追加
正規表現を利用するのでregexpを指定。
$ sudo vi /etc/postfix/main.cf
+ # subaddr
+ virtual_alias_domains = regexp:/etc/postfix/virtual_domains
+ virtual_alias_maps = regexp:/etc/postfix/virtual
▼mapファイルの生データ作成
$ sudo vi virtual_domains
/@(.*\.)?example\.com$/i true
$ sudo vi virtual
/@(.*\.)?example\.com$/ postmaster
▼mapファイル作成
$ sudo /usr/sbin/postmap /etc/postfix/virtual_domains
$ sudo /usr/sbin/postmap /etc/postfix/virtual
▼確認
$ /usr/sbin/postmap -q foo@example.com regexp:/etc/postfix/virtual_domains
true
$ /usr/sbin/postmap -q foo@bar.example.com regexp:/etc/postfix/virtual_domains
true
受信可能ドメイン名である事を確認出来る。
$ /usr/sbin/postmap -q @example.com regexp:/etc/postfix/virtual
postmaster
$ /usr/sbin/postmap -q @bar.example.com regexp:/etc/postfix/virtual
postmaster
postfixへaliasされている事を確認出来る。
▼反映
$ sudo /etc/init.d/postfix reload
Reloading Postfix configuration...done.
▼確認
$ telnet 127.0.0.1 25
helo localhost
mail from:foo@example.com
rcpt to:bar@example.com
quit
$ telnet 127.0.0.1 25
helo localhost
mail from:foo@example.com
rcpt to:sub@sub.example.com
quit
もしもaliasされてない等のエラーが何かが不足している。
エラーメッセージをじっくり読んで臨機応変に対応。
ここでは example.com と *.example.com 宛メールをpostmasterへ集約させる。
/^[^@]+@(.*\.)?example\.com$/ -> postmaster
▼ルックアップ方法とテーブルファイルの設定追加
正規表現を利用するのでregexpを指定。
$ sudo vi /etc/postfix/main.cf
+ # subaddr
+ virtual_alias_domains = regexp:/etc/postfix/virtual_domains
+ virtual_alias_maps = regexp:/etc/postfix/virtual
▼mapファイルの生データ作成
$ sudo vi virtual_domains
/@(.*\.)?example\.com$/i true
$ sudo vi virtual
/@(.*\.)?example\.com$/ postmaster
▼mapファイル作成
$ sudo /usr/sbin/postmap /etc/postfix/virtual_domains
$ sudo /usr/sbin/postmap /etc/postfix/virtual
▼確認
$ /usr/sbin/postmap -q foo@example.com regexp:/etc/postfix/virtual_domains
true
$ /usr/sbin/postmap -q foo@bar.example.com regexp:/etc/postfix/virtual_domains
true
受信可能ドメイン名である事を確認出来る。
$ /usr/sbin/postmap -q @example.com regexp:/etc/postfix/virtual
postmaster
$ /usr/sbin/postmap -q @bar.example.com regexp:/etc/postfix/virtual
postmaster
postfixへaliasされている事を確認出来る。
▼反映
$ sudo /etc/init.d/postfix reload
Reloading Postfix configuration...done.
▼確認
$ telnet 127.0.0.1 25
helo localhost
mail from:foo@example.com
rcpt to:bar@example.com
quit
$ telnet 127.0.0.1 25
helo localhost
mail from:foo@example.com
rcpt to:sub@sub.example.com
quit
もしもaliasされてない等のエラーが何かが不足している。
エラーメッセージをじっくり読んで臨機応変に対応。
2006年12月21日
メールの時間範囲指定配送を考察の続き
今回はPostfixで実現する方法を考えてみた。
キーワードは『終了ステータスコード75』
▼終了ステータスコード
"| [command] [args] || exit 75"
1. キューに対して何かしらの処理させたい[command]を作る
2. 配送してはならないキューなら終了ステータスコードとして0ではないもので終了させる。例えばexit 1。
3. exit 0でない場合は "|| [command]" が処理されるので上記ではexit 75を実行される
4. 対象キューは再送対象となって配送されずに済む。
『何だよ…Postfixでもこれを使えたのか』と思った。
▼環境変数
環境変数を組み合わせると、送信者毎や受信者毎に処理させることが可能。
下記、環境変数例。他にもいくつかある。
例えば受信者メールアドレス毎に何かをしたい場合。
"| [command] $RECIPIENT || exit 75"
これは.forwardではなくmaster.cfにpipeとしてサービス登録しても動くはず。
これらを利用してやれば日時指定配送、時間指定配送を実現出来るはずでもある。
さて、アイデアはまとまった。検証はこれからだ。
今回はPostfixで実現する方法を考えてみた。
キーワードは『終了ステータスコード75』
▼終了ステータスコード
"| [command] [args] || exit 75"
1. キューに対して何かしらの処理させたい[command]を作る
2. 配送してはならないキューなら終了ステータスコードとして0ではないもので終了させる。例えばexit 1。
3. exit 0でない場合は "|| [command]" が処理されるので上記ではexit 75を実行される
4. 対象キューは再送対象となって配送されずに済む。
『何だよ…Postfixでもこれを使えたのか』と思った。
▼環境変数
環境変数を組み合わせると、送信者毎や受信者毎に処理させることが可能。
下記、環境変数例。他にもいくつかある。
| SENDER | 送信者メールアドレス |
| RECIPIENT | 受信者メールアドレス |
| DOMAIN | 受信アドレスのドメインパート |
| LOCAL | 受信アドレスのローカルパート |
例えば受信者メールアドレス毎に何かをしたい場合。
"| [command] $RECIPIENT || exit 75"
これは.forwardではなくmaster.cfにpipeとしてサービス登録しても動くはず。
これらを利用してやれば日時指定配送、時間指定配送を実現出来るはずでもある。
さて、アイデアはまとまった。検証はこれからだ。
