さくらレンタルサーバでメールを受信したらPHPを動かす


PEARがPEARがって検索したら結構出てきたんですが、
PEARは使わないので自分で書いてみることに。

以前 OpenPNEをセットアップした時にやったので、さくっと .mailfilter を設定して
(ここら辺参照 http://sumidagawa.sblo.jp/article/11226948.html

メールデータを mail.php に飛ばす。

そうするとmail.phpに直で

Return-Path: <aaa@a.com>
Received: from ***.sakura.ne.jp (***.sakura.ne.jp [210.224.165.45])
	by ***.sakura.ne.jp (8.14.3/8.14.3) with ESMTP id n6H7MnFd094136
	for <php@phpdata>; Fri, 17 Jul 2009 16:22:49 +0900 (JST)
	(envelope-from aaa@a.com)
Received: from a.com (a.com [***.***.***.***])
	by ***.sakura.ne.jp (8.14.3/8.14.3) with ESMTP id n6H7Ml98094112
	for <php@phpdata>; Fri, 17 Jul 2009 16:22:47 +0900 (JST)
	(envelope-from aaa@a.com)
Received: by yxe11 with SMTP id 11so1156534yxe.3
        for <php@phpdata>; Fri, 17 Jul 2009 00:22:46 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.150.146.14 with SMTP id t14mr1339668ybd.142.1247815366595;
	Fri, 17 Jul 2009 00:22:46 -0700 (PDT)
Date: Fri, 17 Jul 2009 16:22:46 +0900
Message-ID: <710e6c850907170022u465e2601oe8fcdb18fad6bafa@a.com>
Subject: =?ISO-2022-JP?B?GyRCJCIkJCQmJCgkKhsoQiBhaXVlbw==?=
From: j <aaa@a.com>
To: php@phpdata
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
X-Anti-Virus: K-Prox Anti-Virus Powered by Kaspersky, bases: 17072009 #2246191, status: clean

ここに本文が入りますよー
ここに本文が入りますよー
ここに本文が入りますよー

こんな感じのデータが飛んでくるのでそれをばらして保存するだけ。

ってことで、こんな感じで書いてみた。

<?php
//mail.php
mb_language('Japanese');
mb_internal_encoding('UTF-8');
mb_detect_order("ASCII,JIS,EUC-JP,SJIS,UTF-8");

$mailData = array();
$inputedMail = new NoRewindIterator(new SplFileObject("php://stdin"));
foreach ($inputedMail as $eachLine) {
    $matchCount = preg_match("/^(.*?): (.*?)$/",$eachLine,$line);
    switch ($line[1]) {
        case 'Date':
            $mailData['date'] = $line[2];
            break;
        case 'To':
            $mailData['to'] = $line[2];
            break;
        case 'From':
            $mailData['from'] = $line[2];
            break;
        case 'Content-Type':
            $mailData['content-type'] = $line[2];
            break;
        case 'Subject':
            $sub = explode('?',$line[2]);
            switch ($sub[2]) {
                case 'B':
                    $mailData['subject'] = mb_convert_encoding(base64_decode($sub[3]),'UTF-8','ASCII,JIS,EUC-JP,SJIS,UTF-8');
                    break;
                case 'Q':
                    $mailData['subject'] = mb_convert_encoding(quoted_printable_decode($sub[3]),'UTF-8','ASCII,JIS,EUC-JP,SJIS,UTF-8');
                    break;
                default :
                    break;
            }
            break;
        default :
            if ($matchCount==0 && isset($mailData['content-type'])) {
                $mailData['body'] .= mb_convert_encoding($eachLine,'UTF-8','ASCII,JIS,EUC-JP,SJIS,UTF-8');
            }
            break;
    }
}

//print_r($mailData);
Array
(
    [date] => Fri, 17 Jul 2009 16:22:46 +0900
    [subject] => あいうえお aiueo
    [from] => ***
    [to] => ***@***.***
    [content-type] => text/plain; charset=ISO-2022-JP
    [body] => ここに本文が入りますよーここに本文が入りますよーここに本文が入りますよー
)
?>

添付ファイルの処理とか text/html の処理とかは別途書かないといけないけど、
基本的にこんな感じで動くので、
割と楽にメールベースの運用アカウント管理ツールとかが作れるという。
まあめんどくさいので、ペンディングですがw


Leave a Reply