本日も乙

ただの自己満足な備忘録。

Postfixで受信したメールを別メールに転送する(エイリアス)

(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の設定

こちらの記事で設定した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という設定を行うので、次回はそちらを書きたいと思います。