Postfixの正規表現を使って、届いたメールをphpにパイプする処理
更新日:2012/05/17 16:31
概要
「空メールをトリガーに会員登録とかをしたい」みたいな時に、Postfixのエイリアス機能を使い、メールの内容をphpにパイプします
環境
Postfixのバージョン(2.5.5)
reg-xxxxx@example.comみたいなメールアドレスにメールが届いた場合、PHPを起動します(xxxxxは半角英数字のみ)
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
参考にさせて頂いたサイト・書籍