postfixでメアドを追加して受信したメールをシェルに食わせる


postfixが入っている前提です。
環境は
CentOS 6.7
になります。

このページでは
・masterユーザが自身の[email protected]以外に[email protected]宛てのメールを取得する。
・受け取ったメールをシェルに食わせて何かしらの自動処理を行う

の2点になります。

まーよくあるヤツですが、
頻繁に触るような設定でもないですし忘れがちになっちゃうので
自分自身の備忘録として書きとめます。

メールアドレスを追加

postfixの設定を確認後、
メアド-ユーザの対応ファイルの設定をいじるという流れです。

次回以降はpostfixの設定は触らないので、メアド-ユーザの対応ファイルの設定を
編集してpostfixを再起動すればOK。

postfixの設定確認

[root@MYSERVER ~]# vi /etc/postfix/main.cf

main.cf
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = mail.hogehoge.jp
mydomain = hogehoge.jp
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
unknown_local_recipient_reject_code = 550
mynetworks_style = host
mynetworks = 9.9.9.9/24, 127.0.0.0/8, 99.99.99.99/9 #9はプライベート,99はパブリック
relay_domains = $mydestination
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP unknown
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.6.6/samples
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES

#以下、適時修正
disable_vrfy_command = yes
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sender_restrictions = reject_unknown_sender_domain
message_size_limit = 10485760

#バーチャル用ファイルの使用
virtual_alias_maps = pcre:/etc/postfix/virtual.regxp

#メールボックスの容量制限(1GB/ユーザ)
mailbox_size_limit = 1024000000

今回はメアド追加なので下から2つ目のvirtual_alias_mapsを確認し、
その値に定義されているファイル(ここでは、/etc/postfix/virtual.regxp
)を編集します。

virtual.regxpの設定

[root@MYSERVER ~]# vi /etc/postfix/virtual.regxp

virtual.regxp
#
#[email protected] -> testuser
#[a-z][a-z]@hogehoge.jp -> sysuser
#dev([0-9]{3})[email protected] -> devuser
#
/^[a-z][a-z]\@hogehoge\.jp$/   sysuser
/^dev([0-9]{3})?\@hogehoge\.jp$/   devuser
/^hoge\@hogehoge\.jp$/   master

このファイルはメールアドレスと対応するLinuxユーザを紐付ける設定を書きます。
ちなみにメアド部分は正規表現で書けます。
今回はとくに正規表現関係ないのでキャストにだけ気をつけて追記して終了。

postfix再起動

[root@MYSERVER ~]# /etc/init.d/postfix restart

再起動して反映させる。
これで[email protected]宛てのメールはmasterユーザに転送されます

シェルに食わせる

HOMEディレクトリの.forwardファイルに食わせたいシェルを記載する感じです。
こんな感じです

.forward
[master@MYSERVER ~]$ cat $HOME/.forward
"|exec /home/master/mail.sh"

シェル側はメール1通ごとにキックされ、メール内容は標準入力でを受け取れます。

ちなみに自分は
送信元アドレスのMXでドメインチェックをjavaで行ったんですが
興味ある方はそちらも見てください。ソースしかないけど。

余談ですが
.forwardに別のアドレスを書けばそこに転送されます。

[master@MYSERVER ~]\$ cat $HOME/.forward

.forward
[email protected]
sysuser
\master

上記の場合、master宛てのメールは[email protected]およびsysuser,masterに転送。
master自身にも転送されるのでmaster自身のメールボックスにも入るイメージです。
ただし、自分自身を書く際は先頭に¥をつけること。

最後脱線しましたが以上です。