Postfixの正規表現を使って、届いたメールをphpにパイプする処理

更新日:2012/05/17 16:31

概要
「空メールをトリガーに会員登録とかをしたい」みたいな時に、Postfixのエイリアス機能を使い、メールの内容をphpにパイプします
環境
Postfixのバージョン(2.5.5)
reg-xxxxx@example.comみたいなメールアドレスにメールが届いた場合、PHPを起動します(xxxxxは半角英数字のみ)
Postfixの設定

Postfixのインストール

								# apt-get install postfix
							

main.cfの設定

								# vim /etc/postfix/main.cf

								 (中略)

								myhostname = example.com
								alias_maps = hash:/etc/postfix/aliases                                 // 変更
								alias_database = hash:/etc/postfix/aliases                             // 変更
								virtual_alias_maps = regexp:/etc/postfix/virtual_maps                  // 追加
								local_recipient_maps =                                                 // 追加
								myorigin = /etc/mailname
								mydestination = example.com, localhost.ath.cx, localhost
								mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
								mailbox_command = procmail -a "$EXTENSION"
								mailbox_size_limit = 0
								recipient_delimiter = +
								inet_interfaces = all              // 書いとかないと外からのメールが受けれない

								// # これ以下はGmailのsmtpを使う設定
								relay_transport = smtp
								relayhost = [smtp.gmail.com]:587
								smtp_use_tls = yes
								smtp_sasl_auth_enable = yes
								smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
								smtp_sasl_security_options = noanonymous
								smtp_sasl_mechanism_filter = plain
							

/etc/postfix/virtual_mapsの設定

								# vim /etc/postfix/virtual_maps
							
								// [reg-0a1b2@example.com]みたいなアドレスに届いたメールは、[php@example.com]として受け取る事にする
								/^reg-[0-9a-z]{5}(@.*)?$/ php
							

/etc/postfix/aliasesの設定

								# cp /etc/aliases /etc/postfix/aliases
								# vim /etc/postfix/aliases
							
								// [php@example.com]にメールが届いた場合、コマンドラインでphpを実行する
								php: "|/usr/bin/php -f /home/hoge/mailtest/test.php >> /home/hoge/mailtest/mail.log"
							

エイリアスの反映と再起動

restartは要らないかも

								# newaliases
								# /etc/init.d/postfix restart
							

postmapで見てみる

								# postmap -q reg-aaaaa@example.com regexp:/etc/postfix/virtual_maps 
								php  // ←/etc/postfix/aliasesで設定したアカウントが表示されたらOK
							
PHPでテストプログラムを作成

ここから↓は届いたメールを処理するPHPのテスト用プログラム
ラッパーにお前の予定!! 日記さんのReceiptMailDecoderクラスを利用させて頂きました

PEARを入れる

								# apt-get install php-pear
							

メール関連のPEARライブラリを入れる

								# pear install Mail
								# pear install Mail_Mime
								# pear install Mail_MimeDecode
							

/home/hoge/mailtest/test.phpを作る

								# vim /home/hoge/mailtest/test.php
							
								<?php
								require_once('ReceiptMailDecoder.class.php');
								    
								    $stdin = fopen("php://stdin", "r");
								    
								    if($stdin)
								    {
								        while (!feof($stdin)){
								            $body .= fgets($stdin,1024);
								        }

								        $decoder =& new ReceiptMailDecoder($body);

								        $toAddr   = $decoder->getToAddr();
								        $fromAddr = $decoder->getFromAddr();
								        $toString = $decoder->getDecodedHeader( 'to' );
								        $subject  = $decoder->getDecodedHeader( 'subject' );

								        // text/planなメール本文を取得する
								        $body = mb_convert_encoding($decoder->body['text'],"sjis","jis");
								        // text/htmlなメール本文を取得する
								        $body = mb_convert_encoding($decoder->body['html'],"sjis","jis");

								        $account = substr($toAddr, 0, strpos($toAddr, "@"));

								        //-- debug print start
								        print $toAddr."\n";
								        print $fromAddr."\n";
								        print $toString."\n";
								        print $subject."\n";
								        print $body."\n";
								        //-- debug print end
								    }
								?>
							

/home/hoge/以下にファイルをアップ

								// ↓アップ後
								/home/hoge# tree
								.
								|-- mailtest
								|   |-- ReceiptMailDecoder.class.php
								|   `-- test.php
							

メールを送ってみる

								mail reg-0a1b2@example.com
								Subject: aaaaaaaaaa
								bbbbbbbbbb
								
								// [Ctrl]+[D] 押す
								Cc: 
							

ログを見てみる

								# cat mail.log 
								reg-0a1b2@example.com
								root@example.com
								reg-0a1b2@example.com
								aaaaaaaaaa
								bbbbbbbbbb
							
参考にさせて頂いたサイト・書籍


このエントリーをはてなブックマークに追加

このページの先頭へ