Edit
Postfixとは

Edit
インストール

Edit
yumから

# yum install postfix

※バージョンがかなり古いのでおすすめしない。

Edit
ソースコードから

ソースからのコンパイルの場合、Barkrey-DB のヘッダーファイルの位置がエラーになる場合がある。そこでリンクを1つ作っておく。

# yum install compat-db
# ln -s /usr/include/db4.7.25 /usr/include/db
# ln -s /usr/lib64/db4.7.25 /usr/lib64/db
# wget http://mirror.postfix.jp/postfix-release/official/postfix-2.11.3.tar.gz
# tar zxvf postfix-2.11.3.tar.gz
# cd postfix-2.11.3

コンパイルの前にコンパイルコマンドを作成しておくと良い。

# touch compile.sh
# chmod +x compile.sh
# vi compile.sh
  #!/bin/sh
  make -f Makefile.init makefiles \
  CCARGS='-DHAS_MYSQL \
  -I/usr/local/mysql/include \
  -DDEF_CONFIG_DIR=\"/usr/local/postfix/etc\" \
  -DDEF_COMMAND_DIR=\"/usr/local/postfix/sbin\" \
  -DDEF_DAEMON_DIR=\"/usr/local/postfix/libexec\" \
  -DDEF_MAILQ_PATH=\"/usr/local/postfix/mailq\" \
  -DDEF_HTML_DIR=\"/usr/local/postfix/html\" \
  -DDEF_MANPAGE_DIR=\"/usr/local/man\" \
  -DDEF_NEWALIAS_PATH=\"/usr/local/postfix/newaliases\" \
  -DDEF_QUEUE_DIR=\"/usr/local/postfix/spool\" \
  -DDEF_README_DIR=\"/usr/local/postfix/readme\" \
  -DDEF_SENDMAIL_PATH=\"/usr/local/postfix/sbin/sendmail\" \
  ' \
  AUXLIBS='-L/usr/local/mysql/lib -L/usr/lib64/db -lmysqlclient -lz -lm'

その後コンパイル。

# ./compile.sh
# make
# make install

この際に、data_dir のみ /usr/local/postfix/data に変更。それ以外はリターンのみでOK.

Edit
デーモンユーザーの作成

存在しない場合のみ。

# cd /usr/local/postfix
# mkdir home
# groupadd postfix
# groupadd postdrop
# useradd  -g postfix -d /usr/local/postfix/home -s /bin/true postfix
# chown postfix:postfix /usr/local/postfix/home

Edit
設定

Postfixではバーチャルユーザーという形で、OSのユーザーに依存しないかたちで、自由にメールアドレスの追加を行うことが出来る。

Edit
データベース利用時の設定

postfix では、mysqlなどのDBを利用したメール管理が可能。インストールされた postfix が、どのようなDBを使えるかは、以下のコマンドで確認できる。

# postconf -m

Edit
main.cfの設定

項目名初期値概要
soft_bouncenoyesにすると、恒久的なエラーが一時的なエラーとして扱われる。この場合、宛先が無い場合、送り元のサーバーが何度も再送をするため、スパムが大量に送られた場合、大変な事になる。
queue_directory/var/spool/postfixpostfixがメールを送信する場合など、非同期で行われる際に一時的にメールを保存し管理するフォルダを指す。postfixがchroot起動すると、ここも相対的に移動してしまうので注意が必要
command_directory/usr/sbinpostfix関連のコマンドが保存されているフォルダを指定する。yumなどでインストールされている場合は、変更の必要は無い
daemon_directory/usr/libexec/postfixpostfixデーモン本体のフォルダ位置。yum インストールなどの場合、変更の必要は無い
data_directory/var/lib/postfixここは、postfixがメール管理に利用する管理用のデータ領域のフォルダを指す。主にキャッシュファイルや番号管理ファイルなどに利用される。変更の必要は無し
mail_ownerpostfixpostfixが作成する管理用のキューやデータ、プロセスのユーザーなどを指定する。通常 yum などでインストールされると、自動的にOSに postfix というユーザーが作成されるので、特に変更の必要はない
default_privsnobody受け取るユーザーが無い場合の、初期ユーザーを指定する。これは設定によっては、プログラムの起動が伴う設定などが存在するため、nobody以外の指定はまず行わない。特に管理者権限やpostfixユーザーなどの設定は絶対に行わないこと
myhostnamevirtual.domain.tldpostfixで管理するホスト名を指定する。ここは自分の環境に合わせて変更する。
mydomaindomain.tldpostfixで管理するドメイン名を指定する。ここは自分の環境に合わせて変更する。
myorigin$mydomainローカルで送信されたメールがどのドメインから来るように見えるかを指定する。この$mydomainは、上記の mydomain 設定を引用していることを意味する。
inet_interfaceslocalhostメールが受け取れるサーバー範囲の指定。ここは外部からのメールを受け取るサーバーの場合、all を指定する
inet_protocolsallメールが受け取れるプロトコルの指定。ここはIPv4のみの受信の場合、IPv4 を指定できる(IPv4, IPv6が指定可能)。但し基本的には ipv4 が良い。
proxy_interfacesinet_interfacesの設定の拡張指定。通常は指定する必要はない。
mydestination$myhostname, localhost.$mydomain, localhost, $mydomainこのマシンが自分自身が最終目的地だとみなすドメインのリストを指定する。 バーチャルドメインの名前を指定してはならない。よって通常変更の必要は無し。
local_recipient_mapsこのパラメータが定義されていると、存在しないローカルユーザ宛のメールを拒否する。特に設定の必要は無し
unknown_local_recipient_reject_code550存在しないローカルユーザ宛のメールの場合のコード。500番台は恒久的エラー
mynetworks_styleリレー出来る信頼するsmtpクライアントを指定する。指定がない場合、postfixが自動的に判断する
mynetworks上記のIP設定版。こちらが設定されていると、mynetworks_styleの設定は無視される。通常中継させるサーバーを設定する機会が無いと思うので、基本は 127.0.0.0/8 を指定して、事実上の中継は無しに設定する。
relay_domains$mydestinationどの目的地にメールを中継するかを制限します。通常中継設定しなければ、設定の必要無し
relayhostこれも配送に関する設定のため、設定の必要無し
relay_recipient_maps指定されたリレーユーザー以外は拒否される。例:hash:/etc/postfix/relay_recipients。但しリレーしなければ意味なし
in_flow_delay1sメッセージ到着速度が配送速度を越えた時、指定秒停止。設定の必要無し
alias_mapshash:/etc/aliasesローカル配送エージェントが利用するエイリアスデータベースのリストを指定。バーチャルを使っている場合、エイリアスを使っていない場合には意味はなし
alias_databasehash:/etc/aliasesエイリアスデータベースを指定。alias_mapsと基本同じ。
recipient_delimiter+ユーザ名と拡張アドレス(user+foo)のセパレータ(分離符号)を指定。通常指定の必要無し
home_mailboxMaildir/メールボックスフォルダ名の指定/を最後につけると、maildir形式での保存。DBを利用する場合などでは設定する必要無し
mail_spool_directory/var/spool/mailUNIXスタイルのメールボックスが保存されるディレクトリを指定。DBを利用する場合などでは設定する必要無し
mailbox_command/some/where/procmailメールボックス配送の代わりに利用するオプションの外部コマンドを指定。指定の必要無し
mailbox_transportlmtp:unix:/var/lib/imap/socket/lmtpmaster.cf に挙げられた配送方法をオプションで指定。指定の必要無し
fallback_transportlmtp:unix:/var/lib/imap/socket/lmtpUNIX passwd データベースに見つからなかった受信者に対して使う master.cf 内の配送方法をオプションで指定。指定の必要無し
luser_relayadmin+$localパラメータは知らない受信者に対する、転送先アドレスをオプションで指定。設定の必要無し
header_checksregexp:/etc/postfix/header_checks複数の物理行にまたがるヘッダも含めて、正規表現テーブルマッチの判定をオプションで指定。指定の必要無し
fast_flush_domains$relay_domains遅延メールの情報を持つ目的地毎のログファイルを維持している情報を、コマンドでflush することができる。設定の必要無し
smtpd_banner$myhostname ESMTP $mail_name ($mail_version)バージョンの問い合わせに対しての返答方法の指定。設定の必要無し
default_destination_concurrency_limit20同一目的地に対する最大並行送信数の指定
debug_peer_level2デバッグエラーログのレベル指定
debug_peer_list127.0.0.1指定ホストのエラーのみをマッチング出力
debugger_commandデバッガーのコマンドライン指定
sendmail_path/usr/sbin/sendmail.postfixsentmail互換の為のパスを指定
newaliases_path/usr/bin/newaliases.postfixnewaliases互換の為のパスを指定
mailq_path/usr/bin/mailq.postfixmailq互換の為のパスを指定
setgid_grouppostdropメール提出およびキューマネージメントコマンドのグループ
html_directorynoPostfix HTML ドキュメントの場所
sample_directory/usr/share/doc/postfix-2.6.6/samplesオンラインマニュアルページの場所
readme_directory/usr/share/doc/postfix-2.6.6/README_FILESREADME ファイルの場所
append_at_myoriginyes初期値:yes。ローカル投稿メールでドメイン情報のないメールアドレスに文字列 @$myoriginを付与。リモート投函メールでは、代わりに @$remote_header_rewrite_domainを付加
append_dot_mydomainyes初期値:yes。基本的には不必要。append_dot_mydestinationと関係

Edit
Mysqlを利用したmain.cfの設定例

# vi /etc/postfix
    myhostname = mail.mydomain.com
    mydomain = mydomain.com
    myorigin = $mydomain
    inet_interfaces = all
    mynetworks=127.0.0.0/8
    virtual_alias_domains = mysql:/etc/postfix/connect_domain.mysql
    virtual_alias_maps = mysql:/etc/postfix/connect_map.mysql
項目名設定値概要
virtual_alias_domainsmysql:/etc/postfix/postfix_domain.mysql転送用に受信するドメイン名
virtual_alias_mapsmysql:/etc/postfix/postfix_map.mysql転送先のマッピング

<データベース接続設定ファイル>

# vi /etc/postfix/postfix_domain.mysql
   hosts = localhost
   user = postfixuser
   password = postfixpass
   dbname = postfix
   query = SELECT name FROM domains WHERE name = '%s'

# vi /etc/postfix/postfix_map.mysql

   hosts = localhost
   user = postfixuser
   password = postfixpass
   dbname = postfix
   query = SELECT fwdaddr FROM virtual_maps WHERE name = '%s'

Edit
MySQL側の設定

<テーブルの作成>

> create database postfix;
> grant all on postfix.* to postfixuser@localhost identified by 'postfixpass';
> create table domains (name varchar(253) not null unique);
> create table virtual_maps (name varchar(254) not null unique, fwdaddr varchar(254) not null);

Edit
バーチャルドメインの設定

postfixでは、unixアカウントを利用せず、かつ複数のドメインのメールを受け取る事が出来る。

Edit
バーチャルドメイン&ユーザーのmain.cfの設定

項目名設定例概要
virtual_minimum_uid100virtual_uid_maps 検索から返されたものとしてuid の最小値を指定します。返り値がこの値より小さいと拒否されメッセージは遅延する。基本的には virtual_uid_maps の記述ミスの為の安全機構なので、uidが static 指定であれば必要ない
virtual_uid_mapsstatic:5000ファイルで指定すれば、各バーチャルユーザー毎にuidを設定できるがあまり意味がないので通常は、static指定でuidを固定しておく
virtual_gid_mapsstatic:5000ファイルで指定すれば、各バーチャルユーザー毎にgidを設定できるがあまり意味がないので通常は、static指定でgidを固定しておく
virtual_mailbox_base/var/spool/mail/virtual全てのバーチャルメールボックスのパスの前に付けるパス名を指定。要するにこのフォルダ以下に仮想メールボックスが作成される
virtual_mailbox_domains/etc/postfix/virtual_mailbox_domainsファイル内にドメイン一覧を記述。ファイル名の代わりに、ここに直接受け取れるドメイン名も指定できる。カンマで複数ドメイン名の指定も可能
virtual_mailbox_mapshash:/etc/postfix/virtual_mailbox_mapsバーチャルユーザーの指定。バーチャルなのでユーザー名はドメイン名付きで記述。hash がかかっているので、postmap コマンドを忘れないこと。詳細は下記
virtual_mailbox_limit0各バーチャルユーザーのメールボックスの最大容量を設定。Bytes指定。0なら無制限。指定がない場合は50MBが初期値
virtual_transportvirtualvirtual_mailbox_domains パラメータ値にマッチするドメイン宛の、 デフォルトのメール配送 transportの指定。指定なしの場合の初期値=virtual よって設定の必要無し。

Edit
バーチャルドメインの管理

ここでは、mailboxを対象にしたものも、aliasを対象にしたものも設定方法は同じ。

# vi /etc/postfix/virtual_mailbox_domains
   mydomain.com
   mydomain2.com
   mydomain3.com

ドメインの更新

# postfix reload

Edit
バーチャルユーザーの管理

複数のドメインでも同じファイルに記述する。以下に記述方法の参考。

# vi /etc/postfix/virtual_mailbox_maps
    foo.001@domain001.com   domain001.com/foo.001/
    foo.002@domain001.com   domain001.com/foo.002/
    foo.001@domain002.com   domain002.com/foo.002/

※ユーザー名を記述せずドメイン名だけだと、存在しないユーザのメールも何でも受けるユーザーとなる。(SPAMが大量に来るので使用注意)

    @example.com	example.com/catchall/

ファイル変更後データを更新する。

#  postmap /etc/postfix/virtual_mailbox_maps

サービスを再起動(centos7の場合は systemctl で)

# service postfix reload

Edit
バーチャルユーザーの参考設定

バーチャルメールボックス有り

# vi /etc/postfix/main.cf
   mail_owner = postfix
   myhostname = mail.mydomain.com
   mydomain = mydomain.com
   inet_interfaces = all
   inet_protocols = all
   mydestination = 
   mynetworks = 127.0.0.0/8
   virtual_mailbox_base = /home/mail/virtual/
   virtual_mailbox_domains = /etc/postfix/virtual_mailbox_domains
   virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps

Edit
バーチャルエイリアスの設定

バーチャルエイリアスは、その名の通り実際のメールボックスを持たずに、エイリアス機能のバーチャル版として、バーチャルメールアドレスの別名やメールの転送などを設定する。

Edit
バーチャルドメイン&ユーザーのmain.cfの設定

項目名設定例概要
virtual_alias_domains/etc/postfix/virtual_alias_domainsファイル内にエイリアスドメイン一覧を記述。virtual_mailbox_domainsと同じ
virtual_alias_mapshash:/etc/postfix/virtual_alias_mapsバーチャルユーザーのアイリアス設定ファイル

virtual_alias_mapsの記述方法は、virtual_mailbox_mapsと同じ。また同じ様にファイル修正後は、postmapを忘れないこと。

# postmap /etc/postfix/virtual_alias_maps

Edit
名前解決における注意点と設定のコツ

postfixは、virtual_alias_maps を先に検索してから、virtual_mailbox_maps を探しにいく。そのため、自分の mailbox にも配送し、別の携帯などのメールにも配送させたい場合、このような設定が可能となる。

# vi virtual_alias_maps 
   myname@mydomain.com      myname@mydomain.com,myname@docomo.ne.jp

一軒すると無限ループなのだが、postfixは無限ループを発見すると、そこで評価を止め、virtual_mailbox_maps の方で再検索する。よって、この設定では mailbox 内の myname@mydomain.com アドレスにメールの実体が格納されつつ、myname@docomo.ne.jp のアドレスにも転送される設定となる。

Edit
纏めて転送

設定ファイルで正規表現を使っているファイルであることを設定(/etc/postfix/main.cf)

virtual_alias_maps = regexp:$config_directory/virtual_alias_maps.regexp

エイリアス設定ファイルを下記の様に設定(/etc/postfix/virtual_alias_maps.regexp)

/^(.*)@domain1\.com$/      $1@domain1.com, $1@domain2.com

※hashは掛けない。

Edit
メールボックスを作成しないバーチャルエイリアスのみの設定例

# vi /etc/postfix/main.cf
   mail_owner = postfix
   myhostname = mail.mydomain.com
   mydomain = mydomain.com
   inet_interfaces = all
   inet_protocols = all
   mydestination =
   mynetworks = 127.0.0.0/8
   virtual_alias_domains   = mydomain.com
   virtual_alias_maps      = hash:/etc/postfix/virtual_alias_maps

Edit
便利なコマンド

<バージョンチェック>

# /usr/sbin/postconf  | grep mail_version

<初期値と違っている項目だけ表示>

# /usr/sbin/postfix -n

Edit
トラブルシューティング

Edit
自分のサーバーのIPがブラックリストに登録されていないか?

url : https://mxtoolbox.com/blacklists.aspx

Edit
チェックツール

https://mxtoolbox.com/SuperTool.aspx?action=smtp

Edit
SPFの設定

Edit
Googleメールに届かない。