(2014/09/08 追記) 下記方法では、SPFの設定が完全に有効になりません。 [Postfix]エイリアスでメール送信するときに気をつけること(エンベロープFromの書き換え)を参照してください。 (追記終わり)
記事数が少ないながらも色んな記事を投稿していますが、Postfixのインストールや、SPFレコードの設定が、中々の人気がありますので、ウケが良いPostfixの記事を増やしていきたいと思いますw
今回は、メールを受信する時の設定をしていきたいと思います。 メール受信には2通りあります。一つ目は、受信BOXをサーバ内に設定して、メールを受信BOXに溜め込み、メールソフトなどでメールをダウンロードする方法です。こちらはPostfixに加え、Dovecotというソフトウェアをインストールし、設定する必要があるため、少々大変です。二つ目は受信したメールを別メールに転送するか、何らかのスクリプトを実行する方法です。こちらはPostfixのエイリアス(aliases)という設定を行うだけで、一つ目の方法と比較しても設定が楽にできます。
そこで今回は、Postfixのエイリアスを設定して別メールに転送する設定を行います。また、メール受信時にPHPスクリプトを実行する設定も行います。
今回の目標
- contact@foo.com にメール送信すると、foo_contact@gmail.com にメールが転送されるようにする
- register@foo.com にメール送信すると、指定したPHPスクリプトが実行される
サーバ環境
DNSの設定
iptablesの設定
メール受信するのでSMTP(25番)のポートを解放します。
# /etc/sysconfig/iptables
# 追加
-A FIREWALL -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
iptablesを再起動します。
$ sudo service iptables restart
設定を確認します。
$ sudo iptables -L
Chain FIREWALL (2 references)
...(省略)...
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:smtp
...(省略)...
上記のようになっていれば設定が完了です。
Postfixの設定
aliasesを編集
エイリアスを設定するのは、/etc/aliases で行います。
# /etc/aliases
# 行末に追加
contact: foo_contact@gmail.com
- 左側の設定は、ユーザ名で、<ユーザ名>@foo.comの<ユーザ名>にあたります
- 右側の設定は、転送先のメールアドレスです
エイリアスの設定を反映
エイリアスを反映させるには、newaliasesコマンドを使います。
$ sudo newaliases
動作確認
メールでcontact@foo.com にメール送信して、foo_contact@gmail.comにメールが受信できれば完了です。
メールログも確認します。
# /var/log/maillog
Mar 31 00:13:08 foo.com postfix/smtpd[12234]: connect from mail-ve0-f180.google.com[209.85.128.180]
Mar 31 00:13:08 foo.com postfix/smtpd[12234]: B9FC64C12C8: client=mail-ve0-f180.google.com[209.85.128.180]
Mar 31 00:13:09 foo.com postfix/cleanup[12238]: B9FC64C12C8: message-id=<CAHvP04aYwd1pOziyrUHtPQfKH7LagcZiok0sOcm+N374+0DtpA@mail.gmail.com>
Mar 31 00:13:09 foo.com postfix/qmgr[1977]: B9FC64C12C8: from=<bar@bar.com>, size=2235, nrcpt=1 (queue active)
Mar 31 00:13:09 foo.com postfix/cleanup[12238]: 1BD2C4C1335: message-id=<CAHvP04aYwd1pOziyrUHtPQfKH7LagcZiok0sOcm+N374+0DtpA@mail.gmail.com>
Mar 31 00:13:09 foo.com postfix/local[12239]: B9FC64C12C8: to=<contact@foo.com>, relay=local, delay=0.54, delays=0.53/0.01/0/0, dsn=2.0.0, status=sent (forwarded as 1BD2C4C1335)
Mar 31 00:13:09 foo.com postfix/qmgr[1977]: 1BD2C4C1335: from=<bar@bar.com>, size=2369, nrcpt=1 (queue active)
Mar 31 00:13:09 foo.com postfix/qmgr[1977]: B9FC64C12C8: removed
Mar 31 00:13:09 foo.com postfix/smtpd[12234]: disconnect from mail-ve0-f180.google.com[209.85.128.180]
Mar 31 00:13:10 foo.com postfix/smtp[12240]: 1BD2C4C1335: to=<foo_contact@gmail.com>, orig_to=<contact@foo.com>, relay=gmail-smtp-in.l.google.com[74.125.25.26]:25, delay=1.2, delays=0/0.01/0.4/0.75, dsn=2.0.0, status=sent (250 2.0.0 OK 1396192390 tk5si7429256pbc.209 - gsmtp)
Mar 31 00:13:10 foo.com postfix/qmgr[1977]: 1BD2C4C1335: removed
メール受信時にPHPスクリプトを実行する方法
aliasesファイルを使って、メール受信した時にPHPスクリプトを実行させる設定を行います。主な用途としては空メールによるユーザ登録などに使います。
PHPスクリプトを作成
// /tmp/register.php
<?php
// メール受信した内容を$mailに格納
$mail = file_get_contents("php://stdin");
// ユーザ登録など
...
exit;
aliasesの設定
# /etc/aliases
contact: foo_contact@gmail.com
# 行末に追加
register: "|/usr/bin/php /tmp/register.php"
先ほどのcontactと異なり、phpコマンドと実行ファイル(.php)を指定します。 phpコマンドのパスはサーバによって異なるので、適宜変更してください。
エイリアスの設定を反映
$ sudo newaliases
動作確認
メールでregister@foo.com にメール送信して、PHPスクリプトが実行されれば完了です。
メールログも確認します。
# /var/log/maillog
Mar 31 00:31:09 foo.com postfix/smtpd[12277]: connect from mail-vc0-f176.google.com[209.85.220.176]
Mar 31 00:31:10 foo.com postfix/smtpd[12277]: 3FA004C12C8: client=mail-vc0-f176.google.com[209.85.220.176]
Mar 31 00:31:10 foo.com postfix/cleanup[12281]: 3FA004C12C8: message-id=<CAHvP04Yq2OuEgABETOc+kZhbdGDniOwVuhJ8EpuwbcRV=JRoEA@mail.gmail.com>
Mar 31 00:31:10 foo.com postfix/qmgr[1977]: 3FA004C12C8: from=<bar@bar.com>, size=1733, nrcpt=1 (queue active)
Mar 31 00:31:10 foo.com postfix/smtpd[12277]: disconnect from mail-vc0-f176.google.com[209.85.220.176]
Mar 31 00:31:11 foo.com postfix/local[12282]: 3FA004C12C8: to=<register@foo.com>, relay=local, delay=1, delays=0.51/0.01/0/0.53, dsn=2.0.0, status=sent (delivered to command: /usr/bin/php /tmp/register.php)
Mar 31 00:31:11 foo.com postfix/qmgr[1977]: 3FA004C12C8: removed
コマンドが実行されていることが確認できます。
最後に
Postfixでエイリアス(aliases)を設定することで、別メールに転送したり、PHPスクリプトを実行したりできました。 今回の設定では、エイリアスの設定できたドメインは1つだけでしたが、サーバ内で2つ以上のドメインで送受信を設定したい場合はVirtualDomainという設定を行うので、次回はそちらを書きたいと思います。