UI設計したり、ウェブシステムを開発したりします。 

SQL見るだけクエリ#108 CRONを使用して活動レポートを自動的に毎週メール送信する

記入日:2023-04-26 編集日:2023-04-26

CRONを使用して活動レポートを自動的に毎週メール送信する方法を解説してみようと思います。

この記事を読むと(約5分)
CRONを使用して活動レポートを自動的に毎週メール送信する方法がイメージできます。

CRONを使用して自動的に処理する

ユーザーの活動レポートを自動的に作成するプログラムの例を示します。このプログラムは、CRONを使用して毎週日曜日の午前3時に実行され、直近1週間のデータを集計してレポートを作成し、メールで送信します。

まず、MySQLデータベースに保存されているユーザーアクティビティデータを取得するために、以下のようなSQLクエリを使用します。

SELECT COUNT(*) AS total_actions, user_id FROM user_activity 
WHERE timestamp >= DATE_SUB(NOW(), INTERVAL 1 WEEK) 
GROUP BY user_id 
ORDER BY total_actions DESC;

このクエリは、直近1週間のユーザーアクティビティデータを取得し、ユーザーごとにアクションの総数をカウントして、アクションの多い順にソートします。

次に、PHPスクリプトを使用して、SQLクエリを実行し、データを集計してレポートを生成します。以下は、そのスクリプトの例です。

// MySQL接続情報を設定
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database";

// PDOを使用してMySQLに接続
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // エラーを例外として投げるように設定
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo "MySQL接続エラー: " . $e->getMessage();
    exit;
}

// クエリを実行
$sql = "SELECT COUNT(*) AS total_actions, user_id FROM user_activity 
        WHERE timestamp >= DATE_SUB(NOW(), INTERVAL 1 WEEK) 
        GROUP BY user_id 
        ORDER BY total_actions DESC;";
$stmt = $conn->prepare($sql);
$stmt->execute();

// データを集計
$data = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $user_id = $row["user_id"];
    $total_actions = $row["total_actions"];
    $data[$user_id] = $total_actions;
}

// レポートを作成
$body = "直近1週間のユーザーアクティビティレポート\n\n";
$body .= "ユーザーID\tアクション数\n";
$body .= "--------------------------\n";
foreach ($data as $user_id => $total_actions) {
    $body .= $user_id . "\t" . $total_actions . "\n";
}

// メールを送信
$to = "admin@example.com";
$subject = "直近1週間のユーザーアクティビティレポート";
$headers = "From: noreply@example.com\r\n";
mail($to, $subject, $body, $headers);

このスクリプトは、MySQLに接続してクエリを実行し、データを集計します。そして、レポートの本文を作成し、メールを送信します。

最後に、このスクリプトをCRONに設定して、毎週日曜日の午前3時に実行します。以下は、CRONの設定例です。

0 3 * * 0 /usr/bin/php /path/to/activity_report.php

この設定は、毎週日曜日の午前3時に、/path/to/activity_report.phpスクリプトを実行するようにCRONに指示します。

また、上記のスクリプトでは、PHPのmail関数を使用してメールを送信していますが、必要に応じてSMTPサーバーを使用することもできます。その場合は、PHPのmail関数の代わりに、SMTPクライアントライブラリを使用してメールを送信する必要があります。

CRONの設定

CRONの設定は、基本的に以下のような形式で指定します。

* * * * * command

これは、「分 時 日 月 曜日 コマンド」という意味になります。各フィールドに指定できる値の範囲は以下の通りです。

分 (0-59)
時 (0-23)
日 (1-31)
月 (1-12)
曜日 (0-6, 0が日曜日を表す)

ワイルドカード記号 () を使用することで、全ての値を指定できます。例えば、「 * * * *」は毎分実行されることを意味します。

特定の値を指定する場合は、単純に数字を使用します。例えば、「0 3 * * 0」は、毎週日曜日の午前3時に実行されることを意味します。

値の範囲を指定する場合は、ハイフン (-) を使用します。例えば、「0 9-17 * * 1-5」は、平日の午前9時から午後5時まで、毎時実行されることを意味します。

値のリストを指定する場合は、カンマ (,) を使用します。例えば、「0 0,12 * * *」は、毎日の正午と真夜中に実行されることを意味します。

特定の日付や曜日を指定する場合は、英語の省略形を使用します。例えば、「0 0 * * sat」は、毎週土曜日の真夜中に実行されることを意味します。

SQLの使いどころ

サイトに大量の情報を掲載することは、ユーザーにとってとても便利なことです。しかし、情報が多すぎると、目的の情報を見つけるのが困難になります。そのため、SQLを使用することで、情報を効率的に管理することができます。

SQLを使用することで、データベース内の情報を検索したり、フィルタリングしたりすることができます。これにより、ユーザーは目的の情報をスムーズかつ簡単に見つけることができます。

また、SQLを使用することで、データを集計したり、統合したりすることもできます。これにより、ユーザーはさまざまな視点から情報を分析することができます。つまり、サイトに多くの情報を掲載することが重要である一方で、その情報を効率的かつ簡単に管理することが求められる場合には、SQLが不可欠であるといえます。

KK

機械工学を専攻。工業デザイナーとして、国内及び海外の自動車・搬送ラインの設計などに従事した後、2003年にウェブシステム会社を設立。UI設計やウェブシステムの開発、DX化のディレクションなどを行っています。