2017年12月19日
Home > テクノロジー > Pear File_IMC で簡単スケジュールリマインダー
Pear File_IMC で簡単スケジュールリマインダー
By: photosteve101

Pear File_IMC で簡単スケジュールリマインダー


ここでは、 vCalendar のパースができる Pear File_IMC パッケージを使って、 iCalendar 形式のファイルを解析し、メールでスケジュールを送信する簡易リマインダーの実装について説明します。

File_IMC をインストールする

File_IMC は pear コマンドを使って次のようにインストールすることができます。本稿執筆時点での最新版は 0.5.0 (beta) となっています。

[user@localhost ~]$ sudo pear install File_IMC-0.5.0
downloading File_IMC-0.5.0.tgz ...
Starting to download File_IMC-0.5.0.tgz (32,082 bytes)
......done: 32,082 bytes
install ok: channel://pear.php.net/File_IMC-0.5.0

iCalendar ファイルのパース

まずは、 File_IMC でどんなことができるのか、簡単なプログラムで確認してみましょう。

以下のプログラムを ical.php として用意します。$calendar_file には、パースする iCalendar ファイルのパスを指定します。

<?php

require_once("File/IMC.php");

$calendar_file = '/path/to/schedule.ics';

$parse = File_IMC::parse('vCalendar');
$parse->fromFile($calendar_file);

$events = $parse->getEvents();

while ($events->valid()) {

        $summary = $events->current()->getSummary();
        $start = $events->current()->getStart();

        echo date("Y-m-d H:i:s", strtotime($start)) . " ... " . $summary ."\n";

        $events->next();
}

?>

ical.php を実行してみましょう。次のような結果になるはずです。

[user@localhost ~]$ php -f ical.php
2012-10-30 17:15:00 ... 会議(会議室102)
2009-07-03 00:00:00 ... 燃えないごみの日
2008-03-21 11:40:00 ... ランチミーティング
2011-05-13 20:00:00 ... 飲み会
2013-10-26 16:00:00 ... 結婚式
[snip]

今日の予定をメールで通知する

ical.php では、ファイルの中にあるすべてのイベントについて上から順番に解析して表示しているので、必ずしも日付順で出力されるわけではありませんし、予定がたくさんある場合はすべての予定が表示されてしまうので、リマインダーとしてはいまいちです。そこで、今日の予定だけを抽出・ソートしてメールで送信するように修正してみましょう。

以下のプログラムを reminder.php として用意します。

<?php

require_once("File/IMC.php");

$calendar_file = '/path/to/schedule.ics';

$parse = File_IMC::parse('vCalendar');
$parse->fromFile($calendar_file);

$events = $parse->getEvents();

$data = array();

while ($events->valid()) {

        $summary = $events->current()->getSummary();
        $start = $events->current()->getStart();

        if (date("Y-m-d", strtotime($start)) == date("Y-m-d")) {
                array_push($data, array('START'=>date("H:i", strtotime($start)), 'SUMMARY'=>$summary));
        }

        $events->next();
}

if (!empty($data)) {

        // 日付順にソート
        $tmp = array();
        foreach ($data as $value) $tmp[] = $value['START'];
        array_multisort($tmp, SORT_ASC, $data);

        $body = '';
        foreach ($data as $value ) {
                $body .= $value['START'] . " " . $value['SUMMARY'] . "\n";
        }

        $mailto = "to@example.jp"; // 宛先
        $subject = "今日の予定"; // メールの件名
        $header = "From: from@example.jp"; // 送信元

        // メールを送信する
        mb_send_mail ($mailto, $subject, $body, $header);

}

?>

reminder.php を実行すると、「今日の予定」という件名のメールが届くはずです。複数の予定があってもきちんと時刻順にソートされます。予定がない場合は、そこでプログラムが終了するので、空のメールが届くことはありません。

自動的に定時実行する

reminder.php を crontab に登録して、毎日実行するようにしてみましょう。以下は、毎朝 6:30 に実行するための設定例です。

[user@localhost ~]$ crontab -l
30 6 * * * /usr/bin/php -f /path/to/reminder.php > /dev/null 2>&1
山田 祥寛(翔泳社)
¥ 3,024
-(-)
-

コメントをどうぞ

メールアドレスが公開されることはありません。* が付いている欄は必須項目です。 *

*