Báo điểm tự động
Bài 4: Đọc SMS/Email và báo điểm

Screenshot-2014-11-08-12.29.21

  1. Tất cả SMS/email gởi đến đều được lưu vào CSDL trên RPi
  2. Đị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);
}

 

Leave a Comment

Filed under Software

Leave a Reply