- Tất cả SMS/email gởi đến đều được lưu vào CSDL trên RPi
- Định kỳ kết nối CSDL để đọc SMS/Email mới. Nếu có, phân tích nội dung để tìm mã học sinh, sau đó tìm dữ liệu điểm và trả lời.
A. gammu-smsd tự động ghi tin nhắn vào CSDL nên ta chỉ còn phải tạo script ghi email vào CSDL.
File PHP có nội dung tương tự như sau, được cài đặt để mailgun.com gọi mỗi khi có email đến
<?php /** * @author Ly Anh Tuan <lnt@ly-le.info> * @copyright 2014 */ require('consts.php'); class inbox extends consts { static public function save_mail(){ $dsn = 'mysql:dbname=mail;host=localhost'; $dbh = new PDO($dsn, self::MY_USR, self::MY_PWD); $dbh->exec("SET NAMES 'utf8'"); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try{ $sql="INSERT INTO inbox (ReceivedTime, Sender, PlainText) VALUES ('" . $_POST['timestamp'] . "','" . $_POST['from'] . "','" . addslashes($_POST['subject'] . "\n" . $_POST['body-plain']) . "')"; $dbh->exec($sql); }catch (PDOException $e){ echo $e->getMessage(); exit(); } } } //$time = -microtime(true); inbox::save_mail(); //$time += microtime(true); //echo $time; ?>
B. Định kỳ kết nối CSDL để đọc SMS/Email mới bằng cách dùng crontab
*/2 * * * * /usr/bin/php /usr/share/nginx/www/baodiem.php 1 1-59/2 * * * * /usr/bin/php /usr/share/nginx/www/baodiem.php 0
C. Phân tích nội dung SMS/Email để tìm mã học sinh như sau
$pMHS = '/\b(?:' . self::MATRUONG . '|MHS|ID)\s*(\d{2,4})\b/im';
if (preg_match($pMHS, $content, $MHS)){
$MHS = self::MATRUONG . str_pad($MHS[1], 4, '0', STR_PAD_RIGHT
);
...
D. Xây dựng nội dung trả lời theo MHS
$stm = $dbh->prepare(self::QRY_NAME); $stm->execute(array(':HocSinhID' => "$MHS")); $row = $stm -> fetch(); if ($row){ $body = $MHS . '<br />' . $row[0] . ("{$row[1]}" ? " {$row[1]}" : '') . ("{$row[2]}" ? " {$row[2]}" : '') . '<br /><br />'; $stm = $dbh->prepare(self::QRY_SCOR); $stm->execute(array(':NamHocID' => $NamHocID, ':HocKyID' => $HocKyID, ':HocSinhID' => $MHS)); $score = $stm->fetchAll(); $body .= "Học kỳ $HocKyID /" . $NamHocID . '-' . ($NamHocID+1) . '<br /><br />'; foreach ($score as $sc){ $body .= '<span style="display:inline-block; width:100px">' . $sc[1] . '</span><span style="color:' . ($sc[2]<5?'red':'blue') . '">' . $sc[2] . '</span><br />'; } if (!$sc){ $body .= 'Không có điểm của Học kỳ này!'; } }else{ $body = "Không có Mã Học sinh này $MHS"; }
E. Gởi SMS/Email trả lời
if (strpos($from, '@')===false){ //send SMS $body = strip_tags(str_replace('<br />', "\n", self::stripAcc($body))); exec("gammu-smsd-inject TEXT $from -text \"$body\""); }else{ //send mail self::sendMail($from, 'Báo điểm', $body); }