OSDN Git Service

test
[exhaust/zubora.git] / receiver.phpc
1 <?php\r
2 require_once('Mail/mimeDecode.php');\r
3 require_once('Mail/RFC822.php');\r
4 require_once('Mail.php');\r
5 require_once(dirname(__FILE__)."/zubora.phpl");\r
6 \r
7 /* 基本関数 */\r
8 class DBWriter{\r
9         var $prefix = PREFIX;\r
10         var $session = array();\r
11         var $writeReady = false;\r
12         var $ERROR = "";\r
13         var $zdb = null;\r
14         function DBWriter(){\r
15                 $this->zdb = new ZuboraDB();\r
16         }\r
17         function decodeMail($mail){\r
18                 $params = array();\r
19                 $params['include_bodies'] = true;\r
20                 $params['decode_bodies'] = true;\r
21                 $params['decode_headers'] = true;\r
22                 $decoder = new Mail_mimeDecode($mail);\r
23                 try {\r
24                         $mail = $decoder->decode($params);\r
25                 }catch(Exception $e) {\r
26                         $this->ERROR .= "メール解析時にエラーが発生しました。(".$e->getMessage().")\n";\r
27                         return false;\r
28                 }\r
29                 if(!isSet($mail->headers['from']) or !isSet($mail->headers['to']) or !isSet($mail->headers["subject"])){\r
30                         $this->ERROR .= "必要な情報がメールから取得できませんでした。\n";\r
31                         return false;\r
32                 }\r
33                 $from = Mail_RFC822::parseAddressList($mail->headers['from']);\r
34                 $from = $from[0]->mailbox.'@'.$from[0]->host;\r
35                 $to = Mail_RFC822::parseAddressList($mail->headers['to']);\r
36                 $to = $to[0]->mailbox.'@'.$to[0]->host;\r
37                 list($mbox,$domain) = explode("@",$to);\r
38                 list($prefix,$book,$himoku) = explode(PREFIX_SEP_MAIL,$mbox);\r
39                 $price = $mail->headers["subject"];\r
40                 $this->checkPrefix($prefix);\r
41                 $this->checkBook($book,$domain);\r
42                 $this->checkHimokuPrice($book,$himoku,$price);\r
43                 $this->checkUser($book,$from);\r
44                 if($this->ERROR != ""){\r
45                         mb_language("ja");\r
46                         $headers = 'From: '.$to."\r\n".\r
47                                    'Reply-To: '.$to."\r\n".\r
48                                    'X-Mailer: PHP/'. phpversion();\r
49                         //常にメインメールアドレスに送信(携帯メールだと文字化けやサーバーにはねられる可能性がある為)$this->zdb->getMainMailAddr($from)\r
50                         mail($from,mb_encode_mimeheader(mb_convert_encoding("ズボラ家計簿エラー!", "ISO-2022-JP","AUTO")),mb_convert_encoding($this->ERROR, "ISO-2022-JP","AUTO"),$headers,"-f$from");\r
51                         //このエラーをもっと分かりやすくする。\r
52                         return false;\r
53                 }else{\r
54                         $this->session["note"] = trim(mb_convert_encoding($mail->body,"UTF-8","ISO-2022-JP"));\r
55                         return true;\r
56                 }\r
57         }\r
58         function checkPrefix($prefix){\r
59                 if(PREFIX != $prefix){\r
60                         $this->ERROR .= "メールアドレスのプレフィクス指定が間違っています。(".$prefix.")\n";\r
61                 }else{\r
62                         $this->session["prefix"] = $prefix;\r
63                 }\r
64         }\r
65         function checkBook($book,$domain){\r
66                 $book = $this->zdb->getBook($book,$domain);\r
67                 if(false === $book){\r
68                         $this->ERROR .= "投稿アドレスドメインに対応づけられた家計簿が存在しません。\n";\r
69                 }else{\r
70                         $this->session["book"] = $book["book"];\r
71                 }\r
72         }\r
73         function checkHimokuPrice($book,$himoku,$price){\r
74                 if(!is_numeric($price)){\r
75                         $this->ERROR .= "金額欄が数字ではありません。(".$price.")\n";\r
76                         $price = 0;\r
77                 }else{\r
78                         $price = intval($price);\r
79                 }\r
80                 $himoku = $this->zdb->getHimoku($book,$himoku);\r
81                 if(false === $himoku){\r
82                         $this->ERROR .= "存在しない費目が指定されています。(".$himoku.")\n";\r
83                 }else{\r
84                         if(($himoku["plus"] == true and $price < 0)or($himoku["plus"] == false and $price > 0)){\r
85                                 $price = -1 * $price;\r
86                         }\r
87                         $this->session["price"] = $price;\r
88                         $this->session["himoku"] = $himoku["himoku"];\r
89                 }\r
90         }\r
91         function checkUser($book,$from){\r
92                 $mail = $this->zdb->getMainMailAddr($from);\r
93                 $isSubscribed = $this->zdb->isSubscribed($book,$mail);\r
94                 if(false === $mail){\r
95                         $this->ERROR .= "この家計簿で有効な送信メールアドレスではありません。(".$from.")\n";\r
96                 }else{\r
97                         if($isSubscribed){\r
98                                 $this->session["mail"] = $mail;\r
99                         }else{\r
100                                 $this->ERROR .= "この家計簿に関連付けれていないアドレスから送信されました。(".$mail.")\n";\r
101                         }\r
102                 }\r
103         }\r
104         function doInsert(){\r
105                 if(!$this->zdb->addBalance($this->session["book"],$this->session["himoku"],$this->session["price"],$this->session["mail"],$this->session["note"])){\r
106                         $this->ERROR .= $zdb->ERROR;\r
107                 }\r
108                 file_put_contents(dirname(__FILE__)."/log.hide",$this->ERROR."\nsuccess\n\n"."ユーザ: ".$this->session["mail"]."\r
109 金額: ".$this->session["price"]."\r
110 費目: ".$this->session["himoku"]."\r
111 ノート: ".$this->session["note"]."\n\n");\r
112         }\r
113         function printError(){\r
114                 file_put_contents(dirname(__FILE__)."/log.hide","error\n\n".$this->ERROR);\r
115         }\r
116 }\r
117 \r
118 $dbw = new DBWriter();\r
119 if($dbw->decodeMail(file_get_contents('php://stdin'))){\r
120         $dbw->doInsert();\r
121 }else{\r
122         $dbw->printError();\r
123 }\r
124 ?>\r